diff options
| author | Gaurav Sinha <gaurav.sinha@vyatta.com> | 2012-01-12 14:45:24 -0800 | 
|---|---|---|
| committer | Gaurav Sinha <gaurav.sinha@vyatta.com> | 2012-01-12 14:45:24 -0800 | 
| commit | ca37a710d526d17490ebdc3af760bfddd316426d (patch) | |
| tree | caeb883cf2302d30e010909bc543b09e191472cb /src | |
| parent | c4414d9a8b31bedfb7471cd2365aaf5ea5cf55d5 (diff) | |
| parent | 414fedd879fdc3cd0a910acd2fd9262251a6bfe7 (diff) | |
| download | conntrack-tools-ca37a710d526d17490ebdc3af760bfddd316426d.tar.gz conntrack-tools-ca37a710d526d17490ebdc3af760bfddd316426d.zip  | |
Updating upstream with merged content from netfilter conntrack-tools version 1.0.1
Diffstat (limited to 'src')
| -rw-r--r-- | src/.gitignore | 6 | ||||
| -rw-r--r-- | src/Makefile.am | 11 | ||||
| -rw-r--r-- | src/Makefile.in | 134 | ||||
| -rw-r--r-- | src/build.c | 194 | ||||
| -rw-r--r-- | src/cache-ct.c | 356 | ||||
| -rw-r--r-- | src/cache-exp.c | 308 | ||||
| -rw-r--r-- | src/cache.c | 163 | ||||
| -rw-r--r-- | src/conntrack.c | 897 | ||||
| -rw-r--r-- | src/external_cache.c | 130 | ||||
| -rw-r--r-- | src/external_inject.c | 134 | ||||
| -rw-r--r-- | src/filter.c | 98 | ||||
| -rw-r--r-- | src/internal_bypass.c | 222 | ||||
| -rw-r--r-- | src/internal_cache.c | 287 | ||||
| -rw-r--r-- | src/lock.c | 0 | ||||
| -rw-r--r-- | src/log.c | 37 | ||||
| -rw-r--r-- | src/main.c | 81 | ||||
| -rw-r--r-- | src/netlink.c | 167 | ||||
| -rw-r--r-- | src/network.c | 24 | ||||
| -rw-r--r-- | src/parse.c | 293 | ||||
| -rw-r--r-- | src/read_config_lex.c | 7327 | ||||
| -rw-r--r-- | src/read_config_lex.l | 5 | ||||
| -rw-r--r-- | src/read_config_yy.c | 1238 | ||||
| -rw-r--r-- | src/read_config_yy.h | 28 | ||||
| -rw-r--r-- | src/read_config_yy.y | 106 | ||||
| -rw-r--r-- | src/run.c | 449 | ||||
| -rw-r--r-- | src/stats-mode.c | 50 | ||||
| -rw-r--r-- | src/sync-alarm.c | 22 | ||||
| -rw-r--r-- | src/sync-ftfw.c | 49 | ||||
| -rw-r--r-- | src/sync-mode.c | 271 | ||||
| -rw-r--r-- | src/sync-notrack.c | 47 | 
30 files changed, 7977 insertions, 5157 deletions
diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..6e6763d --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,6 @@ +/conntrack +/conntrackd + +/read_config_lex.c +/read_config_yy.c +/read_config_yy.h diff --git a/src/Makefile.am b/src/Makefile.am index 76f0e73..7d7b2ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,19 +1,18 @@  include $(top_srcdir)/Make_global.am -YACC=@YACC@ -d +AM_YFLAGS = -d  CLEANFILES = read_config_yy.c read_config_lex.c  sbin_PROGRAMS = conntrack conntrackd  conntrack_SOURCES = conntrack.c -conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la -conntrack_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la ${LIBNETFILTER_CONNTRACK_LIBS}  conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \  		    local.c log.c mcast.c udp.c netlink.c vector.c \  		    filter.c fds.c event.c process.c origin.c date.c \ -		    cache.c cache_iterators.c \ +		    cache.c cache-ct.c cache-exp.c \  		    cache_timer.c \  		    sync-mode.c sync-alarm.c sync-ftfw.c sync-notrack.c \  		    traffic_stats.c stats-mode.c \ @@ -22,12 +21,12 @@ conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \  		    channel.c multichannel.c channel_mcast.c channel_udp.c \  		    tcp.c channel_tcp.c \  		    external_cache.c external_inject.c \ -		    internal_cache.c internal_bypass.c \  +		    internal_cache.c internal_bypass.c \  		    read_config_yy.y read_config_lex.l  # yacc and lex generate dirty code  read_config_yy.o read_config_lex.o: AM_CFLAGS += -Wno-missing-prototypes -Wno-missing-declarations -Wno-implicit-function-declaration -Wno-nested-externs -Wno-undef -Wno-redundant-decls -conntrackd_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrackd_LDADD = ${LIBNETFILTER_CONNTRACK_LIBS}  EXTRA_DIST = read_config_yy.h diff --git a/src/Makefile.in b/src/Makefile.in index 94c36c3..571a811 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am.  # @configure_input@  # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -34,17 +34,16 @@ PRE_UNINSTALL = :  POST_UNINSTALL = :  build_triplet = @build@  host_triplet = @host@ -target_triplet = @target@  DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \  	$(top_srcdir)/Make_global.am read_config_lex.c \ -	read_config_yy.c +	read_config_yy.c read_config_yy.h  sbin_PROGRAMS = conntrack$(EXEEXT) conntrackd$(EXEEXT)  subdir = src  ACLOCAL_M4 = $(top_srcdir)/aclocal.m4  am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \  	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \  	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ -	$(top_srcdir)/configure.in +	$(top_srcdir)/configure.ac  am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \  	$(ACLOCAL_M4)  mkinstalldirs = $(install_sh) -d @@ -54,6 +53,7 @@ am__installdirs = "$(DESTDIR)$(sbindir)"  PROGRAMS = $(sbin_PROGRAMS)  am_conntrack_OBJECTS = conntrack.$(OBJEXT)  conntrack_OBJECTS = $(am_conntrack_OBJECTS) +am__DEPENDENCIES_1 =  conntrack_DEPENDENCIES = ../extensions/libct_proto_tcp.la \  	../extensions/libct_proto_udp.la \  	../extensions/libct_proto_udplite.la \ @@ -62,17 +62,17 @@ conntrack_DEPENDENCIES = ../extensions/libct_proto_tcp.la \  	../extensions/libct_proto_sctp.la \  	../extensions/libct_proto_dccp.la \  	../extensions/libct_proto_gre.la \ -	../extensions/libct_proto_unknown.la -conntrack_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ -	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -	$(conntrack_LDFLAGS) $(LDFLAGS) -o $@ +	../extensions/libct_proto_unknown.la $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent  am_conntrackd_OBJECTS = alarm.$(OBJEXT) main.$(OBJEXT) run.$(OBJEXT) \  	hash.$(OBJEXT) queue.$(OBJEXT) rbtree.$(OBJEXT) \  	local.$(OBJEXT) log.$(OBJEXT) mcast.$(OBJEXT) udp.$(OBJEXT) \  	netlink.$(OBJEXT) vector.$(OBJEXT) filter.$(OBJEXT) \  	fds.$(OBJEXT) event.$(OBJEXT) process.$(OBJEXT) \  	origin.$(OBJEXT) date.$(OBJEXT) cache.$(OBJEXT) \ -	cache_iterators.$(OBJEXT) cache_timer.$(OBJEXT) \ +	cache-ct.$(OBJEXT) cache-exp.$(OBJEXT) cache_timer.$(OBJEXT) \  	sync-mode.$(OBJEXT) sync-alarm.$(OBJEXT) sync-ftfw.$(OBJEXT) \  	sync-notrack.$(OBJEXT) traffic_stats.$(OBJEXT) \  	stats-mode.$(OBJEXT) network.$(OBJEXT) cidr.$(OBJEXT) \ @@ -83,30 +83,46 @@ am_conntrackd_OBJECTS = alarm.$(OBJEXT) main.$(OBJEXT) run.$(OBJEXT) \  	internal_cache.$(OBJEXT) internal_bypass.$(OBJEXT) \  	read_config_yy.$(OBJEXT) read_config_lex.$(OBJEXT)  conntrackd_OBJECTS = $(am_conntrackd_OBJECTS) -conntrackd_LDADD = $(LDADD) -conntrackd_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ -	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ -	$(conntrackd_LDFLAGS) $(LDFLAGS) -o $@ +conntrackd_DEPENDENCIES = $(am__DEPENDENCIES_1)  DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp  am__depfiles_maybe = depfiles  am__mv = mv -f  COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \  	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ -	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ -	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ +	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +	$(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo "  CC    " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @  CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ -	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ -	$(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +	$(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo "  CCLD  " $@;  LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ -	--mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) -YLWRAP = $(top_srcdir)/ylwrap +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +AM_V_LEX = $(am__v_LEX_$(V)) +am__v_LEX_ = $(am__v_LEX_$(AM_DEFAULT_VERBOSITY)) +am__v_LEX_0 = @echo "  LEX   " $@; +YLWRAP = $(top_srcdir)/build-aux/ylwrap  YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ -	--mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +AM_V_YACC = $(am__v_YACC_$(V)) +am__v_YACC_ = $(am__v_YACC_$(AM_DEFAULT_VERBOSITY)) +am__v_YACC_0 = @echo "  YACC  " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo "  GEN   " $@;  SOURCES = $(conntrack_SOURCES) $(conntrackd_SOURCES)  DIST_SOURCES = $(conntrack_SOURCES) $(conntrackd_SOURCES)  ETAGS = etags @@ -114,6 +130,7 @@ CTAGS = ctags  DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)  ACLOCAL = @ACLOCAL@  AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@  AR = @AR@  AUTOCONF = @AUTOCONF@  AUTOHEADER = @AUTOHEADER@ @@ -136,7 +153,6 @@ EGREP = @EGREP@  EXEEXT = @EXEEXT@  FGREP = @FGREP@  GREP = @GREP@ -HAVE_PKG_CONFIG = @HAVE_PKG_CONFIG@  INSTALL = @INSTALL@  INSTALL_DATA = @INSTALL_DATA@  INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -174,15 +190,15 @@ PACKAGE_URL = @PACKAGE_URL@  PACKAGE_VERSION = @PACKAGE_VERSION@  PATH_SEPARATOR = @PATH_SEPARATOR@  PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@  RANLIB = @RANLIB@  SED = @SED@  SET_MAKE = @SET_MAKE@  SHELL = @SHELL@  STRIP = @STRIP@  VERSION = @VERSION@ -XLEX = @XLEX@ -XYACC = @XYACC@ -YACC = @YACC@ -d +YACC = @YACC@  YFLAGS = @YFLAGS@  abs_builddir = @abs_builddir@  abs_srcdir = @abs_srcdir@ @@ -232,27 +248,24 @@ sbindir = @sbindir@  sharedstatedir = @sharedstatedir@  srcdir = @srcdir@  sysconfdir = @sysconfdir@ -target = @target@  target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@  top_build_prefix = @top_build_prefix@  top_builddir = @top_builddir@  top_srcdir = @top_srcdir@ -AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include  AM_CFLAGS = -std=gnu99 -W -Wall \  	-Wmissing-prototypes -Wwrite-strings -Wcast-qual -Wfloat-equal -Wshadow -Wpointer-arith -Wbad-function-cast -Wsign-compare -Waggregate-return -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wundef \ -	-Wno-unused-parameter +	-Wno-unused-parameter ${LIBNFNETLINK_CFLAGS} \ +	${LIBNETFILTER_CONNTRACK_CFLAGS} +AM_YFLAGS = -d  CLEANFILES = read_config_yy.c read_config_lex.c  conntrack_SOURCES = conntrack.c -conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la -conntrack_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la ${LIBNETFILTER_CONNTRACK_LIBS}  conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \  		    local.c log.c mcast.c udp.c netlink.c vector.c \  		    filter.c fds.c event.c process.c origin.c date.c \ -		    cache.c cache_iterators.c \ +		    cache.c cache-ct.c cache-exp.c \  		    cache_timer.c \  		    sync-mode.c sync-alarm.c sync-ftfw.c sync-notrack.c \  		    traffic_stats.c stats-mode.c \ @@ -264,7 +277,7 @@ conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \  		    internal_cache.c internal_bypass.c \  		    read_config_yy.y read_config_lex.l -conntrackd_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrackd_LDADD = ${LIBNETFILTER_CONNTRACK_LIBS}  EXTRA_DIST = read_config_yy.h  all: all-am @@ -279,9 +292,9 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Make_global.am $(am_  	      exit 1;; \  	  esac; \  	done; \ -	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \  	$(am__cd) $(top_srcdir) && \ -	  $(AUTOMAKE) --gnu src/Makefile +	  $(AUTOMAKE) --foreign src/Makefile  .PRECIOUS: Makefile  Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status  	@case '$?' in \ @@ -345,10 +358,15 @@ clean-sbinPROGRAMS:  	rm -f $$list  conntrack$(EXEEXT): $(conntrack_OBJECTS) $(conntrack_DEPENDENCIES)   	@rm -f conntrack$(EXEEXT) -	$(conntrack_LINK) $(conntrack_OBJECTS) $(conntrack_LDADD) $(LIBS) +	$(AM_V_CCLD)$(LINK) $(conntrack_OBJECTS) $(conntrack_LDADD) $(LIBS) +read_config_yy.h: read_config_yy.c +	@if test ! -f $@; then \ +	  rm -f read_config_yy.c; \ +	  $(MAKE) $(AM_MAKEFLAGS) read_config_yy.c; \ +	else :; fi  conntrackd$(EXEEXT): $(conntrackd_OBJECTS) $(conntrackd_DEPENDENCIES)   	@rm -f conntrackd$(EXEEXT) -	$(conntrackd_LINK) $(conntrackd_OBJECTS) $(conntrackd_LDADD) $(LIBS) +	$(AM_V_CCLD)$(LINK) $(conntrackd_OBJECTS) $(conntrackd_LDADD) $(LIBS)  mostlyclean-compile:  	-rm -f *.$(OBJEXT) @@ -358,8 +376,9 @@ distclean-compile:  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alarm.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache-ct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache-exp.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_iterators.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_timer.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel_mcast.Po@am__quote@ @@ -402,31 +421,37 @@ distclean-compile:  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@  .c.o: -@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@	$(COMPILE) -c $< +@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ $<  .c.obj: -@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`  .c.lo: -@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@  @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<  .l.c: -	$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) +	$(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)  .y.c: -	$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) +	$(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)  mostlyclean-libtool:  	-rm -f *.lo @@ -551,6 +576,7 @@ maintainer-clean-generic:  	@echo "it deletes files that may require special tools to rebuild."  	-rm -f read_config_lex.c  	-rm -f read_config_yy.c +	-rm -f read_config_yy.h  clean: clean-am  clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ diff --git a/src/build.c b/src/build.c index 6d8b12e..3193884 100644 --- a/src/build.c +++ b/src/build.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2008 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -42,14 +43,14 @@ addattr(struct nethdr *n, int attr, const void *data, size_t len)  }  static inline void -__build_u8(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u8(const struct nf_conntrack *ct, int a, struct nethdr *n, int b)  {  	void *ptr = put_header(n, b, sizeof(uint8_t));  	memcpy(ptr, nfct_get_attr(ct, a), sizeof(uint8_t));  }  static inline void  -__build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b)  {  	uint16_t data = nfct_get_attr_u16(ct, a);  	data = htons(data); @@ -57,7 +58,7 @@ __build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b)  }  static inline void  -__build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b)  {  	uint32_t data = nfct_get_attr_u32(ct, a);  	data = htonl(data); @@ -65,7 +66,7 @@ __build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b)  }  static inline void  -__build_group(const struct nf_conntrack *ct, int a, struct nethdr *n,  +ct_build_group(const struct nf_conntrack *ct, int a, struct nethdr *n,   	      int b, int size)  {  	void *ptr = put_header(n, b, size); @@ -73,7 +74,7 @@ __build_group(const struct nf_conntrack *ct, int a, struct nethdr *n,  }  static inline void  -__build_natseqadj(const struct nf_conntrack *ct, struct nethdr *n) +ct_build_natseqadj(const struct nf_conntrack *ct, struct nethdr *n)  {  	struct nta_attr_natseqadj data = {  		.orig_seq_correction_pos = @@ -99,36 +100,55 @@ static enum nf_conntrack_attr nat_type[] =  static void build_l4proto_tcp(const struct nf_conntrack *ct, struct nethdr *n)  { +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, +		      sizeof(struct nfct_attr_grp_port)); +  	if (!nfct_attr_is_set(ct, ATTR_TCP_STATE))  		return; -	__build_u8(ct, ATTR_TCP_STATE, n, NTA_TCP_STATE); +	ct_build_u8(ct, ATTR_TCP_STATE, n, NTA_TCP_STATE); +	if (CONFIG(sync).tcp_window_tracking) { +		ct_build_u8(ct, ATTR_TCP_WSCALE_ORIG, n, NTA_TCP_WSCALE_ORIG); +		ct_build_u8(ct, ATTR_TCP_WSCALE_REPL, n, NTA_TCP_WSCALE_REPL); +	}  }  static void build_l4proto_sctp(const struct nf_conntrack *ct, struct nethdr *n)  { +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, +		      sizeof(struct nfct_attr_grp_port)); +  	if (!nfct_attr_is_set(ct, ATTR_SCTP_STATE))  		return; -	__build_u8(ct, ATTR_SCTP_STATE, n, NTA_SCTP_STATE); -	__build_u32(ct, ATTR_SCTP_VTAG_ORIG, n, NTA_SCTP_VTAG_ORIG); -	__build_u32(ct, ATTR_SCTP_VTAG_REPL, n, NTA_SCTP_VTAG_REPL); +	ct_build_u8(ct, ATTR_SCTP_STATE, n, NTA_SCTP_STATE); +	ct_build_u32(ct, ATTR_SCTP_VTAG_ORIG, n, NTA_SCTP_VTAG_ORIG); +	ct_build_u32(ct, ATTR_SCTP_VTAG_REPL, n, NTA_SCTP_VTAG_REPL);  }  static void build_l4proto_dccp(const struct nf_conntrack *ct, struct nethdr *n)  { +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, +		      sizeof(struct nfct_attr_grp_port)); +  	if (!nfct_attr_is_set(ct, ATTR_DCCP_STATE))  		return; -	__build_u8(ct, ATTR_DCCP_STATE, n, NTA_DCCP_STATE); -	__build_u8(ct, ATTR_DCCP_ROLE, n, NTA_DCCP_ROLE); +	ct_build_u8(ct, ATTR_DCCP_STATE, n, NTA_DCCP_STATE); +	ct_build_u8(ct, ATTR_DCCP_ROLE, n, NTA_DCCP_ROLE);  }  static void build_l4proto_icmp(const struct nf_conntrack *ct, struct nethdr *n)  { -	__build_u8(ct, ATTR_ICMP_TYPE, n, NTA_ICMP_TYPE); -	__build_u8(ct, ATTR_ICMP_CODE, n, NTA_ICMP_CODE); -	__build_u16(ct, ATTR_ICMP_ID, n, NTA_ICMP_ID); +	ct_build_u8(ct, ATTR_ICMP_TYPE, n, NTA_ICMP_TYPE); +	ct_build_u8(ct, ATTR_ICMP_CODE, n, NTA_ICMP_CODE); +	ct_build_u16(ct, ATTR_ICMP_ID, n, NTA_ICMP_ID); +} + +static void build_l4proto_udp(const struct nf_conntrack *ct, struct nethdr *n) +{ +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, +		      sizeof(struct nfct_attr_grp_port));  }  #ifndef IPPROTO_DCCP @@ -142,52 +162,49 @@ static struct build_l4proto {  	[IPPROTO_SCTP]		= { .build = build_l4proto_sctp },  	[IPPROTO_DCCP]		= { .build = build_l4proto_dccp },  	[IPPROTO_ICMP]		= { .build = build_l4proto_icmp }, +	[IPPROTO_ICMPV6]	= { .build = build_l4proto_icmp }, +	[IPPROTO_UDP]		= { .build = build_l4proto_udp },  }; -void build_payload(const struct nf_conntrack *ct, struct nethdr *n) +void ct2msg(const struct nf_conntrack *ct, struct nethdr *n)  {  	uint8_t l4proto = nfct_get_attr_u8(ct, ATTR_L4PROTO);  	if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { -		__build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_IPV4,  +		ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_IPV4,   			      sizeof(struct nfct_attr_grp_ipv4));  	} else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { -		__build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_IPV6,  +		ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_IPV6,   			      sizeof(struct nfct_attr_grp_ipv6));  	} -	__build_u8(ct, ATTR_L4PROTO, n, NTA_L4PROTO); -	if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_PORT)) { -		__build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, -			      sizeof(struct nfct_attr_grp_port)); -	} - -	__build_u32(ct, ATTR_STATUS, n, NTA_STATUS);  +	ct_build_u32(ct, ATTR_STATUS, n, NTA_STATUS);  +	ct_build_u8(ct, ATTR_L4PROTO, n, NTA_L4PROTO);  	if (l4proto_fcn[l4proto].build)  		l4proto_fcn[l4proto].build(ct, n);  	if (!CONFIG(commit_timeout) && nfct_attr_is_set(ct, ATTR_TIMEOUT)) -		__build_u32(ct, ATTR_TIMEOUT, n, NTA_TIMEOUT); +		ct_build_u32(ct, ATTR_TIMEOUT, n, NTA_TIMEOUT);  	if (nfct_attr_is_set(ct, ATTR_MARK)) -		__build_u32(ct, ATTR_MARK, n, NTA_MARK); +		ct_build_u32(ct, ATTR_MARK, n, NTA_MARK);  	/* setup the master conntrack */  	if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_IPV4)) { -		__build_group(ct, ATTR_GRP_MASTER_IPV4, n, NTA_MASTER_IPV4, +		ct_build_group(ct, ATTR_GRP_MASTER_IPV4, n, NTA_MASTER_IPV4,  			      sizeof(struct nfct_attr_grp_ipv4)); -		__build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); +		ct_build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO);  		if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_PORT)) { -			__build_group(ct, ATTR_GRP_MASTER_PORT, +			ct_build_group(ct, ATTR_GRP_MASTER_PORT,  				      n, NTA_MASTER_PORT,   				      sizeof(struct nfct_attr_grp_port));  		}  	} else if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_IPV6)) { -		__build_group(ct, ATTR_GRP_MASTER_IPV6, n, NTA_MASTER_IPV6, +		ct_build_group(ct, ATTR_GRP_MASTER_IPV6, n, NTA_MASTER_IPV6,  			      sizeof(struct nfct_attr_grp_ipv6)); -		__build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); +		ct_build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO);  		if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_PORT)) { -			__build_group(ct, ATTR_GRP_MASTER_PORT, +			ct_build_group(ct, ATTR_GRP_MASTER_PORT,  				      n, NTA_MASTER_PORT,  				      sizeof(struct nfct_attr_grp_port));  		} @@ -195,15 +212,114 @@ void build_payload(const struct nf_conntrack *ct, struct nethdr *n)  	/*  NAT */  	if (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT)) -		__build_u32(ct, ATTR_REPL_IPV4_DST, n, NTA_SNAT_IPV4); +		ct_build_u32(ct, ATTR_REPL_IPV4_DST, n, NTA_SNAT_IPV4);  	if (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT)) -		__build_u32(ct, ATTR_REPL_IPV4_SRC, n, NTA_DNAT_IPV4); +		ct_build_u32(ct, ATTR_REPL_IPV4_SRC, n, NTA_DNAT_IPV4);  	if (nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT)) -		__build_u16(ct, ATTR_REPL_PORT_DST, n, NTA_SPAT_PORT); +		ct_build_u16(ct, ATTR_REPL_PORT_DST, n, NTA_SPAT_PORT);  	if (nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT)) -		__build_u16(ct, ATTR_REPL_PORT_SRC, n, NTA_DPAT_PORT); +		ct_build_u16(ct, ATTR_REPL_PORT_SRC, n, NTA_DPAT_PORT);  	/* NAT sequence adjustment */  	if (nfct_attr_is_set_array(ct, nat_type, 6)) -		__build_natseqadj(ct, n); +		ct_build_natseqadj(ct, n); +} + +static void +exp_build_l4proto_tcp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, +			sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_sctp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, +			sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_dccp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, +		      sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_udp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ +	ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, +		      sizeof(struct nfct_attr_grp_port)); +} + +static struct exp_build_l4proto { +	void (*build)(const struct nf_conntrack *, struct nethdr *n, int a); +} exp_l4proto_fcn[IPPROTO_MAX] = { +	[IPPROTO_TCP]		= { .build = exp_build_l4proto_tcp }, +	[IPPROTO_SCTP]		= { .build = exp_build_l4proto_sctp }, +	[IPPROTO_DCCP]		= { .build = exp_build_l4proto_dccp }, +	[IPPROTO_UDP]		= { .build = exp_build_l4proto_udp }, +}; + +static inline void +exp_build_u32(const struct nf_expect *exp, int a, struct nethdr *n, int b) +{ +	uint32_t data = nfexp_get_attr_u32(exp, a); +	data = htonl(data); +	addattr(n, b, &data, sizeof(uint32_t)); +} + +void exp2msg(const struct nf_expect *exp, struct nethdr *n) +{ +	const struct nf_conntrack *ct = nfexp_get_attr(exp, ATTR_EXP_MASTER); +	uint8_t l4proto = nfct_get_attr_u8(ct, ATTR_L4PROTO); + +	/* master conntrack for this expectation. */ +	if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_MASTER_IPV4, +			      sizeof(struct nfct_attr_grp_ipv4)); +	} else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_MASTER_IPV6, +			      sizeof(struct nfct_attr_grp_ipv6)); +	} +	ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_MASTER_L4PROTO); + +	if (exp_l4proto_fcn[l4proto].build) +		exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_MASTER_PORT); + +	/* the expectation itself. */ +	ct = nfexp_get_attr(exp, ATTR_EXP_EXPECTED); + +	if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_EXPECT_IPV4, +			      sizeof(struct nfct_attr_grp_ipv4)); +	} else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_EXPECT_IPV6, +			      sizeof(struct nfct_attr_grp_ipv6)); +	} +	ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_EXPECT_L4PROTO); + +	if (exp_l4proto_fcn[l4proto].build) +		exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_EXPECT_PORT); + +	/* mask for the expectation. */ +	ct = nfexp_get_attr(exp, ATTR_EXP_MASK); + +	if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_MASK_IPV4, +			      sizeof(struct nfct_attr_grp_ipv4)); +	} else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { +		ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_MASK_IPV6, +			      sizeof(struct nfct_attr_grp_ipv6)); +	} +	ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_MASK_L4PROTO); + +	if (exp_l4proto_fcn[l4proto].build) +		exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_MASK_PORT); + +	if (!CONFIG(commit_timeout) && nfexp_attr_is_set(exp, ATTR_EXP_TIMEOUT)) +		exp_build_u32(exp, ATTR_EXP_TIMEOUT, n, NTA_EXP_TIMEOUT); + +	exp_build_u32(exp, ATTR_EXP_FLAGS, n, NTA_EXP_FLAGS);  } diff --git a/src/cache-ct.c b/src/cache-ct.c new file mode 100644 index 0000000..0ad8d2a --- /dev/null +++ b/src/cache-ct.c @@ -0,0 +1,356 @@ +/* + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "cache.h" +#include "hash.h" +#include "log.h" +#include "conntrackd.h" +#include "netlink.h" +#include "event.h" +#include "jhash.h" +#include "network.h" + +#include <errno.h> +#include <string.h> +#include <time.h> +#include <libnetfilter_conntrack/libnetfilter_conntrack.h> + +static uint32_t +cache_hash4_ct(const struct nf_conntrack *ct, const struct hashtable *table) +{ +	uint32_t a[4] = { +		[0]	= nfct_get_attr_u32(ct, ATTR_IPV4_SRC), +		[1]	= nfct_get_attr_u32(ct, ATTR_IPV4_DST), +		[2]	= nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | +			  nfct_get_attr_u8(ct, ATTR_L4PROTO), +		[3]	= nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | +			  nfct_get_attr_u16(ct, ATTR_PORT_DST), +	}; + +	/* +	 * Instead of returning hash % table->hashsize (implying a divide) +	 * we return the high 32 bits of the (hash * table->hashsize) that will +	 * give results between [0 and hashsize-1] and same hash distribution, +	 * but using a multiply, less expensive than a divide. See: +	 * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html +	 */ +	return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_hash6_ct(const struct nf_conntrack *ct, const struct hashtable *table) +{ +	uint32_t a[10]; + +	memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); +	memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); +	a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | +	       nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); +	a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | +	       nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); + +	return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_ct_hash(const void *data, const struct hashtable *table) +{ +	int ret = 0; +	const struct nf_conntrack *ct = data; + +	switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { +		case AF_INET: +			ret = cache_hash4_ct(ct, table); +			break; +		case AF_INET6: +			ret = cache_hash6_ct(ct, table); +			break; +		default: +			dlog(LOG_ERR, "unknown layer 3 proto in hash"); +			break; +	} +	return ret; +} + +static int cache_ct_cmp(const void *data1, const void *data2) +{ +	const struct cache_object *obj = data1; +	const struct nf_conntrack *ct = data2; + +	return nfct_cmp(obj->ptr, ct, NFCT_CMP_ORIG) && +	       nfct_get_attr_u32(obj->ptr, ATTR_ID) == +	       nfct_get_attr_u32(ct, ATTR_ID); +} + +static void *cache_ct_alloc(void) +{ +	return nfct_new(); +} + +static void cache_ct_free(void *ptr) +{ +	nfct_destroy(ptr); +} + +static void cache_ct_copy(void *dst, void *src, unsigned int flags) +{ +	nfct_copy(dst, src, flags); +} + +static int cache_ct_dump_step(void *data1, void *n) +{ +	char buf[1024]; +	int size; +	struct __dump_container *container = data1; +	struct cache_object *obj = n; +	char *data = obj->data; +	unsigned i; + +	/* +	 * XXX: Do not dump the entries that are scheduled to expire. +	 * 	These entries talk about already destroyed connections +	 * 	that we keep for some time just in case that we have to +	 * 	resent some lost messages. We do not show them to the +	 * 	user as he may think that the firewall replicas are not +	 * 	in sync. The branch below is a hack as it is quite +	 * 	specific and it breaks conntrackd modularity. Probably +	 * 	there's a nicer way to do this but until I come up with it... +	 */ +	if (CONFIG(flags) & CTD_SYNC_FTFW && obj->status == C_OBJ_DEAD) +		return 0; + +	/* do not show cached timeout, this may confuse users */ +	if (nfct_attr_is_set(obj->ptr, ATTR_TIMEOUT)) +		nfct_attr_unset(obj->ptr, ATTR_TIMEOUT); + +	memset(buf, 0, sizeof(buf)); +	size = nfct_snprintf(buf,  +			     sizeof(buf),  +			     obj->ptr, +			     NFCT_T_UNKNOWN,  +			     container->type, +			     0); + +	for (i = 0; i < obj->cache->num_features; i++) { +		if (obj->cache->features[i]->dump) { +			size += obj->cache->features[i]->dump(obj,  +							      data,  +							      buf+size, +							      container->type); +			data += obj->cache->features[i]->size; +		} +	} +	if (container->type != NFCT_O_XML) { +		long tm = time(NULL); +		size += sprintf(buf+size, " [active since %lds]", +				tm - obj->lifetime); +	} +	size += sprintf(buf+size, "\n"); +	if (send(container->fd, buf, size, 0) == -1) { +		if (errno != EPIPE) +			return -1; +	} + +	return 0; +} + +static void +cache_ct_commit_step(struct __commit_container *tmp, struct cache_object *obj) +{ +	int ret, retry = 1, timeout; +	struct nf_conntrack *ct = obj->ptr; + +	if (CONFIG(commit_timeout)) { +		timeout = CONFIG(commit_timeout); +	} else { +		timeout = time(NULL) - obj->lastupdate; +		if (timeout < 0) { +			/* XXX: Arbitrarily set the timer to one minute, how +			 * can this happen? For example, an adjustment due to +			 * daylight-saving. Probably other situations can +			 * trigger this. */ +			timeout = 60; +		} +		/* calculate an estimation of the current timeout */ +		timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT) - timeout; +		if (timeout < 0) { +			timeout = 60; +		} +	} + +retry: +	if (nl_create_conntrack(tmp->h, ct, timeout) == -1) { +		if (errno == EEXIST && retry == 1) { +			ret = nl_destroy_conntrack(tmp->h, ct); +			if (ret == 0 || (ret == -1 && errno == ENOENT)) { +				if (retry) { +					retry = 0; +					goto retry; +				} +			} +			dlog(LOG_ERR, "commit-destroy: %s", strerror(errno)); +			dlog_ct(STATE(log), ct, NFCT_O_PLAIN); +			tmp->c->stats.commit_fail++; +		} else { +			dlog(LOG_ERR, "commit-create: %s", strerror(errno)); +			dlog_ct(STATE(log), ct, NFCT_O_PLAIN); +			tmp->c->stats.commit_fail++; +		} +	} else { +		tmp->c->stats.commit_ok++; +	} +} + +static int cache_ct_commit_related(void *data, void *n) +{ +	struct cache_object *obj = n; + +	if (ct_is_related(obj->ptr)) +		cache_ct_commit_step(data, obj); + +	/* keep iterating even if we have found errors */ +	return 0; +} + +static int cache_ct_commit_master(void *data, void *n) +{ +	struct cache_object *obj = n; + +	if (ct_is_related(obj->ptr)) +		return 0; + +	cache_ct_commit_step(data, obj); +	return 0; +} + +static int cache_ct_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ +	unsigned int commit_ok, commit_fail; +	struct __commit_container tmp = { +		.h = h, +		.c = c, +	}; +	struct timeval commit_stop, res; + +	/* we already have one commit in progress, skip this. The clientfd +	 * descriptor has to be closed by the caller. */ +	if (clientfd && STATE_SYNC(commit).clientfd != -1) +		return -1; + +	switch(STATE_SYNC(commit).state) { +	case COMMIT_STATE_INACTIVE: +		gettimeofday(&STATE_SYNC(commit).stats.start, NULL); +		STATE_SYNC(commit).stats.ok = c->stats.commit_ok; +		STATE_SYNC(commit).stats.fail = c->stats.commit_fail; +		STATE_SYNC(commit).clientfd = clientfd; +	case COMMIT_STATE_MASTER: +		STATE_SYNC(commit).current = +			hashtable_iterate_limit(c->h, &tmp, +						STATE_SYNC(commit).current, +						CONFIG(general).commit_steps, +						cache_ct_commit_master); +		if (STATE_SYNC(commit).current < CONFIG(hashsize)) { +			STATE_SYNC(commit).state = COMMIT_STATE_MASTER; +			/* give it another step as soon as possible */ +			write_evfd(STATE_SYNC(commit).evfd); +			return 1; +		} +		STATE_SYNC(commit).current = 0; +		STATE_SYNC(commit).state = COMMIT_STATE_RELATED; +	case COMMIT_STATE_RELATED: +		STATE_SYNC(commit).current = +			hashtable_iterate_limit(c->h, &tmp, +						STATE_SYNC(commit).current, +						CONFIG(general).commit_steps, +						cache_ct_commit_related); +		if (STATE_SYNC(commit).current < CONFIG(hashsize)) { +			STATE_SYNC(commit).state = COMMIT_STATE_RELATED; +			/* give it another step as soon as possible */ +			write_evfd(STATE_SYNC(commit).evfd); +			return 1; +		} +		/* calculate the time that commit has taken */ +		gettimeofday(&commit_stop, NULL); +		timersub(&commit_stop, &STATE_SYNC(commit).stats.start, &res); + +		/* calculate new entries committed */ +		commit_ok = c->stats.commit_ok - STATE_SYNC(commit).stats.ok; +		commit_fail =  +			c->stats.commit_fail - STATE_SYNC(commit).stats.fail; + +		/* log results */ +		dlog(LOG_NOTICE, "Committed %u new entries", commit_ok); + +		if (commit_fail) +			dlog(LOG_NOTICE, "%u entries can't be " +					 "committed", commit_fail); + +		dlog(LOG_NOTICE, "commit has taken %lu.%06lu seconds",  +				res.tv_sec, res.tv_usec); + +		/* prepare the state machine for new commits */ +		STATE_SYNC(commit).current = 0; +		STATE_SYNC(commit).state = COMMIT_STATE_INACTIVE; + +		return 0; +	} +	return 1; +} + +static struct nethdr * +cache_ct_build_msg(const struct cache_object *obj, int type) +{ +	return BUILD_NETMSG_FROM_CT(obj->ptr, type); +} + +/* template to cache conntracks coming from the kernel. */ +struct cache_ops cache_sync_internal_ct_ops = { +	.hash		= cache_ct_hash, +	.cmp		= cache_ct_cmp, +	.alloc		= cache_ct_alloc, +	.free		= cache_ct_free, +	.copy		= cache_ct_copy, +	.dump_step	= cache_ct_dump_step, +	.commit		= NULL, +	.build_msg	= cache_ct_build_msg, +}; + +/* template to cache conntracks coming from the network. */ +struct cache_ops cache_sync_external_ct_ops = { +	.hash		= cache_ct_hash, +	.cmp		= cache_ct_cmp, +	.alloc		= cache_ct_alloc, +	.free		= cache_ct_free, +	.copy		= cache_ct_copy, +	.dump_step	= cache_ct_dump_step, +	.commit		= cache_ct_commit, +	.build_msg	= NULL, +}; + +/* template to cache conntracks for the statistics mode. */ +struct cache_ops cache_stats_ct_ops = { +	.hash		= cache_ct_hash, +	.cmp		= cache_ct_cmp, +	.alloc		= cache_ct_alloc, +	.free		= cache_ct_free, +	.copy		= cache_ct_copy, +	.dump_step	= cache_ct_dump_step, +	.commit		= NULL, +	.build_msg	= NULL, +}; diff --git a/src/cache-exp.c b/src/cache-exp.c new file mode 100644 index 0000000..e88877a --- /dev/null +++ b/src/cache-exp.c @@ -0,0 +1,308 @@ +/* + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "cache.h" +#include "hash.h" +#include "log.h" +#include "conntrackd.h" +#include "netlink.h" +#include "event.h" +#include "jhash.h" +#include "network.h" + +#include <errno.h> +#include <string.h> +#include <time.h> +#include <libnetfilter_conntrack/libnetfilter_conntrack.h> + +static uint32_t +cache_hash4_exp(const struct nf_conntrack *ct, const struct hashtable *table) +{ +	uint32_t a[4] = { +		[0]	= nfct_get_attr_u32(ct, ATTR_IPV4_SRC), +		[1]	= nfct_get_attr_u32(ct, ATTR_IPV4_DST), +		[2]	= nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | +			  nfct_get_attr_u8(ct, ATTR_L4PROTO), +		[3]	= nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | +			  nfct_get_attr_u16(ct, ATTR_PORT_DST), +	}; + +	/* +	 * Instead of returning hash % table->hashsize (implying a divide) +	 * we return the high 32 bits of the (hash * table->hashsize) that will +	 * give results between [0 and hashsize-1] and same hash distribution, +	 * but using a multiply, less expensive than a divide. See: +	 * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html +	 */ +	return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_hash6_exp(const struct nf_conntrack *ct, const struct hashtable *table) +{ +	uint32_t a[10]; + +	memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); +	memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); +	a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | +	       nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); +	a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | +	       nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); + +	return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_exp_hash(const void *data, const struct hashtable *table) +{ +	int ret = 0; +	const struct nf_expect *exp = data; +	const struct nf_conntrack *ct = nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { +		case AF_INET: +			ret = cache_hash4_exp(ct, table); +			break; +		case AF_INET6: +			ret = cache_hash6_exp(ct, table); +			break; +		default: +			dlog(LOG_ERR, "unknown layer 3 proto in hash"); +			break; +	} +	return ret; +} + +static int cache_exp_cmp(const void *data1, const void *data2) +{ +	const struct cache_object *obj = data1; +	const struct nf_expect *exp = data2; + +	return nfexp_cmp(obj->ptr, exp, 0); +} + +static void *cache_exp_alloc(void) +{ +	return nfexp_new(); +} + +static void cache_exp_free(void *ptr) +{ +	nfexp_destroy(ptr); +} + +static void cache_exp_copy(void *dst, void *src, unsigned int flags) +{ +	/* XXX: add nfexp_copy(...) to libnetfilter_conntrack. */ +	memcpy(dst, src, nfexp_maxsize()); +} + +static int cache_exp_dump_step(void *data1, void *n) +{ +	char buf[1024]; +	int size; +	struct __dump_container *container = data1; +	struct cache_object *obj = n; +	char *data = obj->data; +	unsigned i; + +	/* +	 * XXX: Do not dump the entries that are scheduled to expire. +	 *	These entries talk about already destroyed connections +	 *	that we keep for some time just in case that we have to +	 *	resent some lost messages. We do not show them to the +	 *	user as he may think that the firewall replicas are not +	 *	in sync. The branch below is a hack as it is quite +	 *	specific and it breaks conntrackd modularity. Probably +	 *	there's a nicer way to do this but until I come up with it... +	 */ +	if (CONFIG(flags) & CTD_SYNC_FTFW && obj->status == C_OBJ_DEAD) +		return 0; + +	/* do not show cached timeout, this may confuse users */ +	if (nfexp_attr_is_set(obj->ptr, ATTR_EXP_TIMEOUT)) +		nfexp_attr_unset(obj->ptr, ATTR_EXP_TIMEOUT); + +	memset(buf, 0, sizeof(buf)); +	size = nfexp_snprintf(buf, sizeof(buf),obj->ptr, +			      NFCT_T_UNKNOWN, container->type, 0); + +	for (i = 0; i < obj->cache->num_features; i++) { +		if (obj->cache->features[i]->dump) { +			size += obj->cache->features[i]->dump(obj, data, +							      buf+size, +							      container->type); +			data += obj->cache->features[i]->size; +		} +	} +	if (container->type != NFCT_O_XML) { +		long tm = time(NULL); +		size += sprintf(buf+size, " [active since %lds]", +				tm - obj->lifetime); +	} +	size += sprintf(buf+size, "\n"); +	if (send(container->fd, buf, size, 0) == -1) { +		if (errno != EPIPE) +			return -1; +	} + +	return 0; +} + +static int cache_exp_commit_step(void *data, void *n) +{ +	struct cache_object *obj = n; +	struct __commit_container *tmp = data; +	int ret, retry = 1, timeout; +	struct nf_expect *exp = obj->ptr; + +	if (CONFIG(commit_timeout)) { +		timeout = CONFIG(commit_timeout); +	} else { +		timeout = time(NULL) - obj->lastupdate; +		if (timeout < 0) { +			/* XXX: Arbitrarily set the timer to one minute, how +			 * can this happen? For example, an adjustment due to +			 * daylight-saving. Probably other situations can +			 * trigger this. */ +			timeout = 60; +		} +		/* calculate an estimation of the current timeout */ +		timeout = nfexp_get_attr_u32(exp, ATTR_EXP_TIMEOUT) - timeout; +		if (timeout < 0) { +			timeout = 60; +		} +	} + +retry: +	if (nl_create_expect(tmp->h, exp, timeout) == -1) { +		if (errno == EEXIST && retry == 1) { +			ret = nl_destroy_expect(tmp->h, exp); +			if (ret == 0 || (ret == -1 && errno == ENOENT)) { +				if (retry) { +					retry = 0; +					goto retry; +				} +			} +			dlog(LOG_ERR, "commit-destroy: %s", strerror(errno)); +			dlog_exp(STATE(log), exp, NFCT_O_PLAIN); +			tmp->c->stats.commit_fail++; +		} else { +			dlog(LOG_ERR, "commit-create: %s", strerror(errno)); +			dlog_exp(STATE(log), exp, NFCT_O_PLAIN); +			tmp->c->stats.commit_fail++; +		} +	} else { +		tmp->c->stats.commit_ok++; +	} +	/* keep iterating even if we have found errors */ +	return 0; +} + +static int +cache_exp_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ +	unsigned int commit_ok, commit_fail; +	struct timeval commit_stop, res; +	struct __commit_container tmp = { +		.h = h, +		.c = c, +	}; + +	/* we already have one commit in progress, skip this. The clientfd +	 * descriptor has to be closed by the caller. */ +	if (clientfd && STATE_SYNC(commit).clientfd != -1) +		return -1; + +	switch(STATE_SYNC(commit).state) { +	case COMMIT_STATE_INACTIVE: +		gettimeofday(&STATE_SYNC(commit).stats.start, NULL); +		STATE_SYNC(commit).stats.ok = c->stats.commit_ok; +		STATE_SYNC(commit).stats.fail = c->stats.commit_fail; +		STATE_SYNC(commit).clientfd = clientfd; +	case COMMIT_STATE_MASTER: +		STATE_SYNC(commit).current = +			hashtable_iterate_limit(c->h, &tmp, +						STATE_SYNC(commit).current, +						CONFIG(general).commit_steps, +						cache_exp_commit_step); +		if (STATE_SYNC(commit).current < CONFIG(hashsize)) { +			STATE_SYNC(commit).state = COMMIT_STATE_MASTER; +			/* give it another step as soon as possible */ +			write_evfd(STATE_SYNC(commit).evfd); +			return 1; +		} + +		/* calculate the time that commit has taken */ +		gettimeofday(&commit_stop, NULL); +		timersub(&commit_stop, &STATE_SYNC(commit).stats.start, &res); + +		/* calculate new entries committed */ +		commit_ok = c->stats.commit_ok - STATE_SYNC(commit).stats.ok; +		commit_fail = +			c->stats.commit_fail - STATE_SYNC(commit).stats.fail; + +		/* log results */ +		dlog(LOG_NOTICE, "Committed %u new expectations", commit_ok); + +		if (commit_fail) +			dlog(LOG_NOTICE, "%u expectations can't be " +					 "committed", commit_fail); + +		dlog(LOG_NOTICE, "commit has taken %lu.%06lu seconds", +			res.tv_sec, res.tv_usec); + +		/* prepare the state machine for new commits */ +		STATE_SYNC(commit).current = 0; +		STATE_SYNC(commit).state = COMMIT_STATE_INACTIVE; + +		return 0; +	} +	return 1; +} + +static struct nethdr * +cache_exp_build_msg(const struct cache_object *obj, int type) +{ +	return BUILD_NETMSG_FROM_EXP(obj->ptr, type); +} + +/* template to cache expectations coming from the kernel. */ +struct cache_ops cache_sync_internal_exp_ops = { +	.hash		= cache_exp_hash, +	.cmp		= cache_exp_cmp, +	.alloc		= cache_exp_alloc, +	.free		= cache_exp_free, +	.copy		= cache_exp_copy, +	.dump_step	= cache_exp_dump_step, +	.commit		= NULL, +	.build_msg	= cache_exp_build_msg, +}; + +/* template to cache expectations coming from the network. */ +struct cache_ops cache_sync_external_exp_ops = { +	.hash		= cache_exp_hash, +	.cmp		= cache_exp_cmp, +	.alloc		= cache_exp_alloc, +	.free		= cache_exp_free, +	.copy		= cache_exp_copy, +	.dump_step	= cache_exp_dump_step, +	.commit		= cache_exp_commit, +	.build_msg	= NULL, +}; diff --git a/src/cache.c b/src/cache.c index 74c5c4b..7c41e54 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1,5 +1,6 @@  /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com>   *    * 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 @@ -28,80 +29,14 @@  #include <string.h>  #include <time.h> -static uint32_t -__hash4(const struct nf_conntrack *ct, const struct hashtable *table) -{ -	uint32_t a[4] = { -		[0]	= nfct_get_attr_u32(ct, ATTR_IPV4_SRC), -		[1]	= nfct_get_attr_u32(ct, ATTR_IPV4_DST), -		[2]	= nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | -			  nfct_get_attr_u8(ct, ATTR_L4PROTO), -		[3]	= nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | -			  nfct_get_attr_u16(ct, ATTR_PORT_DST), -	}; - -	/* -	 * Instead of returning hash % table->hashsize (implying a divide) -	 * we return the high 32 bits of the (hash * table->hashsize) that will -	 * give results between [0 and hashsize-1] and same hash distribution, -	 * but using a multiply, less expensive than a divide. See: -	 * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html -	 */ -	return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; -} - -static uint32_t -__hash6(const struct nf_conntrack *ct, const struct hashtable *table) -{ -	uint32_t a[10]; - -	memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); -	memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); -	a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | -	       nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); -	a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | -	       nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); - -	return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; -} - -static uint32_t hash(const void *data, const struct hashtable *table) -{ -	int ret = 0; -	const struct nf_conntrack *ct = data; - -	switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { -		case AF_INET: -			ret = __hash4(ct, table); -			break; -		case AF_INET6: -			ret = __hash6(ct, table); -			break; -		default: -			dlog(LOG_ERR, "unknown layer 3 proto in hash"); -			break; -	} - -	return ret; -} - -static int compare(const void *data1, const void *data2) -{ -	const struct cache_object *obj = data1; -	const struct nf_conntrack *ct = data2; - -	return nfct_cmp(obj->ct, ct, NFCT_CMP_ORIG) && -	       nfct_get_attr_u32(obj->ct, ATTR_ID) == -	       nfct_get_attr_u32(ct, ATTR_ID); -} -  struct cache_feature *cache_feature[CACHE_MAX_FEATURE] = {  	[TIMER_FEATURE]		= &timer_feature,  }; -struct cache *cache_create(const char *name,  +struct cache *cache_create(const char *name, enum cache_type type,  			   unsigned int features,  -			   struct cache_extra *extra) +			   struct cache_extra *extra, +			   struct cache_ops *ops)  {  	size_t size = sizeof(struct cache_object);  	int i, j = 0; @@ -110,12 +45,16 @@ struct cache *cache_create(const char *name,  	unsigned int feature_offset[CACHE_MAX_FEATURE] = {};  	unsigned int feature_type[CACHE_MAX_FEATURE] = {}; +	if (type == CACHE_T_NONE || type >= CACHE_T_MAX) +		return NULL; +  	c = malloc(sizeof(struct cache));  	if (!c)  		return NULL;  	memset(c, 0, sizeof(struct cache));  	strcpy(c->name, name); +	c->type = type;  	for (i = 0; i < CACHE_MAX_FEATURE; i++) {  		if ((1 << i) & features) { @@ -150,11 +89,19 @@ struct cache *cache_create(const char *name,  	}  	memcpy(c->feature_offset, feature_offset, sizeof(unsigned int) * j); +	if (!ops || !ops->hash || !ops->cmp || +	    !ops->alloc || !ops->copy || !ops->free) { +		free(c->feature_offset); +		free(c->features); +		free(c); +		return NULL; +	} +	c->ops = ops; +  	c->h = hashtable_create(CONFIG(hashsize),  				CONFIG(limit), -				hash, -				compare); - +				c->ops->hash, +				c->ops->cmp);  	if (!c->h) {  		free(c->features);  		free(c->feature_offset); @@ -175,7 +122,7 @@ void cache_destroy(struct cache *c)  	free(c);  } -struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct) +struct cache_object *cache_object_new(struct cache *c, void *ptr)  {  	struct cache_object *obj; @@ -187,13 +134,14 @@ struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct)  	}  	obj->cache = c; -	if ((obj->ct = nfct_new()) == NULL) { +	obj->ptr = c->ops->alloc(); +	if (obj->ptr == NULL) {  		free(obj);  		errno = ENOMEM;  		c->stats.add_fail_enomem++;  		return NULL;  	} -	memcpy(obj->ct, ct, nfct_sizeof(ct)); +	c->ops->copy(obj->ptr, ptr, NFCT_CP_OVERRIDE);  	obj->status = C_OBJ_NONE;  	c->stats.objects++; @@ -203,7 +151,8 @@ struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct)  void cache_object_free(struct cache_object *obj)  {  	obj->cache->stats.objects--; -	nfct_destroy(obj->ct); +	obj->cache->ops->free(obj->ptr); +  	free(obj);  } @@ -271,13 +220,12 @@ int cache_add(struct cache *c, struct cache_object *obj, int id)  	return 0;  } -void cache_update(struct cache *c, struct cache_object *obj, int id, -		  struct nf_conntrack *ct) +void cache_update(struct cache *c, struct cache_object *obj, int id, void *ptr)  {  	char *data = obj->data;  	unsigned int i; -	nfct_copy(obj->ct, ct, NFCT_CP_META); +	c->ops->copy(obj->ptr, ptr, NFCT_CP_META);  	for (i = 0; i < c->num_features; i++) {  		c->features[i]->update(obj, data); @@ -322,23 +270,22 @@ void cache_del(struct cache *c, struct cache_object *obj)  	__del(c, obj);  } -struct cache_object * -cache_update_force(struct cache *c, struct nf_conntrack *ct) +struct cache_object *cache_update_force(struct cache *c, void *ptr)  {  	struct cache_object *obj;  	int id; -	obj = cache_find(c, ct, &id); +	obj = cache_find(c, ptr, &id);  	if (obj) {  		if (obj->status != C_OBJ_DEAD) { -			cache_update(c, obj, id, ct); +			cache_update(c, obj, id, ptr);  			return obj;  		} else {  			cache_del(c, obj);  			cache_object_free(obj);  		}  	} -	obj = cache_object_new(c, ct); +	obj = cache_object_new(c, ptr);  	if (obj == NULL)  		return NULL; @@ -350,21 +297,15 @@ cache_update_force(struct cache *c, struct nf_conntrack *ct)  	return obj;  } -struct cache_object * -cache_find(struct cache *c, struct nf_conntrack *ct, int *id) +struct cache_object *cache_find(struct cache *c, void *ptr, int *id)  { -	*id = hashtable_hash(c->h, ct); -	return ((struct cache_object *) hashtable_find(c->h, ct, *id)); +	*id = hashtable_hash(c->h, ptr); +	return ((struct cache_object *) hashtable_find(c->h, ptr, *id));  } -struct cache_object *cache_data_get_object(struct cache *c, void *data) +void *cache_get_extra(struct cache_object *obj)  { -	return (struct cache_object *)((char*)data - c->extra_offset); -} - -void *cache_get_extra(struct cache *c, void *data) -{ -	return (char*)data + c->extra_offset; +	return (char*)obj + obj->cache->extra_offset;  }  void cache_stats(const struct cache *c, int fd) @@ -432,3 +373,33 @@ void cache_iterate_limit(struct cache *c, void *data,  {  	hashtable_iterate_limit(c->h, data, from, steps, iterate);  } + +void cache_dump(struct cache *c, int fd, int type) +{ +	struct __dump_container tmp = { +		.fd	= fd, +		.type	= type +	}; +	hashtable_iterate(c->h, (void *) &tmp, c->ops->dump_step); +} + +int cache_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ +	return c->ops->commit(c, h, clientfd); +} + +static int do_flush(void *data, void *n) +{ +	struct cache *c = data; +	struct cache_object *obj = n; + +	cache_del(c, obj); +	cache_object_free(obj); +	return 0; +} + +void cache_flush(struct cache *c) +{ +	hashtable_iterate(c->h, c, do_flush); +	c->stats.flush++; +} diff --git a/src/conntrack.c b/src/conntrack.c index eec3868..9602e2e 100644 --- a/src/conntrack.c +++ b/src/conntrack.c @@ -58,10 +58,219 @@  #include <fcntl.h>  #include <libnetfilter_conntrack/libnetfilter_conntrack.h> +struct u32_mask { +	uint32_t value; +	uint32_t mask; +}; + +/* These are the template objects that are used to send commands. */ +static struct { +	struct nf_conntrack *ct; +	struct nf_expect *exp; +	/* Expectations require the expectation tuple and the mask. */ +	struct nf_conntrack *exptuple, *mask; + +	/* Allows filtering/setting specific bits in the ctmark */ +	struct u32_mask mark; +} tmpl; + +static int alloc_tmpl_objects(void) +{ +	tmpl.ct = nfct_new(); +	tmpl.exptuple = nfct_new(); +	tmpl.mask = nfct_new(); +	tmpl.exp = nfexp_new(); + +	memset(&tmpl.mark, 0, sizeof(tmpl.mark)); + +	return tmpl.ct != NULL && tmpl.exptuple != NULL && +	       tmpl.mask != NULL && tmpl.exp != NULL; +} + +static void free_tmpl_objects(void) +{ +	if (tmpl.ct) +		nfct_destroy(tmpl.ct); +	if (tmpl.exptuple) +		nfct_destroy(tmpl.exptuple); +	if (tmpl.mask) +		nfct_destroy(tmpl.mask); +	if (tmpl.exp) +		nfexp_destroy(tmpl.exp); +} + +enum ct_command { +	CT_NONE		= 0, + +	CT_LIST_BIT 	= 0, +	CT_LIST 	= (1 << CT_LIST_BIT), + +	CT_CREATE_BIT	= 1, +	CT_CREATE	= (1 << CT_CREATE_BIT), + +	CT_UPDATE_BIT	= 2, +	CT_UPDATE	= (1 << CT_UPDATE_BIT), + +	CT_DELETE_BIT	= 3, +	CT_DELETE	= (1 << CT_DELETE_BIT), + +	CT_GET_BIT	= 4, +	CT_GET		= (1 << CT_GET_BIT), + +	CT_FLUSH_BIT	= 5, +	CT_FLUSH	= (1 << CT_FLUSH_BIT), + +	CT_EVENT_BIT	= 6, +	CT_EVENT	= (1 << CT_EVENT_BIT), + +	CT_VERSION_BIT	= 7, +	CT_VERSION	= (1 << CT_VERSION_BIT), + +	CT_HELP_BIT	= 8, +	CT_HELP		= (1 << CT_HELP_BIT), + +	EXP_LIST_BIT 	= 9, +	EXP_LIST 	= (1 << EXP_LIST_BIT), + +	EXP_CREATE_BIT	= 10, +	EXP_CREATE	= (1 << EXP_CREATE_BIT), + +	EXP_DELETE_BIT	= 11, +	EXP_DELETE	= (1 << EXP_DELETE_BIT), + +	EXP_GET_BIT	= 12, +	EXP_GET		= (1 << EXP_GET_BIT), + +	EXP_FLUSH_BIT	= 13, +	EXP_FLUSH	= (1 << EXP_FLUSH_BIT), + +	EXP_EVENT_BIT	= 14, +	EXP_EVENT	= (1 << EXP_EVENT_BIT), + +	CT_COUNT_BIT	= 15, +	CT_COUNT	= (1 << CT_COUNT_BIT), + +	EXP_COUNT_BIT	= 16, +	EXP_COUNT	= (1 << EXP_COUNT_BIT), + +	X_STATS_BIT	= 17, +	X_STATS		= (1 << X_STATS_BIT), +}; +/* If you add a new command, you have to update NUMBER_OF_CMD in conntrack.h */ + +enum ct_options { +	CT_OPT_ORIG_SRC_BIT	= 0, +	CT_OPT_ORIG_SRC 	= (1 << CT_OPT_ORIG_SRC_BIT), + +	CT_OPT_ORIG_DST_BIT	= 1, +	CT_OPT_ORIG_DST		= (1 << CT_OPT_ORIG_DST_BIT), + +	CT_OPT_ORIG		= (CT_OPT_ORIG_SRC | CT_OPT_ORIG_DST), + +	CT_OPT_REPL_SRC_BIT	= 2, +	CT_OPT_REPL_SRC		= (1 << CT_OPT_REPL_SRC_BIT), + +	CT_OPT_REPL_DST_BIT	= 3, +	CT_OPT_REPL_DST		= (1 << CT_OPT_REPL_DST_BIT), + +	CT_OPT_REPL		= (CT_OPT_REPL_SRC | CT_OPT_REPL_DST), + +	CT_OPT_PROTO_BIT	= 4, +	CT_OPT_PROTO		= (1 << CT_OPT_PROTO_BIT), + +	CT_OPT_TUPLE_ORIG	= (CT_OPT_ORIG | CT_OPT_PROTO), +	CT_OPT_TUPLE_REPL	= (CT_OPT_REPL | CT_OPT_PROTO), + +	CT_OPT_TIMEOUT_BIT	= 5, +	CT_OPT_TIMEOUT		= (1 << CT_OPT_TIMEOUT_BIT), + +	CT_OPT_STATUS_BIT	= 6, +	CT_OPT_STATUS		= (1 << CT_OPT_STATUS_BIT), + +	CT_OPT_ZERO_BIT		= 7, +	CT_OPT_ZERO		= (1 << CT_OPT_ZERO_BIT), + +	CT_OPT_EVENT_MASK_BIT	= 8, +	CT_OPT_EVENT_MASK	= (1 << CT_OPT_EVENT_MASK_BIT), + +	CT_OPT_EXP_SRC_BIT	= 9, +	CT_OPT_EXP_SRC		= (1 << CT_OPT_EXP_SRC_BIT), + +	CT_OPT_EXP_DST_BIT	= 10, +	CT_OPT_EXP_DST		= (1 << CT_OPT_EXP_DST_BIT), + +	CT_OPT_MASK_SRC_BIT	= 11, +	CT_OPT_MASK_SRC		= (1 << CT_OPT_MASK_SRC_BIT), + +	CT_OPT_MASK_DST_BIT	= 12, +	CT_OPT_MASK_DST		= (1 << CT_OPT_MASK_DST_BIT), + +	CT_OPT_NATRANGE_BIT	= 13, +	CT_OPT_NATRANGE		= (1 << CT_OPT_NATRANGE_BIT), + +	CT_OPT_MARK_BIT		= 14, +	CT_OPT_MARK		= (1 << CT_OPT_MARK_BIT), + +	CT_OPT_ID_BIT		= 15, +	CT_OPT_ID		= (1 << CT_OPT_ID_BIT), + +	CT_OPT_FAMILY_BIT	= 16, +	CT_OPT_FAMILY		= (1 << CT_OPT_FAMILY_BIT), + +	CT_OPT_SRC_NAT_BIT	= 17, +	CT_OPT_SRC_NAT		= (1 << CT_OPT_SRC_NAT_BIT), + +	CT_OPT_DST_NAT_BIT	= 18, +	CT_OPT_DST_NAT		= (1 << CT_OPT_DST_NAT_BIT), + +	CT_OPT_OUTPUT_BIT	= 19, +	CT_OPT_OUTPUT		= (1 << CT_OPT_OUTPUT_BIT), + +	CT_OPT_SECMARK_BIT	= 20, +	CT_OPT_SECMARK		= (1 << CT_OPT_SECMARK_BIT), + +	CT_OPT_BUFFERSIZE_BIT	= 21, +	CT_OPT_BUFFERSIZE	= (1 << CT_OPT_BUFFERSIZE_BIT), + +	CT_OPT_ANY_NAT_BIT	= 22, +	CT_OPT_ANY_NAT		= (1 << CT_OPT_ANY_NAT_BIT), + +	CT_OPT_ZONE_BIT		= 23, +	CT_OPT_ZONE		= (1 << CT_OPT_ZONE_BIT), +}; +/* If you add a new option, you have to update NUMBER_OF_OPT in conntrack.h */ + +/* Update this mask to allow to filter based on new options. */ +#define CT_COMPARISON (CT_OPT_PROTO | CT_OPT_ORIG | CT_OPT_REPL | \ +		       CT_OPT_MARK | CT_OPT_SECMARK |  CT_OPT_STATUS | \ +		       CT_OPT_ID | CT_OPT_ZONE) +  static const char *optflags[NUMBER_OF_OPT] = { -"src","dst","reply-src","reply-dst","protonum","timeout","status","zero", -"event-mask","tuple-src","tuple-dst","mask-src","mask-dst","nat-range","mark", -"id","family","src-nat","dst-nat","output","secmark","buffersize"}; +	[CT_OPT_ORIG_SRC_BIT] 	= "src", +	[CT_OPT_ORIG_DST_BIT]	= "dst", +	[CT_OPT_REPL_SRC_BIT]	= "reply-src", +	[CT_OPT_REPL_DST_BIT]	= "reply-dst", +	[CT_OPT_PROTO_BIT]	= "protonum", +	[CT_OPT_TIMEOUT_BIT]	= "timeout", +	[CT_OPT_STATUS_BIT]	= "status", +	[CT_OPT_ZERO_BIT]	= "zero", +	[CT_OPT_EVENT_MASK_BIT]	= "event-mask", +	[CT_OPT_EXP_SRC_BIT]	= "tuple-src", +	[CT_OPT_EXP_DST_BIT]	= "tuple-dst", +	[CT_OPT_MASK_SRC_BIT]	= "mask-src", +	[CT_OPT_MASK_DST_BIT]	= "mask-dst", +	[CT_OPT_NATRANGE_BIT]	= "nat-range", +	[CT_OPT_MARK_BIT]	= "mark", +	[CT_OPT_ID_BIT]		= "id", +	[CT_OPT_FAMILY_BIT]	= "family", +	[CT_OPT_SRC_NAT_BIT]	= "src-nat", +	[CT_OPT_DST_NAT_BIT]	= "dst-nat", +	[CT_OPT_OUTPUT_BIT]	= "output", +	[CT_OPT_SECMARK_BIT]	= "secmark", +	[CT_OPT_BUFFERSIZE_BIT]	= "buffer-size", +	[CT_OPT_ANY_NAT_BIT]	= "any-nat", +	[CT_OPT_ZONE_BIT]	= "zone", +};  static struct option original_opts[] = {  	{"dump", 2, 0, 'L'}, @@ -99,14 +308,14 @@ static struct option original_opts[] = {  	{"dst-nat", 2, 0, 'g'},  	{"output", 1, 0, 'o'},  	{"buffer-size", 1, 0, 'b'}, +	{"any-nat", 2, 0, 'j'}, +	{"zone", 1, 0, 'w'},  	{0, 0, 0, 0}  }; -#define OPTION_OFFSET 256 - -static struct nfct_handle *cth, *ith; -static struct option *opts = original_opts; -static unsigned int global_option_offset = 0; +static const char *getopt_str = "L::I::U::D::G::E::F::hVs:d:r:q:" +				"p:t:u:e:a:z[:]:{:}:m:i:f:o:n::" +				"g::c:b:C::Sj::w:";  /* Table of legal combinations of commands and options.  If any of the   * given commands make an option legal, that option is legal (applies to @@ -121,27 +330,143 @@ static unsigned int global_option_offset = 0;  static char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] =  /* Well, it's better than "Re: Linux vs FreeBSD" */  { -          /*   s d r q p t u z e [ ] { } a m i f n g o c b*/ -/*CT_LIST*/   {2,2,2,2,2,0,2,2,0,0,0,0,0,0,2,0,2,2,2,2,2,0}, -/*CT_CREATE*/ {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0}, -/*CT_UPDATE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0}, -/*CT_DELETE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0}, -/*CT_GET*/    {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0}, -/*CT_FLUSH*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*CT_EVENT*/  {2,2,2,2,2,0,0,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2}, -/*VERSION*/   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*HELP*/      {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_LIST*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0}, -/*EXP_CREATE*/{1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0}, -/*EXP_DELETE*/{1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_GET*/   {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_EVENT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*CT_COUNT*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*X_STATS*/   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +          /*   s d r q p t u z e [ ] { } a m i f n g o c b j w*/ +/*CT_LIST*/   {2,2,2,2,2,0,2,2,0,0,0,0,0,0,2,0,2,2,2,2,2,0,2,2}, +/*CT_CREATE*/ {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2}, +/*CT_UPDATE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0}, +/*CT_DELETE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,2}, +/*CT_GET*/    {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0}, +/*CT_FLUSH*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*CT_EVENT*/  {2,2,2,2,2,0,0,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2}, +/*VERSION*/   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*HELP*/      {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_LIST*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0}, +/*EXP_CREATE*/{1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_DELETE*/{1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_GET*/   {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_EVENT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*CT_COUNT*/  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*X_STATS*/   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +}; + +static const int cmd2type[][2] = { +	['L']	= { CT_LIST, 	EXP_LIST }, +	['I']	= { CT_CREATE,	EXP_CREATE }, +	['D']	= { CT_DELETE,	EXP_DELETE }, +	['G']	= { CT_GET,	EXP_GET }, +	['F']	= { CT_FLUSH,	EXP_FLUSH }, +	['E']	= { CT_EVENT,	EXP_EVENT }, +	['V']	= { CT_VERSION,	CT_VERSION }, +	['h']	= { CT_HELP,	CT_HELP }, +	['C']	= { CT_COUNT,	EXP_COUNT }, +}; + +static const int opt2type[] = { +	['s']	= CT_OPT_ORIG_SRC, +	['d']	= CT_OPT_ORIG_DST, +	['r']	= CT_OPT_REPL_SRC, +	['q']	= CT_OPT_REPL_DST, +	['{']	= CT_OPT_MASK_SRC, +	['}']	= CT_OPT_MASK_DST, +	['[']	= CT_OPT_EXP_SRC, +	[']']	= CT_OPT_EXP_DST, +	['n']	= CT_OPT_SRC_NAT, +	['g']	= CT_OPT_DST_NAT, +	['m']	= CT_OPT_MARK, +	['c']	= CT_OPT_SECMARK, +	['i']	= CT_OPT_ID, +	['j']	= CT_OPT_ANY_NAT, +	['w']	= CT_OPT_ZONE,  }; +static const int opt2family_attr[][2] = { +	['s']	= { ATTR_ORIG_IPV4_SRC,	ATTR_ORIG_IPV6_SRC }, +	['d']	= { ATTR_ORIG_IPV4_DST,	ATTR_ORIG_IPV6_DST }, +	['r']	= { ATTR_REPL_IPV4_SRC, ATTR_REPL_IPV6_SRC }, +	['q']	= { ATTR_REPL_IPV4_DST, ATTR_REPL_IPV6_DST }, +	['{']	= { ATTR_ORIG_IPV4_SRC,	ATTR_ORIG_IPV6_SRC }, +	['}']	= { ATTR_ORIG_IPV4_DST,	ATTR_ORIG_IPV6_DST }, +	['[']	= { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, +	[']']	= { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, +}; + +static const int opt2attr[] = { +	['s']	= ATTR_ORIG_L3PROTO, +	['d']	= ATTR_ORIG_L3PROTO, +	['r']	= ATTR_REPL_L3PROTO, +	['q']	= ATTR_REPL_L3PROTO, +	['m']	= ATTR_MARK, +	['c']	= ATTR_SECMARK, +	['i']	= ATTR_ID, +	['w']	= ATTR_ZONE, +}; + +static char exit_msg[NUMBER_OF_CMD][64] = { +	[CT_LIST_BIT] 		= "%d flow entries have been shown.\n", +	[CT_CREATE_BIT]		= "%d flow entries have been created.\n", +	[CT_UPDATE_BIT]		= "%d flow entries have been updated.\n", +	[CT_DELETE_BIT]		= "%d flow entries have been deleted.\n", +	[CT_GET_BIT] 		= "%d flow entries have been shown.\n", +	[CT_EVENT_BIT]		= "%d flow events have been shown.\n", +	[EXP_LIST_BIT]		= "%d expectations have been shown.\n", +	[EXP_DELETE_BIT]	= "%d expectations have been shown.\n", +}; + +static const char usage_commands[] = +	"Commands:\n" +	"  -L [table] [options]\t\tList conntrack or expectation table\n" +	"  -G [table] parameters\t\tGet conntrack or expectation\n" +	"  -D [table] parameters\t\tDelete conntrack or expectation\n" +	"  -I [table] parameters\t\tCreate a conntrack or expectation\n" +	"  -U [table] parameters\t\tUpdate a conntrack\n" +	"  -E [table] [options]\t\tShow events\n" +	"  -F [table]\t\t\tFlush table\n" +	"  -C [table]\t\t\tShow counter\n" +	"  -S\t\t\t\tShow statistics\n"; + +static const char usage_tables[] = +	"Tables: conntrack, expect\n"; + +static const char usage_conntrack_parameters[] = +	"Conntrack parameters and options:\n" +	"  -n, --src-nat ip\t\t\tsource NAT ip\n" +	"  -g, --dst-nat ip\t\t\tdestination NAT ip\n" +	"  -j, --any-nat ip\t\t\tsource or destination NAT ip\n" +	"  -m, --mark mark\t\t\tSet mark\n" +	"  -c, --secmark secmark\t\t\tSet selinux secmark\n" +	"  -e, --event-mask eventmask\t\tEvent mask, eg. NEW,DESTROY\n" +	"  -z, --zero \t\t\t\tZero counters while listing\n" +	"  -o, --output type[,...]\t\tOutput format, eg. xml\n"; + +static const char usage_expectation_parameters[] = +	"Expectation parameters and options:\n" +	"  --tuple-src ip\tSource address in expect tuple\n" +	"  --tuple-dst ip\tDestination address in expect tuple\n" +	"  --mask-src ip\t\tSource mask address\n" +	"  --mask-dst ip\t\tDestination mask address\n"; + +static const char usage_parameters[] = +	"Common parameters and options:\n" +	"  -s, --orig-src ip\t\tSource address from original direction\n" +	"  -d, --orig-dst ip\t\tDestination address from original direction\n" +	"  -r, --reply-src ip\t\tSource addres from reply direction\n" +	"  -q, --reply-dst ip\t\tDestination address from reply direction\n" +	"  -p, --protonum proto\t\tLayer 4 Protocol, eg. 'tcp'\n" +	"  -f, --family proto\t\tLayer 3 Protocol, eg. 'ipv6'\n" +	"  -t, --timeout timeout\t\tSet timeout\n" +	"  -u, --status status\t\tSet status, eg. ASSURED\n" +	"  -w, --zone value\t\tSet conntrack zone\n" +	"  -b, --buffer-size\t\tNetlink socket buffer size\n" +	; + +#define OPTION_OFFSET 256 + +static struct nfct_handle *cth, *ith; +static struct option *opts = original_opts; +static unsigned int global_option_offset = 0; +  #define ADDR_VALID_FLAGS_MAX   2  static unsigned int addr_valid_flags[ADDR_VALID_FLAGS_MAX] = {  	CT_OPT_ORIG_SRC | CT_OPT_ORIG_DST, @@ -152,9 +477,6 @@ static LIST_HEAD(proto_list);  static unsigned int options; -#define CT_COMPARISON (CT_OPT_PROTO | CT_OPT_ORIG | CT_OPT_REPL | CT_OPT_MARK |\ -		       CT_OPT_SECMARK |  CT_OPT_STATUS | CT_OPT_ID) -  void register_proto(struct ctproto_handler *h)  {  	if (strcmp(h->version, VERSION) != 0) { @@ -348,11 +670,11 @@ merge_options(struct option *oldopts, const struct option *newopts,  /* Translates errno numbers into more human-readable form than strerror. */  static const char * -err2str(int err, enum action command) +err2str(int err, enum ct_command command)  {  	unsigned int i;  	struct table_struct { -		enum action act; +		enum ct_command act;  		int err;  		const char *message;  	} table [] = @@ -378,11 +700,32 @@ err2str(int err, enum action command)  	return strerror(err);  } +static int mark_cmp(const struct u32_mask *m, const struct nf_conntrack *ct) +{ +	return nfct_attr_is_set(ct, ATTR_MARK) && +		(nfct_get_attr_u32(ct, ATTR_MARK) & m->mask) == m->value; +} +  #define PARSE_STATUS 0  #define PARSE_EVENT 1  #define PARSE_OUTPUT 2  #define PARSE_MAX 3 +enum { +	_O_XML	= (1 << 0), +	_O_EXT	= (1 << 1), +	_O_TMS	= (1 << 2), +	_O_ID	= (1 << 3), +	_O_KTMS	= (1 << 4), +}; + +enum { +	CT_EVENT_F_NEW	= (1 << 0), +	CT_EVENT_F_UPD	= (1 << 1), +	CT_EVENT_F_DEL 	= (1 << 2), +	CT_EVENT_F_ALL	= CT_EVENT_F_NEW | CT_EVENT_F_UPD | CT_EVENT_F_DEL, +}; +  static struct parse_parameter {  	const char	*parameter[6];  	size_t  size; @@ -391,10 +734,9 @@ static struct parse_parameter {  	{ {"ASSURED", "SEEN_REPLY", "UNSET", "FIXED_TIMEOUT", "EXPECTED"}, 5,  	  { IPS_ASSURED, IPS_SEEN_REPLY, 0, IPS_FIXED_TIMEOUT, IPS_EXPECTED} },  	{ {"ALL", "NEW", "UPDATES", "DESTROY"}, 4, -	  {~0U, NF_NETLINK_CONNTRACK_NEW, NF_NETLINK_CONNTRACK_UPDATE,  -	   NF_NETLINK_CONNTRACK_DESTROY} }, -	{ {"xml", "extended", "timestamp", "id" }, 4,  -	  { _O_XML, _O_EXT, _O_TMS, _O_ID }, +	  { CT_EVENT_F_ALL, CT_EVENT_F_NEW, CT_EVENT_F_UPD, CT_EVENT_F_DEL } }, +	{ {"xml", "extended", "timestamp", "id", "ktimestamp"}, 5,  +	  { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS },  	},  }; @@ -446,6 +788,19 @@ parse_parameter(const char *arg, unsigned int *status, int parse_type)  }  static void +parse_u32_mask(const char *arg, struct u32_mask *m) +{ +	char *end; + +	m->value = (uint32_t) strtoul(arg, &end, 0); + +	if (*end == '/') +		m->mask = (uint32_t) strtoul(end+1, NULL, 0); +	else +		m->mask = ~0; +} + +static void  add_command(unsigned int *cmd, const int newcmd)  {  	if (*cmd) @@ -503,8 +858,7 @@ parse_inetaddr(const char *cp, struct addr_parse *parse)  	else if (inet_pton(AF_INET6, cp, &parse->addr6) > 0)  		return AF_INET6;  #endif - -	exit_error(PARAMETER_PROBLEM, "Invalid IP address `%s'", cp); +	return AF_UNSPEC;  }  union ct_address { @@ -526,9 +880,8 @@ parse_addr(const char *cp, union ct_address *address)  	return ret;  } -/* Shamelessly stolen from libipt_DNAT ;). Ranges expected in network order. */  static void -nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type) +nat_parse(char *arg, struct nf_conntrack *obj, int type)  {  	char *colon, *error;  	union ct_address parse; @@ -538,14 +891,18 @@ nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type)  	if (colon) {  		uint16_t port; -		if (!portok) -			exit_error(PARAMETER_PROBLEM, -				   "Need TCP or UDP with port specification"); +		*colon = '\0';  		port = (uint16_t)atoi(colon+1); -		if (port == 0) -			exit_error(PARAMETER_PROBLEM, -				   "Port `%s' not valid", colon+1); +		if (port == 0) { +			if (strlen(colon+1) == 0) { +				exit_error(PARAMETER_PROBLEM, +					   "No port specified after `:'"); +			} else { +				exit_error(PARAMETER_PROBLEM, +					   "Port `%s' not valid", colon+1); +			} +		}  		error = strchr(colon+1, ':');  		if (error) @@ -553,66 +910,30 @@ nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type)  				   "Invalid port:port syntax");  		if (type == CT_OPT_SRC_NAT) -			nfct_set_attr_u16(obj, ATTR_SNAT_PORT, port); +			nfct_set_attr_u16(tmpl.ct, ATTR_SNAT_PORT, ntohs(port));  		else if (type == CT_OPT_DST_NAT) -			nfct_set_attr_u16(obj, ATTR_DNAT_PORT, port); +			nfct_set_attr_u16(tmpl.ct, ATTR_DNAT_PORT, ntohs(port)); +		else if (type == CT_OPT_ANY_NAT) { +			nfct_set_attr_u16(tmpl.ct, ATTR_SNAT_PORT, ntohs(port)); +			nfct_set_attr_u16(tmpl.ct, ATTR_DNAT_PORT, ntohs(port)); +		}  	} -	if (parse_addr(arg, &parse) != AF_INET) -		return; +	if (parse_addr(arg, &parse) == AF_UNSPEC) { +		if (strlen(arg) == 0) { +			exit_error(PARAMETER_PROBLEM, "No IP specified"); +		} else { +			exit_error(PARAMETER_PROBLEM, +					"Invalid IP address `%s'", arg); +		} +	} -	if (type == CT_OPT_SRC_NAT) -		nfct_set_attr_u32(obj, ATTR_SNAT_IPV4, parse.v4); -	else if (type == CT_OPT_DST_NAT) -		nfct_set_attr_u32(obj, ATTR_DNAT_IPV4, parse.v4); +	if (type == CT_OPT_SRC_NAT || type == CT_OPT_ANY_NAT) +		nfct_set_attr_u32(tmpl.ct, ATTR_SNAT_IPV4, parse.v4); +	else if (type == CT_OPT_DST_NAT || type == CT_OPT_ANY_NAT) +		nfct_set_attr_u32(tmpl.ct, ATTR_DNAT_IPV4, parse.v4);  } -static const char usage_commands[] = -	"Commands:\n" -	"  -L [table] [options]\t\tList conntrack or expectation table\n" -	"  -G [table] parameters\t\tGet conntrack or expectation\n" -	"  -D [table] parameters\t\tDelete conntrack or expectation\n" -	"  -I [table] parameters\t\tCreate a conntrack or expectation\n" -	"  -U [table] parameters\t\tUpdate a conntrack\n" -	"  -E [table] [options]\t\tShow events\n" -	"  -F [table]\t\t\tFlush table\n" -	"  -C [table]\t\t\tShow counter\n" -	"  -S\t\t\t\tShow statistics\n"; - -static const char usage_tables[] = -	"Tables: conntrack, expect\n"; - -static const char usage_conntrack_parameters[] = -	"Conntrack parameters and options:\n" -	"  -n, --src-nat ip\t\t\tsource NAT ip\n" -	"  -g, --dst-nat ip\t\t\tdestination NAT ip\n" -	"  -m, --mark mark\t\t\tSet mark\n" -	"  -c, --secmark secmark\t\t\tSet selinux secmark\n" -	"  -e, --event-mask eventmask\t\tEvent mask, eg. NEW,DESTROY\n" -	"  -z, --zero \t\t\t\tZero counters while listing\n" -	"  -o, --output type[,...]\t\tOutput format, eg. xml\n"; - -static const char usage_expectation_parameters[] = -	"Expectation parameters and options:\n" -	"  --tuple-src ip\tSource address in expect tuple\n" -	"  --tuple-dst ip\tDestination address in expect tuple\n" -	"  --mask-src ip\t\tSource mask address\n" -	"  --mask-dst ip\t\tDestination mask address\n"; - -static const char usage_parameters[] = -	"Common parameters and options:\n" -	"  -s, --orig-src ip\t\tSource address from original direction\n" -	"  -d, --orig-dst ip\t\tDestination address from original direction\n" -	"  -r, --reply-src ip\t\tSource addres from reply direction\n" -	"  -q, --reply-dst ip\t\tDestination address from reply direction\n" -	"  -p, --protonum proto\t\tLayer 4 Protocol, eg. 'tcp'\n" -	"  -f, --family proto\t\tLayer 3 Protocol, eg. 'ipv6'\n" -	"  -t, --timeout timeout\t\tSet timeout\n" -	"  -u, --status status\t\tSet status, eg. ASSURED\n" -	"  -b, --buffer-size\t\tNetlink socket buffer size\n" -	; -   -  static void  usage(char *prog)  { @@ -629,31 +950,97 @@ usage(char *prog)  static unsigned int output_mask; + +static int +filter_mark(const struct nf_conntrack *ct) +{ +	if ((options & CT_OPT_MARK) && +	     !mark_cmp(&tmpl.mark, ct)) +		return 1; +	return 0; +} + +  static int   filter_nat(const struct nf_conntrack *obj, const struct nf_conntrack *ct)  { +	int check_srcnat = options & CT_OPT_SRC_NAT ? 1 : 0; +	int check_dstnat = options & CT_OPT_DST_NAT ? 1 : 0; +	int has_srcnat = 0, has_dstnat = 0;  	uint32_t ip; +	uint16_t port; + +	if (options & CT_OPT_ANY_NAT) +		check_srcnat = check_dstnat = 1; -	if (options & CT_OPT_SRC_NAT) { -		if (!nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT)) -		  	return 1; +	if (check_srcnat) { +		int check_address = 0, check_port = 0;  		if (nfct_attr_is_set(obj, ATTR_SNAT_IPV4)) { +			check_address = 1;  			ip = nfct_get_attr_u32(obj, ATTR_SNAT_IPV4); -			if (ip != nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST)) -				return 1; +			if (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT) && +			    ip == nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST)) +				has_srcnat = 1; +		} +		if (nfct_attr_is_set(obj, ATTR_SNAT_PORT)) { +			int ret = 0; + +			check_port = 1; +			port = nfct_get_attr_u16(obj, ATTR_SNAT_PORT); +			if (nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT) && +			    port == nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST)) +				ret = 1; + +			/* the address matches but the port does not. */ +			if (check_address && has_srcnat && !ret) +				has_srcnat = 0; +			if (!check_address && ret) +				has_srcnat = 1;  		} +		if (!check_address && !check_port && +		    (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT) || +		     nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT))) +		  	has_srcnat = 1;  	} -	if (options & CT_OPT_DST_NAT) { -		if (!nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT)) -			return 1; +	if (check_dstnat) { +		int check_address = 0, check_port = 0;  		if (nfct_attr_is_set(obj, ATTR_DNAT_IPV4)) { +			check_address = 1;  			ip = nfct_get_attr_u32(obj, ATTR_DNAT_IPV4); -			if (ip != nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC)) -				return 1; +			if (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT) && +			    ip == nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC)) +				has_dstnat = 1;  		} +		if (nfct_attr_is_set(obj, ATTR_DNAT_PORT)) { +			int ret = 0; + +			check_port = 1; +			port = nfct_get_attr_u16(obj, ATTR_DNAT_PORT); +			if (nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT) && +			    port == nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC)) +				ret = 1; + +			/* the address matches but the port does not. */ +			if (check_address && has_dstnat && !ret) +				has_dstnat = 0; +			if (!check_address && ret) +				has_dstnat = 1; +		} +		if (!check_address && !check_port && +		    (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT) || +		     nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT))) +			has_dstnat = 1;  	} +	if (options & CT_OPT_ANY_NAT) +		return !(has_srcnat || has_dstnat); +	else if ((options & CT_OPT_SRC_NAT) && (options & CT_OPT_DST_NAT)) +		return !(has_srcnat && has_dstnat); +	else if (options & CT_OPT_SRC_NAT) +		return !has_srcnat; +	else if (options & CT_OPT_DST_NAT) +		return !has_dstnat;  	return 0;  } @@ -687,6 +1074,9 @@ static int event_cb(enum nf_conntrack_msg_type type,  	if (filter_nat(obj, ct))  		return NFCT_CB_CONTINUE; +	if (filter_mark(ct)) +		return NFCT_CB_CONTINUE; +  	if (options & CT_COMPARISON &&  	    !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK))  		return NFCT_CB_CONTINUE; @@ -709,6 +1099,8 @@ static int event_cb(enum nf_conntrack_msg_type type,  		} else  			op_flags |= NFCT_OF_TIME;  	} +	if (output_mask & _O_KTMS) +		op_flags |= NFCT_OF_TIMESTAMP;  	if (output_mask & _O_ID)  		op_flags |= NFCT_OF_ID; @@ -734,6 +1126,9 @@ static int dump_cb(enum nf_conntrack_msg_type type,  	if (filter_nat(obj, ct))  		return NFCT_CB_CONTINUE; +	if (filter_mark(ct)) +		return NFCT_CB_CONTINUE; +  	if (options & CT_COMPARISON &&  	    !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK))  		return NFCT_CB_CONTINUE; @@ -748,6 +1143,8 @@ static int dump_cb(enum nf_conntrack_msg_type type,  	}  	if (output_mask & _O_EXT)  		op_flags = NFCT_OF_SHOW_LAYER3; +	if (output_mask & _O_KTMS) +		op_flags |= NFCT_OF_TIMESTAMP;  	if (output_mask & _O_ID)  		op_flags |= NFCT_OF_ID; @@ -772,6 +1169,9 @@ static int delete_cb(enum nf_conntrack_msg_type type,  	if (filter_nat(obj, ct))  		return NFCT_CB_CONTINUE; +	if (filter_mark(ct)) +		return NFCT_CB_CONTINUE; +  	if (options & CT_COMPARISON &&  	    !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK))  		return NFCT_CB_CONTINUE; @@ -818,16 +1218,23 @@ static int print_cb(enum nf_conntrack_msg_type type,  	return NFCT_CB_CONTINUE;  } +static void copy_mark(struct nf_conntrack *tmp, +		      const struct nf_conntrack *ct, +		      const struct u32_mask *m) +{ +	if (options & CT_OPT_MARK) { +		uint32_t mark = nfct_get_attr_u32(ct, ATTR_MARK); +		mark = (mark & ~m->mask) ^ m->value; +		nfct_set_attr_u32(tmp, ATTR_MARK, mark); +	} +} +  static int update_cb(enum nf_conntrack_msg_type type,  		     struct nf_conntrack *ct,  		     void *data)  {  	int res; -	struct nf_conntrack *obj = data; -	char __tmp[nfct_maxsize()]; -	struct nf_conntrack *tmp = (struct nf_conntrack *) (void *)__tmp; - -	memset(tmp, 0, sizeof(__tmp)); +	struct nf_conntrack *obj = data, *tmp;  	if (filter_nat(obj, ct))  		return NFCT_CB_CONTINUE; @@ -841,30 +1248,42 @@ static int update_cb(enum nf_conntrack_msg_type type,  	if (options & CT_OPT_TUPLE_REPL && !nfct_cmp(obj, ct, NFCT_CMP_REPL))  		return NFCT_CB_CONTINUE; +	tmp = nfct_new(); +	if (tmp == NULL) +		exit_error(OTHER_PROBLEM, "out of memory"); +  	nfct_copy(tmp, ct, NFCT_CP_ORIG);  	nfct_copy(tmp, obj, NFCT_CP_META); +	copy_mark(tmp, ct, &tmpl.mark); + +	/* do not send NFCT_Q_UPDATE if ct appears unchanged */ +	if (nfct_cmp(tmp, ct, NFCT_CMP_ALL | NFCT_CMP_MASK)) { +		nfct_destroy(tmp); +		return NFCT_CB_CONTINUE; +	}  	res = nfct_query(ith, NFCT_Q_UPDATE, tmp); -	if (res < 0) +	if (res < 0) { +		nfct_destroy(tmp);  		exit_error(OTHER_PROBLEM,  			   "Operation failed: %s",  			   err2str(errno, CT_UPDATE)); - +	}  	nfct_callback_register(ith, NFCT_T_ALL, print_cb, NULL);  	res = nfct_query(ith, NFCT_Q_GET, tmp);  	if (res < 0) { +		nfct_destroy(tmp);  		/* the entry has vanish in middle of the update */  		if (errno == ENOENT) {  			nfct_callback_unregister(ith);  			return NFCT_CB_CONTINUE;  		} -  		exit_error(OTHER_PROBLEM,  			   "Operation failed: %s",  			   err2str(errno, CT_UPDATE));  	} - +	nfct_destroy(tmp);  	nfct_callback_unregister(ith);  	counter++; @@ -885,6 +1304,18 @@ static int dump_exp_cb(enum nf_conntrack_msg_type type,  	return NFCT_CB_CONTINUE;  } +static int event_exp_cb(enum nf_conntrack_msg_type type, +			struct nf_expect *exp, void *data) +{ +	char buf[1024]; + +	nfexp_snprintf(buf,sizeof(buf), exp, type, NFCT_O_DEFAULT, 0); +	printf("%s\n", buf); +	counter++; + +	return NFCT_CB_CONTINUE; +} +  static int count_exp_cb(enum nf_conntrack_msg_type type,  			struct nf_expect *exp,  			void *data) @@ -926,10 +1357,9 @@ static int display_proc_conntrack_stats(void)  	/* trim off trailing \n */  	nl = strchr(buf, '\n'); -	if (nl != NULL) { +	if (nl != NULL)  		*nl = '\0'; -		nl = strchr(buf, '\n'); -	} +  	token = strtok(buf, " ");  	for (i=0; token != NULL && i<CT_STATS_ENTRIES_MAX; i++) {  		strncpy(output[i], token, CT_STATS_STRING_MAX); @@ -964,66 +1394,6 @@ out_err:  static struct ctproto_handler *h; -static const int cmd2type[][2] = { -	['L']	= { CT_LIST, 	EXP_LIST }, -	['I']	= { CT_CREATE,	EXP_CREATE }, -	['D']	= { CT_DELETE,	EXP_DELETE }, -	['G']	= { CT_GET,	EXP_GET }, -	['F']	= { CT_FLUSH,	EXP_FLUSH }, -	['E']	= { CT_EVENT,	EXP_EVENT }, -	['V']	= { CT_VERSION,	CT_VERSION }, -	['h']	= { CT_HELP,	CT_HELP }, -	['C']	= { CT_COUNT,	EXP_COUNT }, -}; - -static const int opt2type[] = { -	['s']	= CT_OPT_ORIG_SRC, -	['d']	= CT_OPT_ORIG_DST, -	['r']	= CT_OPT_REPL_SRC, -	['q']	= CT_OPT_REPL_DST, -	['{']	= CT_OPT_MASK_SRC, -	['}']	= CT_OPT_MASK_DST, -	['[']	= CT_OPT_EXP_SRC, -	[']']	= CT_OPT_EXP_DST, -	['n']	= CT_OPT_SRC_NAT, -	['g']	= CT_OPT_DST_NAT, -	['m']	= CT_OPT_MARK, -	['c']	= CT_OPT_SECMARK, -	['i']	= CT_OPT_ID, -}; - -static const int opt2family_attr[][2] = { -	['s']	= { ATTR_ORIG_IPV4_SRC,	ATTR_ORIG_IPV6_SRC }, -	['d']	= { ATTR_ORIG_IPV4_DST,	ATTR_ORIG_IPV6_DST }, -	['r']	= { ATTR_REPL_IPV4_SRC, ATTR_REPL_IPV6_SRC }, -	['q']	= { ATTR_REPL_IPV4_DST, ATTR_REPL_IPV6_DST }, -	['{']	= { ATTR_ORIG_IPV4_SRC,	ATTR_ORIG_IPV6_SRC }, -	['}']	= { ATTR_ORIG_IPV4_DST,	ATTR_ORIG_IPV6_DST }, -	['[']	= { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, -	[']']	= { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, -}; - -static const int opt2attr[] = { -	['s']	= ATTR_ORIG_L3PROTO, -	['d']	= ATTR_ORIG_L3PROTO, -	['r']	= ATTR_REPL_L3PROTO, -	['q']	= ATTR_REPL_L3PROTO, -	['m']	= ATTR_MARK, -	['c']	= ATTR_SECMARK, -	['i']	= ATTR_ID, -}; - -static char exit_msg[NUMBER_OF_CMD][64] = { -	[CT_LIST_BIT] 		= "%d flow entries have been shown.\n", -	[CT_CREATE_BIT]		= "%d flow entries have been created.\n", -	[CT_UPDATE_BIT]		= "%d flow entries have been updated.\n", -	[CT_DELETE_BIT]		= "%d flow entries have been deleted.\n", -	[CT_GET_BIT] 		= "%d flow entries have been shown.\n", -	[CT_EVENT_BIT]		= "%d flow events have been shown.\n", -	[EXP_LIST_BIT]		= "%d expectations have been shown.\n", -	[EXP_DELETE_BIT]	= "%d expectations have been shown.\n", -}; -  int main(int argc, char *argv[])  {  	int c, cmd; @@ -1031,23 +1401,13 @@ int main(int argc, char *argv[])  	int res = 0, partial;  	size_t socketbuffersize = 0;  	int family = AF_UNSPEC; -	char __obj[nfct_maxsize()]; -	char __exptuple[nfct_maxsize()]; -	char __mask[nfct_maxsize()]; -	struct nf_conntrack *obj = (struct nf_conntrack *)(void*) __obj; -	struct nf_conntrack *exptuple =  -		(struct nf_conntrack *)(void*) __exptuple; -	struct nf_conntrack *mask = (struct nf_conntrack *)(void*) __mask; -	char __exp[nfexp_maxsize()]; -	struct nf_expect *exp = (struct nf_expect *)(void*) __exp;  	int l3protonum, protonum = 0;  	union ct_address ad;  	unsigned int command = 0; -	memset(__obj, 0, sizeof(__obj)); -	memset(__exptuple, 0, sizeof(__exptuple)); -	memset(__mask, 0, sizeof(__mask)); -	memset(__exp, 0, sizeof(__exp)); +	/* we release these objects in the exit_error() path. */ +	if (!alloc_tmpl_objects()) +		exit_error(OTHER_PROBLEM, "out of memory");  	register_tcp();  	register_udp(); @@ -1062,10 +1422,7 @@ int main(int argc, char *argv[])  	/* disable explicit missing arguments error output from getopt_long */  	opterr = 0; -	while ((c = getopt_long(argc, argv, "L::I::U::D::G::E::F::hVs:d:r:q:" -					    "p:t:u:e:a:z[:]:{:}:m:i:f:o:n::" -					    "g::c:b:C::S",  -					    opts, NULL)) != -1) { +	while ((c = getopt_long(argc, argv, getopt_str, opts, NULL)) != -1) {  	switch(c) {  		/* commands */  		case 'L': @@ -1099,17 +1456,21 @@ int main(int argc, char *argv[])  			options |= opt2type[c];  			l3protonum = parse_addr(optarg, &ad); +			if (l3protonum == AF_UNSPEC) { +				exit_error(PARAMETER_PROBLEM, +					   "Invalid IP address `%s'", optarg); +			}  			set_family(&family, l3protonum);  			if (l3protonum == AF_INET) { -				nfct_set_attr_u32(obj, +				nfct_set_attr_u32(tmpl.ct,  						  opt2family_attr[c][0],  						  ad.v4);  			} else if (l3protonum == AF_INET6) { -				nfct_set_attr(obj, +				nfct_set_attr(tmpl.ct,  					      opt2family_attr[c][1],  					      &ad.v6);  			} -			nfct_set_attr_u8(obj, opt2attr[c], l3protonum); +			nfct_set_attr_u8(tmpl.ct, opt2attr[c], l3protonum);  			break;  		case '{':  		case '}': @@ -1117,17 +1478,22 @@ int main(int argc, char *argv[])  		case ']':  			options |= opt2type[c];  			l3protonum = parse_addr(optarg, &ad); +			if (l3protonum == AF_UNSPEC) { +				exit_error(PARAMETER_PROBLEM, +					   "Invalid IP address `%s'", optarg); +			}  			set_family(&family, l3protonum);  			if (l3protonum == AF_INET) { -				nfct_set_attr_u32(mask,  +				nfct_set_attr_u32(tmpl.mask,   						  opt2family_attr[c][0],  						  ad.v4);  			} else if (l3protonum == AF_INET6) { -				nfct_set_attr(mask, +				nfct_set_attr(tmpl.mask,  					      opt2family_attr[c][1],  					      &ad.v6);  			} -			nfct_set_attr_u8(mask, ATTR_ORIG_L3PROTO, l3protonum); +			nfct_set_attr_u8(tmpl.mask, +					 ATTR_ORIG_L3PROTO, l3protonum);  			break;  		case 'p':  			options |= CT_OPT_PROTO; @@ -1141,17 +1507,18 @@ int main(int argc, char *argv[])  			if (opts == NULL)  				exit_error(OTHER_PROBLEM, "out of memory"); -			nfct_set_attr_u8(obj, ATTR_L4PROTO, protonum); +			nfct_set_attr_u8(tmpl.ct, ATTR_L4PROTO, protonum);  			break;  		case 't':  			options |= CT_OPT_TIMEOUT; -			nfct_set_attr_u32(obj, ATTR_TIMEOUT, atol(optarg)); -			nfexp_set_attr_u32(exp, ATTR_EXP_TIMEOUT, atol(optarg)); +			nfct_set_attr_u32(tmpl.ct, ATTR_TIMEOUT, atol(optarg)); +			nfexp_set_attr_u32(tmpl.exp, +					   ATTR_EXP_TIMEOUT, atol(optarg));  			break;  		case 'u':  			options |= CT_OPT_STATUS;  			parse_parameter(optarg, &status, PARSE_STATUS); -			nfct_set_attr_u32(obj, ATTR_STATUS, status); +			nfct_set_attr_u32(tmpl.ct, ATTR_STATUS, status);  			break;  		case 'e':  			options |= CT_OPT_EVENT_MASK; @@ -1165,7 +1532,8 @@ int main(int argc, char *argv[])  			options |= CT_OPT_ZERO;  			break;  		case 'n': -		case 'g': { +		case 'g': +		case 'j': {  			char *tmp = NULL;  			options |= opt2type[c]; @@ -1180,17 +1548,26 @@ int main(int argc, char *argv[])  				continue;  			set_family(&family, AF_INET); -			nat_parse(tmp, 1, obj, opt2type[c]); +			nat_parse(tmp, tmpl.ct, opt2type[c]);  			break;  		} +		case 'w': +			options |= opt2type[c]; +			nfct_set_attr_u16(tmpl.ct, +					  opt2attr[c], +					  strtoul(optarg, NULL, 0)); +			break;  		case 'i': -		case 'm':  		case 'c':  			options |= opt2type[c]; -			nfct_set_attr_u32(obj, +			nfct_set_attr_u32(tmpl.ct,  					  opt2attr[c],  					  strtoul(optarg, NULL, 0));  			break; +		case 'm': +			options |= opt2type[c]; +			parse_u32_mask(optarg, &tmpl.mark); +			break;  		case 'a':  			fprintf(stderr, "WARNING: ignoring -%c, "  					"deprecated option.\n", c); @@ -1222,8 +1599,9 @@ int main(int argc, char *argv[])  			break;  		default:  			if (h && h->parse_opts  -			    &&!h->parse_opts(c - h->option_offset, obj, -			    		     exptuple, mask, &l4flags)) +			    &&!h->parse_opts(c - h->option_offset, tmpl.ct, +			    		     tmpl.exptuple, tmpl.mask, +					     &l4flags))  				exit_error(PARAMETER_PROBLEM, "parse error");  			break;  		} @@ -1233,6 +1611,12 @@ int main(int argc, char *argv[])  	if (family == AF_UNSPEC)  		family = AF_INET; +	/* we cannot check this combination with generic_opt_check. */ +	if (options & CT_OPT_ANY_NAT && +	   ((options & CT_OPT_SRC_NAT) || (options & CT_OPT_DST_NAT))) { +		exit_error(PARAMETER_PROBLEM, "cannot specify `--src-nat' or " +					      "`--dst-nat' with `--any-nat'"); +	}  	cmd = bit2cmd(command);  	res = generic_opt_check(options, NUMBER_OF_OPT,  				commands_v_options[cmd], optflags, @@ -1253,7 +1637,7 @@ int main(int argc, char *argv[])  		}  	}  	if (!(command & CT_HELP) && h && h->final_check) -		h->final_check(l4flags, cmd, obj); +		h->final_check(l4flags, cmd, tmpl.ct);  	switch(command) { @@ -1267,7 +1651,7 @@ int main(int argc, char *argv[])  			exit_error(PARAMETER_PROBLEM, "Can't use -z with "  						      "filtering parameters"); -		nfct_callback_register(cth, NFCT_T_ALL, dump_cb, obj); +		nfct_callback_register(cth, NFCT_T_ALL, dump_cb, tmpl.ct);  		if (options & CT_OPT_ZERO)  			res = nfct_query(cth, NFCT_Q_DUMP_RESET, &family); @@ -1294,30 +1678,33 @@ int main(int argc, char *argv[])  	case CT_CREATE:  		if ((options & CT_OPT_ORIG) && !(options & CT_OPT_REPL)) -		    	nfct_setobjopt(obj, NFCT_SOPT_SETUP_REPLY); +		    	nfct_setobjopt(tmpl.ct, NFCT_SOPT_SETUP_REPLY);  		else if (!(options & CT_OPT_ORIG) && (options & CT_OPT_REPL)) -			nfct_setobjopt(obj, NFCT_SOPT_SETUP_ORIGINAL); +			nfct_setobjopt(tmpl.ct, NFCT_SOPT_SETUP_ORIGINAL); + +		if (options & CT_OPT_MARK) +			nfct_set_attr_u32(tmpl.ct, ATTR_MARK, tmpl.mark.value);  		cth = nfct_open(CONNTRACK, 0);  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		res = nfct_query(cth, NFCT_Q_CREATE, obj); +		res = nfct_query(cth, NFCT_Q_CREATE, tmpl.ct);  		if (res != -1)  			counter++;  		nfct_close(cth);  		break;  	case EXP_CREATE: -		nfexp_set_attr(exp, ATTR_EXP_MASTER, obj); -		nfexp_set_attr(exp, ATTR_EXP_EXPECTED, exptuple); -		nfexp_set_attr(exp, ATTR_EXP_MASK, mask); +		nfexp_set_attr(tmpl.exp, ATTR_EXP_MASTER, tmpl.ct); +		nfexp_set_attr(tmpl.exp, ATTR_EXP_EXPECTED, tmpl.exptuple); +		nfexp_set_attr(tmpl.exp, ATTR_EXP_MASK, tmpl.mask);  		cth = nfct_open(EXPECT, 0);  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		res = nfexp_query(cth, NFCT_Q_CREATE, exp); +		res = nfexp_query(cth, NFCT_Q_CREATE, tmpl.exp);  		nfct_close(cth);  		break; @@ -1328,7 +1715,7 @@ int main(int argc, char *argv[])  		if (!cth || !ith)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		nfct_callback_register(cth, NFCT_T_ALL, update_cb, obj); +		nfct_callback_register(cth, NFCT_T_ALL, update_cb, tmpl.ct);  		res = nfct_query(cth, NFCT_Q_DUMP, &family);  		nfct_close(ith); @@ -1341,7 +1728,7 @@ int main(int argc, char *argv[])  		if (!cth || !ith)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		nfct_callback_register(cth, NFCT_T_ALL, delete_cb, obj); +		nfct_callback_register(cth, NFCT_T_ALL, delete_cb, tmpl.ct);  		res = nfct_query(cth, NFCT_Q_DUMP, &family);  		nfct_close(ith); @@ -1349,13 +1736,13 @@ int main(int argc, char *argv[])  		break;  	case EXP_DELETE: -		nfexp_set_attr(exp, ATTR_EXP_EXPECTED, obj); +		nfexp_set_attr(tmpl.exp, ATTR_EXP_EXPECTED, tmpl.ct);  		cth = nfct_open(EXPECT, 0);  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		res = nfexp_query(cth, NFCT_Q_DESTROY, exp); +		res = nfexp_query(cth, NFCT_Q_DESTROY, tmpl.exp);  		nfct_close(cth);  		break; @@ -1364,20 +1751,20 @@ int main(int argc, char *argv[])  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler"); -		nfct_callback_register(cth, NFCT_T_ALL, dump_cb, obj); -		res = nfct_query(cth, NFCT_Q_GET, obj); +		nfct_callback_register(cth, NFCT_T_ALL, dump_cb, tmpl.ct); +		res = nfct_query(cth, NFCT_Q_GET, tmpl.ct);  		nfct_close(cth);  		break;  	case EXP_GET: -		nfexp_set_attr(exp, ATTR_EXP_MASTER, obj); +		nfexp_set_attr(tmpl.exp, ATTR_EXP_MASTER, tmpl.ct);  		cth = nfct_open(EXPECT, 0);  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler");  		nfexp_callback_register(cth, NFCT_T_ALL, dump_exp_cb, NULL); -		res = nfexp_query(cth, NFCT_Q_GET, exp); +		res = nfexp_query(cth, NFCT_Q_GET, tmpl.exp);  		nfct_close(cth);  		break; @@ -1397,14 +1784,28 @@ int main(int argc, char *argv[])  			exit_error(OTHER_PROBLEM, "Can't open handler");  		res = nfexp_query(cth, NFCT_Q_FLUSH, &family);  		nfct_close(cth); +		fprintf(stderr, "%s v%s (conntrack-tools): ",PROGNAME,VERSION); +		fprintf(stderr,"expectation table has been emptied.\n");  		break;  	case CT_EVENT: -		if (options & CT_OPT_EVENT_MASK) +		if (options & CT_OPT_EVENT_MASK) { +			unsigned int nl_events = 0; + +			if (event_mask & CT_EVENT_F_NEW) +				nl_events |= NF_NETLINK_CONNTRACK_NEW; +			if (event_mask & CT_EVENT_F_UPD) +				nl_events |= NF_NETLINK_CONNTRACK_UPDATE; +			if (event_mask & CT_EVENT_F_DEL) +				nl_events |= NF_NETLINK_CONNTRACK_DESTROY; + +			cth = nfct_open(CONNTRACK, nl_events); +		} else {  			cth = nfct_open(CONNTRACK, -					event_mask & NFCT_ALL_CT_GROUPS); -		else -			cth = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS); +					NF_NETLINK_CONNTRACK_NEW | +					NF_NETLINK_CONNTRACK_UPDATE | +					NF_NETLINK_CONNTRACK_DESTROY); +		}  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler"); @@ -1417,7 +1818,7 @@ int main(int argc, char *argv[])  		}  		signal(SIGINT, event_sighandler);  		signal(SIGTERM, event_sighandler); -		nfct_callback_register(cth, NFCT_T_ALL, event_cb, obj); +		nfct_callback_register(cth, NFCT_T_ALL, event_cb, tmpl.ct);  		res = nfct_catch(cth);  		if (res == -1) {  			if (errno == ENOBUFS) { @@ -1434,12 +1835,29 @@ int main(int argc, char *argv[])  		break;  	case EXP_EVENT: -		cth = nfct_open(EXPECT, NF_NETLINK_CONNTRACK_EXP_NEW); +		if (options & CT_OPT_EVENT_MASK) { +			unsigned int nl_events = 0; + +			if (event_mask & CT_EVENT_F_NEW) +				nl_events |= NF_NETLINK_CONNTRACK_EXP_NEW; +			if (event_mask & CT_EVENT_F_UPD) +				nl_events |= NF_NETLINK_CONNTRACK_EXP_UPDATE; +			if (event_mask & CT_EVENT_F_DEL) +				nl_events |= NF_NETLINK_CONNTRACK_EXP_DESTROY; + +			cth = nfct_open(CONNTRACK, nl_events); +		} else { +			cth = nfct_open(EXPECT, +					NF_NETLINK_CONNTRACK_EXP_NEW | +					NF_NETLINK_CONNTRACK_EXP_UPDATE | +					NF_NETLINK_CONNTRACK_EXP_DESTROY); +		} +  		if (!cth)  			exit_error(OTHER_PROBLEM, "Can't open handler");  		signal(SIGINT, event_sighandler);  		signal(SIGTERM, event_sighandler); -		nfexp_callback_register(cth, NFCT_T_ALL, dump_exp_cb, NULL); +		nfexp_callback_register(cth, NFCT_T_ALL, event_exp_cb, NULL);  		res = nfexp_catch(cth);  		nfct_close(cth);  		break; @@ -1491,6 +1909,7 @@ int main(int argc, char *argv[])  		exit_error(OTHER_PROBLEM, "Operation failed: %s",  			   err2str(errno, command)); +	free_tmpl_objects();  	free_options();  	if (command && exit_msg[cmd][0]) { diff --git a/src/external_cache.c b/src/external_cache.c index c70c818..e290249 100644 --- a/src/external_cache.c +++ b/src/external_cache.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -25,25 +26,35 @@  #include <stdlib.h>  static struct cache *external; +static struct cache *external_exp;  static int external_cache_init(void)  { -	external = cache_create("external", +	external = cache_create("external", CACHE_T_CT,  				STATE_SYNC(sync)->external_cache_flags, -				NULL); +				NULL, &cache_sync_external_ct_ops);  	if (external == NULL) {  		dlog(LOG_ERR, "can't allocate memory for the external cache");  		return -1;  	} +	external_exp = cache_create("external", CACHE_T_EXP, +				STATE_SYNC(sync)->external_cache_flags, +				NULL, &cache_sync_external_exp_ops); +	if (external_exp == NULL) { +		dlog(LOG_ERR, "can't allocate memory for the external cache"); +		return -1; +	} +  	return 0;  }  static void external_cache_close(void)  {  	cache_destroy(external); +	cache_destroy(external_exp);  } -static void external_cache_new(struct nf_conntrack *ct) +static void external_cache_ct_new(struct nf_conntrack *ct)  {  	struct cache_object *obj;  	int id; @@ -66,12 +77,12 @@ retry:  	}  } -static void external_cache_upd(struct nf_conntrack *ct) +static void external_cache_ct_upd(struct nf_conntrack *ct)  {  	cache_update_force(external, ct);  } -static void external_cache_del(struct nf_conntrack *ct) +static void external_cache_ct_del(struct nf_conntrack *ct)  {  	struct cache_object *obj;  	int id; @@ -83,40 +94,117 @@ static void external_cache_del(struct nf_conntrack *ct)  	}  } -static void external_cache_dump(int fd, int type) +static void external_cache_ct_dump(int fd, int type)  {  	cache_dump(external, fd, type);  } -static void external_cache_commit(struct nfct_handle *h, int fd) +static int external_cache_ct_commit(struct nfct_handle *h, int fd)  { -	cache_commit(external, h, fd); +	return cache_commit(external, h, fd);  } -static void external_cache_flush(void) +static void external_cache_ct_flush(void)  {  	cache_flush(external);  } -static void external_cache_stats(int fd) +static void external_cache_ct_stats(int fd)  {  	cache_stats(external, fd);  } -static void external_cache_stats_ext(int fd) +static void external_cache_ct_stats_ext(int fd)  {  	cache_stats_extended(external, fd);  } +static void external_cache_exp_new(struct nf_expect *exp) +{ +	struct cache_object *obj; +	int id; + +	obj = cache_find(external_exp, exp, &id); +	if (obj == NULL) { +retry: +		obj = cache_object_new(external_exp, exp); +		if (obj == NULL) +			return; + +		if (cache_add(external_exp, obj, id) == -1) { +			cache_object_free(obj); +			return; +		} +	} else { +		cache_del(external_exp, obj); +		cache_object_free(obj); +		goto retry; +	} +} + +static void external_cache_exp_upd(struct nf_expect *exp) +{ +	cache_update_force(external_exp, exp); +} + +static void external_cache_exp_del(struct nf_expect *exp) +{ +	struct cache_object *obj; +	int id; + +	obj = cache_find(external_exp, exp, &id); +	if (obj) { +		cache_del(external_exp, obj); +		cache_object_free(obj); +	} +} + +static void external_cache_exp_dump(int fd, int type) +{ +	cache_dump(external_exp, fd, type); +} + +static int external_cache_exp_commit(struct nfct_handle *h, int fd) +{ +	return cache_commit(external_exp, h, fd); +} + +static void external_cache_exp_flush(void) +{ +	cache_flush(external_exp); +} + +static void external_cache_exp_stats(int fd) +{ +	cache_stats(external_exp, fd); +} + +static void external_cache_exp_stats_ext(int fd) +{ +	cache_stats_extended(external_exp, fd); +} +  struct external_handler external_cache = {  	.init		= external_cache_init,  	.close		= external_cache_close, -	.new		= external_cache_new, -	.update		= external_cache_upd, -	.destroy	= external_cache_del, -	.dump		= external_cache_dump, -	.commit		= external_cache_commit, -	.flush		= external_cache_flush, -	.stats		= external_cache_stats, -	.stats_ext	= external_cache_stats_ext, +	.ct = { +		.new		= external_cache_ct_new, +		.upd		= external_cache_ct_upd, +		.del		= external_cache_ct_del, +		.dump		= external_cache_ct_dump, +		.commit		= external_cache_ct_commit, +		.flush		= external_cache_ct_flush, +		.stats		= external_cache_ct_stats, +		.stats_ext	= external_cache_ct_stats_ext, +	}, +	.exp = { +		.new		= external_cache_exp_new, +		.upd		= external_cache_exp_upd, +		.del		= external_cache_exp_del, +		.dump		= external_cache_exp_dump, +		.commit		= external_cache_exp_commit, +		.flush		= external_cache_exp_flush, +		.stats		= external_cache_exp_stats, +		.stats_ext	= external_cache_exp_stats_ext, +	},  }; diff --git a/src/external_inject.c b/src/external_inject.c index a54bb13..0ad3478 100644 --- a/src/external_inject.c +++ b/src/external_inject.c @@ -1,6 +1,7 @@  /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -41,7 +42,7 @@ struct {  static int external_inject_init(void)  {  	/* handler to directly inject conntracks into kernel-space */ -	inject = nfct_open(CONNTRACK, 0); +	inject = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (inject == NULL) {  		dlog(LOG_ERR, "can't open netlink handler: %s",  		     strerror(errno)); @@ -59,7 +60,7 @@ static void external_inject_close(void)  	nfct_close(inject);  } -static void external_inject_new(struct nf_conntrack *ct) +static void external_inject_ct_new(struct nf_conntrack *ct)  {  	int ret, retry = 1; @@ -87,7 +88,7 @@ retry:  	}  } -static void external_inject_upd(struct nf_conntrack *ct) +static void external_inject_ct_upd(struct nf_conntrack *ct)  {  	int ret; @@ -128,7 +129,7 @@ static void external_inject_upd(struct nf_conntrack *ct)  	dlog_ct(STATE(log), ct, NFCT_O_PLAIN);  } -static void external_inject_del(struct nf_conntrack *ct) +static void external_inject_ct_del(struct nf_conntrack *ct)  {  	if (nl_destroy_conntrack(inject, ct) == -1) {  		if (errno != ENOENT) { @@ -141,19 +142,21 @@ static void external_inject_del(struct nf_conntrack *ct)  	}  } -static void external_inject_dump(int fd, int type) +static void external_inject_ct_dump(int fd, int type)  {  } -static void external_inject_commit(struct nfct_handle *h, int fd) +static int external_inject_ct_commit(struct nfct_handle *h, int fd)  { +	/* close the commit socket. */ +	return LOCAL_RET_OK;  } -static void external_inject_flush(void) +static void external_inject_ct_flush(void)  {  } -static void external_inject_stats(int fd) +static void external_inject_ct_stats(int fd)  {  	char buf[512];  	int size; @@ -172,15 +175,110 @@ static void external_inject_stats(int fd)  	send(fd, buf, size, 0);  } +struct { +	uint32_t	add_ok; +	uint32_t	add_fail; +	uint32_t	upd_ok; +	uint32_t	upd_fail; +	uint32_t	del_ok; +	uint32_t	del_fail; +} exp_external_inject_stat; + +static void external_inject_exp_new(struct nf_expect *exp) +{ +	int ret, retry = 1; + +retry: +	if (nl_create_expect(inject, exp, 0) == -1) { +		/* if the state entry exists, we delete and try again */ +		if (errno == EEXIST && retry == 1) { +			ret = nl_destroy_expect(inject, exp); +			if (ret == 0 || (ret == -1 && errno == ENOENT)) { +				if (retry) { +					retry = 0; +					goto retry; +				} +			} +			exp_external_inject_stat.add_fail++; +			dlog(LOG_ERR, "inject-add1: %s", strerror(errno)); +			dlog_exp(STATE(log), exp, NFCT_O_PLAIN); +			return; +		} +		exp_external_inject_stat.add_fail++; +		dlog(LOG_ERR, "inject-add2: %s", strerror(errno)); +		dlog_exp(STATE(log), exp, NFCT_O_PLAIN); +	} else { +		exp_external_inject_stat.add_ok++; +	} +} + +static void external_inject_exp_del(struct nf_expect *exp) +{ +	if (nl_destroy_expect(inject, exp) == -1) { +		if (errno != ENOENT) { +			exp_external_inject_stat.del_fail++; +			dlog(LOG_ERR, "inject-del: %s", strerror(errno)); +			dlog_exp(STATE(log), exp, NFCT_O_PLAIN); +		} +	} else { +		exp_external_inject_stat.del_ok++; +	} +} + +static void external_inject_exp_dump(int fd, int type) +{ +} + +static int external_inject_exp_commit(struct nfct_handle *h, int fd) +{ +	/* close the commit socket. */ +	return LOCAL_RET_OK; +} + +static void external_inject_exp_flush(void) +{ +} + +static void external_inject_exp_stats(int fd) +{ +	char buf[512]; +	int size; + +	size = sprintf(buf, "external inject:\n" +			    "connections created:\t\t%12u\tfailed:\t%12u\n" +			    "connections updated:\t\t%12u\tfailed:\t%12u\n" +			    "connections destroyed:\t\t%12u\tfailed:\t%12u\n\n", +			    exp_external_inject_stat.add_ok, +			    exp_external_inject_stat.add_fail, +			    exp_external_inject_stat.upd_ok, +			    exp_external_inject_stat.upd_fail, +			    exp_external_inject_stat.del_ok, +			    exp_external_inject_stat.del_fail); + +	send(fd, buf, size, 0); +} +  struct external_handler external_inject = {  	.init		= external_inject_init,  	.close		= external_inject_close, -	.new		= external_inject_new, -	.update		= external_inject_upd, -	.destroy	= external_inject_del, -	.dump		= external_inject_dump, -	.commit		= external_inject_commit, -	.flush		= external_inject_flush, -	.stats		= external_inject_stats, -	.stats_ext	= external_inject_stats, +	.ct = { +		.new		= external_inject_ct_new, +		.upd		= external_inject_ct_upd, +		.del		= external_inject_ct_del, +		.dump		= external_inject_ct_dump, +		.commit		= external_inject_ct_commit, +		.flush		= external_inject_ct_flush, +		.stats		= external_inject_ct_stats, +		.stats_ext	= external_inject_ct_stats, +	}, +	.exp = { +		.new		= external_inject_exp_new, +		.upd		= external_inject_exp_new, +		.del		= external_inject_exp_del, +		.dump		= external_inject_exp_dump, +		.commit		= external_inject_exp_commit, +		.flush		= external_inject_exp_flush, +		.stats		= external_inject_exp_stats, +		.stats_ext	= external_inject_exp_stats, +	},  }; diff --git a/src/filter.c b/src/filter.c index 6a09c77..e8515d6 100644 --- a/src/filter.c +++ b/src/filter.c @@ -235,7 +235,7 @@ void ct_filter_add_state(struct ct_filter *f, int protonum, int val)  }  static inline int -__ct_filter_test_ipv4(struct ct_filter *f, struct nf_conntrack *ct) +__ct_filter_test_ipv4(struct ct_filter *f, const struct nf_conntrack *ct)  {  	int id_src, id_dst;  	uint32_t src, dst; @@ -252,7 +252,7 @@ __ct_filter_test_ipv4(struct ct_filter *f, struct nf_conntrack *ct)  }  static inline int -__ct_filter_test_ipv6(struct ct_filter *f, struct nf_conntrack *ct) +__ct_filter_test_ipv6(struct ct_filter *f, const struct nf_conntrack *ct)  {  	int id_src, id_dst;  	const uint32_t *src, *dst; @@ -295,7 +295,8 @@ __ct_filter_test_mask6(const void *ptr, const void *ct)  		 (elem->ip[3] & elem->mask[3]) == (dst[3] & elem->mask[3])));  } -static int __ct_filter_test_state(struct ct_filter *f, struct nf_conntrack *ct) +static int +__ct_filter_test_state(struct ct_filter *f, const struct nf_conntrack *ct)  {  	uint16_t val = 0;  	uint8_t protonum = nfct_get_attr_u8(ct, ATTR_L4PROTO); @@ -314,7 +315,8 @@ static int __ct_filter_test_state(struct ct_filter *f, struct nf_conntrack *ct)  	return test_bit_u16(val, &f->statemap[protonum]);  } -static int ct_filter_check(struct ct_filter *f, struct nf_conntrack *ct) +static int +ct_filter_check(struct ct_filter *f, const struct nf_conntrack *ct)  {  	int ret, protonum = nfct_get_attr_u8(ct, ATTR_L4PROTO); @@ -361,7 +363,7 @@ static int ct_filter_check(struct ct_filter *f, struct nf_conntrack *ct)  	return 1;  } -static inline int ct_filter_sanity_check(struct nf_conntrack *ct) +static inline int ct_filter_sanity_check(const struct nf_conntrack *ct)  {  	if (!nfct_attr_is_set(ct, ATTR_L3PROTO)) {  		dlog(LOG_ERR, "missing layer 3 protocol"); @@ -371,9 +373,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct)  	switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) {  	case AF_INET:  		if (!nfct_attr_is_set(ct, ATTR_IPV4_SRC) || -		    !nfct_attr_is_set(ct, ATTR_IPV4_DST) || -		    !nfct_attr_is_set(ct, ATTR_REPL_IPV4_SRC) || -		    !nfct_attr_is_set(ct, ATTR_REPL_IPV4_DST)) { +		    !nfct_attr_is_set(ct, ATTR_IPV4_DST)) {  		    	dlog(LOG_ERR, "missing IPv4 address. "  				      "You forgot to load "  				      "nf_conntrack_ipv4?"); @@ -382,9 +382,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct)  		break;  	case AF_INET6:  		if (!nfct_attr_is_set(ct, ATTR_IPV6_SRC) || -		    !nfct_attr_is_set(ct, ATTR_IPV6_DST) || -		    !nfct_attr_is_set(ct, ATTR_REPL_IPV6_SRC) || -		    !nfct_attr_is_set(ct, ATTR_REPL_IPV6_DST)) { +		    !nfct_attr_is_set(ct, ATTR_IPV6_DST)) {  		    	dlog(LOG_ERR, "missing IPv6 address. "  				      "You forgot to load "  				      "nf_conntrack_ipv6?"); @@ -396,7 +394,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct)  }  /* we do user-space filtering for dump and resyncs */ -int ct_filter_conntrack(struct nf_conntrack *ct, int userspace) +int ct_filter_conntrack(const struct nf_conntrack *ct, int userspace)  {  	/* missing mandatory attributes in object */  	if (!ct_filter_sanity_check(ct)) @@ -407,3 +405,79 @@ int ct_filter_conntrack(struct nf_conntrack *ct, int userspace)  	return 0;  } + +struct exp_filter { +	struct list_head 	list; +}; + +struct exp_filter *exp_filter_create(void) +{ +	struct exp_filter *f; + +	f = calloc(1, sizeof(struct exp_filter)); +	if (f == NULL) +		return NULL; + +	INIT_LIST_HEAD(&f->list); +	return f; +} + +struct exp_filter_item { +	struct list_head	head; +	char			helper_name[NFCT_HELPER_NAME_MAX]; +}; + +/* this is ugly, but it simplifies read_config_yy.y */ +static struct exp_filter *exp_filter_alloc(void) +{ +	if (STATE(exp_filter) == NULL) { +		STATE(exp_filter) = exp_filter_create(); +		if (STATE(exp_filter) == NULL) { +			fprintf(stderr, "Can't init expectation filtering!\n"); +			return NULL; +		} +	} +	return STATE(exp_filter);; +} + +int exp_filter_add(struct exp_filter *f, const char *helper_name) +{ +	struct exp_filter_item *item; + +	f = exp_filter_alloc(); +	if (f == NULL) +		return -1; + +	list_for_each_entry(item, &f->list, head) { +		if (strncmp(item->helper_name, helper_name, +				NFCT_HELPER_NAME_MAX) == 0) { +			return -1; +		} +	} +	item = calloc(1, sizeof(struct exp_filter_item)); +	if (item == NULL) +		return -1; + +	strncpy(item->helper_name, helper_name, NFCT_HELPER_NAME_MAX); +	list_add(&item->head, &f->list); +	return 0; +} + +int exp_filter_find(struct exp_filter *f, const struct nf_expect *exp) +{ +	struct exp_filter_item *item; + +	if (f == NULL) +		return 0; + +	list_for_each_entry(item, &f->list, head) { +		const char *name = nfexp_get_attr(exp, ATTR_EXP_HELPER_NAME); + +		/* we allow partial matching to support things like sip-PORT. */ +		if (strncmp(item->helper_name, name, +				strlen(item->helper_name)) == 0) { +			return 1; +		} +	} +	return 0; +} diff --git a/src/internal_bypass.c b/src/internal_bypass.c index 4caaf4f..5c83c21 100644 --- a/src/internal_bypass.c +++ b/src/internal_bypass.c @@ -1,6 +1,7 @@  /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -16,21 +17,25 @@  #include "network.h"  #include "origin.h" -static int _init(void) +static int internal_bypass_init(void)  {  	return 0;  } -static void _close(void) +static void internal_bypass_close(void)  {  } -static int dump_cb(enum nf_conntrack_msg_type type, -		   struct nf_conntrack *ct, void *data) +static int +internal_bypass_ct_dump_cb(enum nf_conntrack_msg_type type, +			   struct nf_conntrack *ct, void *data)  {  	char buf[1024];  	int size, *fd = data; +	if (ct_filter_conntrack(ct, 1)) +		return NFCT_CB_CONTINUE; +  	size = nfct_snprintf(buf, 1024, ct, NFCT_T_UNKNOWN, NFCT_O_DEFAULT, 0);  	if (size < 1024) {  		buf[size] = '\n'; @@ -41,18 +46,18 @@ static int dump_cb(enum nf_conntrack_msg_type type,  	return NFCT_CB_CONTINUE;  } -static void dump(int fd, int type) +static void internal_bypass_ct_dump(int fd, int type)  {  	struct nfct_handle *h;  	u_int32_t family = AF_UNSPEC;  	int ret; -	h = nfct_open(CONNTRACK, 0); +	h = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (h == NULL) {  		dlog(LOG_ERR, "can't allocate memory for the internal cache");  		return;  	} -	nfct_callback_register(h, NFCT_T_ALL, dump_cb, &fd); +	nfct_callback_register(h, NFCT_T_ALL, internal_bypass_ct_dump_cb, &fd);  	ret = nfct_query(h, NFCT_Q_DUMP, &family);  	if (ret == -1) {  		dlog(LOG_ERR, "can't dump kernel table"); @@ -60,7 +65,7 @@ static void dump(int fd, int type)  	nfct_close(h);  } -static void flush(void) +static void internal_bypass_ct_flush(void)  {  	nl_flush_conntrack_table(STATE(flush));  } @@ -71,7 +76,7 @@ struct {  	uint32_t	del;  } internal_bypass_stats; -static void stats(int fd) +static void internal_bypass_ct_stats(int fd)  {  	char buf[512];  	int size; @@ -88,25 +93,24 @@ static void stats(int fd)  }  /* unused, INTERNAL_F_POPULATE is unset. No cache, nothing to populate. */ -static void populate(struct nf_conntrack *ct) +static void internal_bypass_ct_populate(struct nf_conntrack *ct)  {  }  /* unused, INTERNAL_F_RESYNC is unset. */ -static void purge(void) +static void internal_bypass_ct_purge(void)  {  }  /* unused, INTERNAL_F_RESYNC is unset. Nothing to resync, we have no cache. */ -static int resync(enum nf_conntrack_msg_type type, -		  struct nf_conntrack *ct, -		  void *data) +static int +internal_bypass_ct_resync(enum nf_conntrack_msg_type type, +			  struct nf_conntrack *ct, void *data)  {  	return NFCT_CB_CONTINUE;  } -static void -event_new_sync(struct nf_conntrack *ct, int origin) +static void internal_bypass_ct_event_new(struct nf_conntrack *ct, int origin)  {  	struct nethdr *net; @@ -114,13 +118,12 @@ event_new_sync(struct nf_conntrack *ct, int origin)  	if (origin != CTD_ORIGIN_NOT_ME)  		return; -	net = BUILD_NETMSG(ct, NET_T_STATE_NEW); +	net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_NEW);  	multichannel_send(STATE_SYNC(channel), net);  	internal_bypass_stats.new++;  } -static void -event_update_sync(struct nf_conntrack *ct, int origin) +static void internal_bypass_ct_event_upd(struct nf_conntrack *ct, int origin)  {  	struct nethdr *net; @@ -128,13 +131,12 @@ event_update_sync(struct nf_conntrack *ct, int origin)  	if (origin != CTD_ORIGIN_NOT_ME)  		return; -	net = BUILD_NETMSG(ct, NET_T_STATE_UPD); +	net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_UPD);  	multichannel_send(STATE_SYNC(channel), net);  	internal_bypass_stats.upd++;  } -static int -event_destroy_sync(struct nf_conntrack *ct, int origin) +static int internal_bypass_ct_event_del(struct nf_conntrack *ct, int origin)  {  	struct nethdr *net; @@ -142,24 +144,170 @@ event_destroy_sync(struct nf_conntrack *ct, int origin)  	if (origin != CTD_ORIGIN_NOT_ME)  		return 1; -	net = BUILD_NETMSG(ct, NET_T_STATE_DEL); +	net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_DEL);  	multichannel_send(STATE_SYNC(channel), net);  	internal_bypass_stats.del++;  	return 1;  } +static int +internal_bypass_exp_dump_cb(enum nf_conntrack_msg_type type, +			    struct nf_expect *exp, void *data) +{ +	char buf[1024]; +	int size, *fd = data; +	const struct nf_conntrack *master = +		nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	if (!exp_filter_find(STATE(exp_filter), exp)) +		return NFCT_CB_CONTINUE; + +	if (ct_filter_conntrack(master, 1)) +		return NFCT_CB_CONTINUE; + +	size = nfexp_snprintf(buf, 1024, exp, +			      NFCT_T_UNKNOWN, NFCT_O_DEFAULT, 0); +	if (size < 1024) { +		buf[size] = '\n'; +		size++; +	} +	send(*fd, buf, size, 0); + +	return NFCT_CB_CONTINUE; +} + +static void internal_bypass_exp_dump(int fd, int type) +{ +	struct nfct_handle *h; +	u_int32_t family = AF_UNSPEC; +	int ret; + +	h = nfct_open(CONFIG(netlink).subsys_id, 0); +	if (h == NULL) { +		dlog(LOG_ERR, "can't allocate memory for the internal cache"); +		return; +	} +	nfexp_callback_register(h, NFCT_T_ALL, +				internal_bypass_exp_dump_cb, &fd); +	ret = nfexp_query(h, NFCT_Q_DUMP, &family); +	if (ret == -1) { +		dlog(LOG_ERR, "can't dump kernel table"); +	} +	nfct_close(h); +} + +static void internal_bypass_exp_flush(void) +{ +	nl_flush_expect_table(STATE(flush)); +} + +struct { +	uint32_t	new; +	uint32_t	upd; +	uint32_t	del; +} exp_internal_bypass_stats; + +static void internal_bypass_exp_stats(int fd) +{ +	char buf[512]; +	int size; + +	size = sprintf(buf, "internal bypass:\n" +			    "connections new:\t\t%12u\n" +			    "connections updated:\t\t%12u\n" +			    "connections destroyed:\t\t%12u\n\n", +			    exp_internal_bypass_stats.new, +			    exp_internal_bypass_stats.upd, +			    exp_internal_bypass_stats.del); + +	send(fd, buf, size, 0); +} + +/* unused, INTERNAL_F_POPULATE is unset. No cache, nothing to populate. */ +static void internal_bypass_exp_populate(struct nf_expect *exp) +{ +} + +/* unused, INTERNAL_F_RESYNC is unset. */ +static void internal_bypass_exp_purge(void) +{ +} + +/* unused, INTERNAL_F_RESYNC is unset. Nothing to resync, we have no cache. */ +static int +internal_bypass_exp_resync(enum nf_conntrack_msg_type type, +			   struct nf_expect *exp, void *data) +{ +	return NFCT_CB_CONTINUE; +} + +static void internal_bypass_exp_event_new(struct nf_expect *exp, int origin) +{ +	struct nethdr *net; + +	/* this event has been triggered by me, skip */ +	if (origin != CTD_ORIGIN_NOT_ME) +		return; + +	net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_NEW); +	multichannel_send(STATE_SYNC(channel), net); +	exp_internal_bypass_stats.new++; +} + +static void internal_bypass_exp_event_upd(struct nf_expect *exp, int origin) +{ +	struct nethdr *net; + +	/* this event has been triggered by me, skip */ +	if (origin != CTD_ORIGIN_NOT_ME) +		return; + +	net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_UPD); +	multichannel_send(STATE_SYNC(channel), net); +	exp_internal_bypass_stats.upd++; +} + +static int internal_bypass_exp_event_del(struct nf_expect *exp, int origin) +{ +	struct nethdr *net; + +	/* this event has been triggered by me, skip */ +	if (origin != CTD_ORIGIN_NOT_ME) +		return 1; + +	net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_DEL); +	multichannel_send(STATE_SYNC(channel), net); +	exp_internal_bypass_stats.del++; + +	return 1; +} +  struct internal_handler internal_bypass = { -	.init			= _init, -	.close			= _close, -	.dump			= dump, -	.flush			= flush, -	.stats			= stats, -	.stats_ext		= stats, -	.populate		= populate, -	.purge			= purge, -	.resync			= resync, -	.new			= event_new_sync, -	.update			= event_update_sync, -	.destroy		= event_destroy_sync, +	.init			= internal_bypass_init, +	.close			= internal_bypass_close, +	.ct = { +		.dump			= internal_bypass_ct_dump, +		.flush			= internal_bypass_ct_flush, +		.stats			= internal_bypass_ct_stats, +		.stats_ext		= internal_bypass_ct_stats, +		.populate		= internal_bypass_ct_populate, +		.purge			= internal_bypass_ct_purge, +		.resync			= internal_bypass_ct_resync, +		.new			= internal_bypass_ct_event_new, +		.upd			= internal_bypass_ct_event_upd, +		.del			= internal_bypass_ct_event_del, +	}, +	.exp = { +		.dump			= internal_bypass_exp_dump, +		.flush			= internal_bypass_exp_flush, +		.stats			= internal_bypass_exp_stats, +		.stats_ext		= internal_bypass_exp_stats, +		.populate		= internal_bypass_exp_populate, +		.purge			= internal_bypass_exp_purge, +		.resync			= internal_bypass_exp_resync, +		.new			= internal_bypass_exp_event_new, +		.upd			= internal_bypass_exp_event_upd, +		.del			= internal_bypass_exp_event_del, +	},  }; diff --git a/src/internal_cache.c b/src/internal_cache.c index daadfd6..ba2d74b 100644 --- a/src/internal_cache.c +++ b/src/internal_cache.c @@ -1,6 +1,7 @@  /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -19,46 +20,60 @@ static inline void sync_send(struct cache_object *obj, int query)  	STATE_SYNC(sync)->enqueue(obj, query);  } -static int _init(void) +static int internal_cache_init(void)  { -	STATE(mode)->internal->data = -		cache_create("internal",  +	STATE(mode)->internal->ct.data = +		cache_create("internal", CACHE_T_CT,  			     STATE_SYNC(sync)->internal_cache_flags, -			     STATE_SYNC(sync)->internal_cache_extra); +			     STATE_SYNC(sync)->internal_cache_extra, +			     &cache_sync_internal_ct_ops); -	if (!STATE(mode)->internal->data) { +	if (!STATE(mode)->internal->ct.data) {  		dlog(LOG_ERR, "can't allocate memory for the internal cache");  		return -1;  	} + +	STATE(mode)->internal->exp.data = +		cache_create("internal", CACHE_T_EXP, +			STATE_SYNC(sync)->internal_cache_flags, +			STATE_SYNC(sync)->internal_cache_extra, +			&cache_sync_internal_exp_ops); + +	if (!STATE(mode)->internal->exp.data) { +		dlog(LOG_ERR, "can't allocate memory for the internal cache"); +		return -1; +	} +  	return 0;  } -static void _close(void) +static void internal_cache_close(void)  { -	cache_destroy(STATE(mode)->internal->data); +	cache_destroy(STATE(mode)->internal->ct.data); +	cache_destroy(STATE(mode)->internal->exp.data);  } -static void dump(int fd, int type) +static void internal_cache_ct_dump(int fd, int type)  { -	cache_dump(STATE(mode)->internal->data, fd, NFCT_O_PLAIN); +	cache_dump(STATE(mode)->internal->ct.data, fd, type);  } -static void flush(void) +static void internal_cache_ct_flush(void)  { -	cache_flush(STATE(mode)->internal->data); +	cache_flush(STATE(mode)->internal->ct.data);  } -static void stats(int fd) +static void internal_cache_ct_stats(int fd)  { -	cache_stats(STATE(mode)->internal->data, fd); +	cache_stats(STATE(mode)->internal->ct.data, fd);  } -static void stats_ext(int fd) +static void internal_cache_ct_stats_ext(int fd)  { -	cache_stats_extended(STATE(mode)->internal->data, fd); +	cache_stats_extended(STATE(mode)->internal->ct.data, fd);  } -static void populate(struct nf_conntrack *ct) +static void internal_cache_ct_populate(struct nf_conntrack *ct)  {  	/* This is required by kernels < 2.6.20 */  	nfct_attr_unset(ct, ATTR_ORIG_COUNTER_BYTES); @@ -67,19 +82,19 @@ static void populate(struct nf_conntrack *ct)  	nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS);  	nfct_attr_unset(ct, ATTR_USE); -	cache_update_force(STATE(mode)->internal->data, ct); +	cache_update_force(STATE(mode)->internal->ct.data, ct);  } -static int purge_step(void *data1, void *data2) +static int internal_cache_ct_purge_step(void *data1, void *data2)  {  	struct cache_object *obj = data2;  	STATE(get_retval) = 0; -	nl_get_conntrack(STATE(get), obj->ct);	/* modifies STATE(get_reval) */ +	nl_get_conntrack(STATE(get), obj->ptr);	/* modifies STATE(get_reval) */  	if (!STATE(get_retval)) {  		if (obj->status != C_OBJ_DEAD) {  			cache_object_set_status(obj, C_OBJ_DEAD); -			sync_send(obj, NET_T_STATE_DEL); +			sync_send(obj, NET_T_STATE_CT_DEL);  			cache_object_put(obj);  		}  	} @@ -87,14 +102,15 @@ static int purge_step(void *data1, void *data2)  	return 0;  } -static void purge(void) +static void internal_cache_ct_purge(void)  { -	cache_iterate(STATE(mode)->internal->data, NULL, purge_step); +	cache_iterate(STATE(mode)->internal->ct.data, NULL, +			internal_cache_ct_purge_step);  } -static int resync(enum nf_conntrack_msg_type type, -		  struct nf_conntrack *ct, -		  void *data) +static int +internal_cache_ct_resync(enum nf_conntrack_msg_type type, +			 struct nf_conntrack *ct, void *data)  {  	struct cache_object *obj; @@ -108,23 +124,22 @@ static int resync(enum nf_conntrack_msg_type type,  	nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS);  	nfct_attr_unset(ct, ATTR_USE); -	obj = cache_update_force(STATE(mode)->internal->data, ct); +	obj = cache_update_force(STATE(mode)->internal->ct.data, ct);  	if (obj == NULL)  		return NFCT_CB_CONTINUE;  	switch (obj->status) {  	case C_OBJ_NEW: -		sync_send(obj, NET_T_STATE_NEW); +		sync_send(obj, NET_T_STATE_CT_NEW);  		break;  	case C_OBJ_ALIVE: -		sync_send(obj, NET_T_STATE_UPD); +		sync_send(obj, NET_T_STATE_CT_UPD);  		break;  	}  	return NFCT_CB_CONTINUE;  } -static void -event_new_sync(struct nf_conntrack *ct, int origin) +static void internal_cache_ct_event_new(struct nf_conntrack *ct, int origin)  {  	struct cache_object *obj;  	int id; @@ -139,13 +154,13 @@ event_new_sync(struct nf_conntrack *ct, int origin)  	nfct_attr_unset(ct, ATTR_REPL_COUNTER_BYTES);  	nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS); -	obj = cache_find(STATE(mode)->internal->data, ct, &id); +	obj = cache_find(STATE(mode)->internal->ct.data, ct, &id);  	if (obj == NULL) {  retry: -		obj = cache_object_new(STATE(mode)->internal->data, ct); +		obj = cache_object_new(STATE(mode)->internal->ct.data, ct);  		if (obj == NULL)  			return; -		if (cache_add(STATE(mode)->internal->data, obj, id) == -1) { +		if (cache_add(STATE(mode)->internal->ct.data, obj, id) == -1) {  			cache_object_free(obj);  			return;  		} @@ -153,16 +168,15 @@ retry:  		 * processes or the kernel, but don't propagate events that  		 * have been triggered by conntrackd itself, eg. commits. */  		if (origin == CTD_ORIGIN_NOT_ME) -			sync_send(obj, NET_T_STATE_NEW); +			sync_send(obj, NET_T_STATE_CT_NEW);  	} else { -		cache_del(STATE(mode)->internal->data, obj); +		cache_del(STATE(mode)->internal->ct.data, obj);  		cache_object_free(obj);  		goto retry;  	}  } -static void -event_update_sync(struct nf_conntrack *ct, int origin) +static void internal_cache_ct_event_upd(struct nf_conntrack *ct, int origin)  {  	struct cache_object *obj; @@ -170,16 +184,163 @@ event_update_sync(struct nf_conntrack *ct, int origin)  	if (origin == CTD_ORIGIN_INJECT)  		return; -	obj = cache_update_force(STATE(mode)->internal->data, ct); +	obj = cache_update_force(STATE(mode)->internal->ct.data, ct);  	if (obj == NULL)  		return;  	if (origin == CTD_ORIGIN_NOT_ME) -		sync_send(obj, NET_T_STATE_UPD); +		sync_send(obj, NET_T_STATE_CT_UPD); +} + +static int internal_cache_ct_event_del(struct nf_conntrack *ct, int origin) +{ +	struct cache_object *obj; +	int id; + +	/* this event has been triggered by a direct inject, skip */ +	if (origin == CTD_ORIGIN_INJECT) +		return 0; + +	/* we don't synchronize events for objects that are not in the cache */ +	obj = cache_find(STATE(mode)->internal->ct.data, ct, &id); +	if (obj == NULL) +		return 0; + +	if (obj->status != C_OBJ_DEAD) { +		cache_object_set_status(obj, C_OBJ_DEAD); +		if (origin == CTD_ORIGIN_NOT_ME) { +			sync_send(obj, NET_T_STATE_CT_DEL); +		} +		cache_object_put(obj); +	} +	return 1; +} + +static void internal_cache_exp_dump(int fd, int type) +{ +	cache_dump(STATE(mode)->internal->exp.data, fd, type); +} + +static void internal_cache_exp_flush(void) +{ +	cache_flush(STATE(mode)->internal->exp.data); +} + +static void internal_cache_exp_stats(int fd) +{ +	cache_stats(STATE(mode)->internal->exp.data, fd); +} + +static void internal_cache_exp_stats_ext(int fd) +{ +	cache_stats_extended(STATE(mode)->internal->exp.data, fd); +} + +static void internal_cache_exp_populate(struct nf_expect *exp) +{ +	cache_update_force(STATE(mode)->internal->exp.data, exp); +} + +static int internal_cache_exp_purge_step(void *data1, void *data2) +{ +	struct cache_object *obj = data2; + +	STATE(get_retval) = 0; +	nl_get_expect(STATE(get), obj->ptr);	/* modifies STATE(get_reval) */ +	if (!STATE(get_retval)) { +		if (obj->status != C_OBJ_DEAD) { +			cache_object_set_status(obj, C_OBJ_DEAD); +			sync_send(obj, NET_T_STATE_EXP_DEL); +			cache_object_put(obj); +		} +	} + +	return 0; +} + +static void internal_cache_exp_purge(void) +{ +	cache_iterate(STATE(mode)->internal->exp.data, NULL, +			internal_cache_exp_purge_step);  }  static int -event_destroy_sync(struct nf_conntrack *ct, int origin) +internal_cache_exp_resync(enum nf_conntrack_msg_type type, +			  struct nf_expect *exp, void *data) +{ +	struct cache_object *obj; +	const struct nf_conntrack *master = +		nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	if (!exp_filter_find(STATE(exp_filter), exp)) +		return NFCT_CB_CONTINUE; + +	if (ct_filter_conntrack(master, 1)) +		return NFCT_CB_CONTINUE; + +	obj = cache_update_force(STATE(mode)->internal->exp.data, exp); +	if (obj == NULL) +		return NFCT_CB_CONTINUE; + +	switch (obj->status) { +	case C_OBJ_NEW: +		sync_send(obj, NET_T_STATE_EXP_NEW); +		break; +	case C_OBJ_ALIVE: +		sync_send(obj, NET_T_STATE_EXP_UPD); +		break; +	} +	return NFCT_CB_CONTINUE; +} + +static void internal_cache_exp_event_new(struct nf_expect *exp, int origin) +{ +	struct cache_object *obj; +	int id; + +	/* this event has been triggered by a direct inject, skip */ +	if (origin == CTD_ORIGIN_INJECT) +		return; + +	obj = cache_find(STATE(mode)->internal->exp.data, exp, &id); +	if (obj == NULL) { +retry: +		obj = cache_object_new(STATE(mode)->internal->exp.data, exp); +		if (obj == NULL) +			return; +		if (cache_add(STATE(mode)->internal->exp.data, obj, id) == -1) { +			cache_object_free(obj); +			return; +		} +		/* only synchronize events that have been triggered by other +		 * processes or the kernel, but don't propagate events that +		 * have been triggered by conntrackd itself, eg. commits. */ +		if (origin == CTD_ORIGIN_NOT_ME) +			sync_send(obj, NET_T_STATE_EXP_NEW); +	} else { +		cache_del(STATE(mode)->internal->exp.data, obj); +		cache_object_free(obj); +		goto retry; +	} +} + +static void internal_cache_exp_event_upd(struct nf_expect *exp, int origin) +{ +	struct cache_object *obj; + +	/* this event has been triggered by a direct inject, skip */ +	if (origin == CTD_ORIGIN_INJECT) +		return; + +	obj = cache_update_force(STATE(mode)->internal->exp.data, exp); +	if (obj == NULL) +		return; + +	if (origin == CTD_ORIGIN_NOT_ME) +		sync_send(obj, NET_T_STATE_EXP_UPD); +} + +static int internal_cache_exp_event_del(struct nf_expect *exp, int origin)  {  	struct cache_object *obj;  	int id; @@ -189,14 +350,14 @@ event_destroy_sync(struct nf_conntrack *ct, int origin)  		return 0;  	/* we don't synchronize events for objects that are not in the cache */ -	obj = cache_find(STATE(mode)->internal->data, ct, &id); +	obj = cache_find(STATE(mode)->internal->exp.data, exp, &id);  	if (obj == NULL)  		return 0;  	if (obj->status != C_OBJ_DEAD) {  		cache_object_set_status(obj, C_OBJ_DEAD);  		if (origin == CTD_ORIGIN_NOT_ME) { -			sync_send(obj, NET_T_STATE_DEL); +			sync_send(obj, NET_T_STATE_EXP_DEL);  		}  		cache_object_put(obj);  	} @@ -205,16 +366,30 @@ event_destroy_sync(struct nf_conntrack *ct, int origin)  struct internal_handler internal_cache = {  	.flags			= INTERNAL_F_POPULATE | INTERNAL_F_RESYNC, -	.init			= _init, -	.close			= _close, -	.dump			= dump, -	.flush			= flush, -	.stats			= stats, -	.stats_ext		= stats_ext, -	.populate		= populate, -	.purge			= purge, -	.resync			= resync, -	.new			= event_new_sync, -	.update			= event_update_sync, -	.destroy		= event_destroy_sync, +	.init			= internal_cache_init, +	.close			= internal_cache_close, +	.ct = { +		.dump			= internal_cache_ct_dump, +		.flush			= internal_cache_ct_flush, +		.stats			= internal_cache_ct_stats, +		.stats_ext		= internal_cache_ct_stats_ext, +		.populate		= internal_cache_ct_populate, +		.purge			= internal_cache_ct_purge, +		.resync			= internal_cache_ct_resync, +		.new			= internal_cache_ct_event_new, +		.upd			= internal_cache_ct_event_upd, +		.del			= internal_cache_ct_event_del, +	}, +	.exp = { +		.dump			= internal_cache_exp_dump, +		.flush			= internal_cache_exp_flush, +		.stats			= internal_cache_exp_stats, +		.stats_ext		= internal_cache_exp_stats_ext, +		.populate		= internal_cache_exp_populate, +		.purge			= internal_cache_exp_purge, +		.resync			= internal_cache_exp_resync, +		.new			= internal_cache_exp_event_new, +		.upd			= internal_cache_exp_event_upd, +		.del			= internal_cache_exp_event_del, +	},  }; diff --git a/src/lock.c b/src/lock.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/lock.c @@ -145,6 +145,43 @@ void dlog_ct(FILE *fd, struct nf_conntrack *ct, unsigned int type)  	}  } +void dlog_exp(FILE *fd, struct nf_expect *exp, unsigned int type) +{ +	time_t t; +	char buf[1024]; +	char *tmp; +	unsigned int flags = 0; + +	buf[0]='\0'; + +	switch(type) { +	case NFCT_O_PLAIN: +		t = time(NULL); +		ctime_r(&t, buf); +		tmp = buf + strlen(buf); +		buf[strlen(buf)-1]='\t'; +		break; +	default: +		return; +	} +	nfexp_snprintf(buf+strlen(buf), 1024-strlen(buf), exp, 0, type, flags); + +	if (fd) { +		snprintf(buf+strlen(buf), 1024-strlen(buf), "\n"); +		fputs(buf, fd); +	} + +	if (fd == STATE(log)) { +		/* error reporting */ +		if (CONFIG(syslog_facility) != -1) +			syslog(LOG_ERR, "%s", tmp); +	} else if (fd == STATE(stats_log)) { +		/* connection logging */ +		if (CONFIG(stats).syslog_facility != -1) +			syslog(LOG_INFO, "%s", tmp); +	} +} +  void close_log(void)  {  	if (STATE(log) != NULL) @@ -1,5 +1,6 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com>   *   * 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 @@ -38,14 +39,15 @@ static const char usage_daemon_commands[] =  static const char usage_client_commands[] =  	"Client mode commands:\n" -	"  -c, commit external cache to conntrack table\n" +	"  -c [ct|expect], commit external cache to conntrack table\n"  	"  -f [|internal|external], flush internal and external cache\n" -	"  -F, flush kernel conntrack table\n" -	"  -i, display content of the internal cache\n" -	"  -e, display the content of the external cache\n" +	"  -F [ct|expect], flush kernel conntrack table\n" +	"  -i [ct|expect], display content of the internal cache\n" +	"  -e [ct|expect], display the content of the external cache\n"  	"  -k, kill conntrack daemon\n" -	"  -s  [|network|cache|runtime|link|rsqueue|queue], dump statistics\n" -	"  -R, resync with kernel conntrack table\n" +	"  -s  [|network|cache|runtime|link|rsqueue|queue|ct|expect], " +		"dump statistics\n" +	"  -R [ct|expect], resync with kernel conntrack table\n"  	"  -n, request resync with other node (only FT-FW and NOTRACK modes)\n"  	"  -x, dump cache in XML format (requires -i or -e)\n"  	"  -t, reset the kernel timeout (see PurgeTimeout clause)\n" @@ -89,6 +91,25 @@ set_operation_mode(int *current, int want, char *argv[])  	}  } +static int +set_action_by_table(int i, int argc, char *argv[], +		    int ct_action, int exp_action, int dfl_action, int *action) +{ +	if (i+1 < argc && argv[i+1][0] != '-') { +		if (strncmp(argv[i+1], "ct", strlen(argv[i+1])) == 0) { +			*action = ct_action; +			i++; +		} else if (strncmp(argv[i+1], "expect", +						strlen(argv[i+1])) == 0) { +			*action = exp_action; +			i++; +		} +	} else +		*action = dfl_action; + +	return i; +} +  int main(int argc, char *argv[])  {  	int ret, i, action = -1; @@ -115,15 +136,23 @@ int main(int argc, char *argv[])  			break;  		case 'c':  			set_operation_mode(&type, REQUEST, argv); -			action = COMMIT; +			i = set_action_by_table(i, argc, argv, +						CT_COMMIT, EXP_COMMIT, +						ALL_COMMIT, &action);  			break;  		case 'i':  			set_operation_mode(&type, REQUEST, argv); -			action = DUMP_INTERNAL; +			i = set_action_by_table(i, argc, argv, +						CT_DUMP_INTERNAL, +						EXP_DUMP_INTERNAL, +						CT_DUMP_INTERNAL, &action);  			break;  		case 'e':  			set_operation_mode(&type, REQUEST, argv); -			action = DUMP_EXTERNAL; +			i = set_action_by_table(i, argc, argv, +						CT_DUMP_EXTERNAL, +						EXP_DUMP_EXTERNAL, +						CT_DUMP_EXTERNAL, &action);  			break;  		case 'C':  			if (++i < argc) { @@ -142,18 +171,21 @@ int main(int argc, char *argv[])  			break;  		case 'F':  			set_operation_mode(&type, REQUEST, argv); -			action = FLUSH_MASTER; +			i = set_action_by_table(i, argc, argv, +						CT_FLUSH_MASTER, +						EXP_FLUSH_MASTER, +						ALL_FLUSH_MASTER, &action);  			break;  		case 'f':  			set_operation_mode(&type, REQUEST, argv);  			if (i+1 < argc && argv[i+1][0] != '-') {  				if (strncmp(argv[i+1], "internal",  					    strlen(argv[i+1])) == 0) { -					action = FLUSH_INT_CACHE; +					action = CT_FLUSH_INT_CACHE;  					i++;  				} else if (strncmp(argv[i+1], "external",  						 strlen(argv[i+1])) == 0) { -					action = FLUSH_EXT_CACHE; +					action = CT_FLUSH_EXT_CACHE;  					i++;  				} else {  					fprintf(stderr, "ERROR: unknown " @@ -164,12 +196,15 @@ int main(int argc, char *argv[])  				}  			} else {  				/* default to general flushing */ -				action = FLUSH_CACHE; +				action = ALL_FLUSH_CACHE;  			}  			break;  		case 'R':  			set_operation_mode(&type, REQUEST, argv); -			action = RESYNC_MASTER; +			i = set_action_by_table(i, argc, argv, +						CT_RESYNC_MASTER, +						EXP_RESYNC_MASTER, +						ALL_RESYNC_MASTER, &action);  			break;  		case 'B':  			set_operation_mode(&type, REQUEST, argv); @@ -222,6 +257,14 @@ int main(int argc, char *argv[])  						strlen(argv[i+1])) == 0) {  					action = STATS_QUEUE;  					i++; +				} else if (strncmp(argv[i+1], "ct", +						strlen(argv[i+1])) == 0) { +					action = STATS; +					i++; +				} else if (strncmp(argv[i+1], "expect", +						strlen(argv[i+1])) == 0) { +					action = EXP_STATS; +					i++;  				} else {  					fprintf(stderr, "ERROR: unknown "  							"parameter `%s' for " @@ -243,10 +286,10 @@ int main(int argc, char *argv[])  			action = REQUEST_DUMP;  			break;  		case 'x': -			if (action == DUMP_INTERNAL) -				action = DUMP_INT_XML; -			else if (action == DUMP_EXTERNAL) -				action = DUMP_EXT_XML; +			if (action == CT_DUMP_INTERNAL) +				action = CT_DUMP_INT_XML; +			else if (action == CT_DUMP_EXTERNAL) +				action = CT_DUMP_EXT_XML;  			else {  				show_usage(argv[0]);  				fprintf(stderr, "Error: Invalid parameters\n"); diff --git a/src/netlink.c b/src/netlink.c index a43f782..fe979e3 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1,5 +1,6 @@  /* - * (C) 2006 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com>   *   * 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 @@ -32,10 +33,23 @@ struct nfct_handle *nl_init_event_handler(void)  {  	struct nfct_handle *h; -	h = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS); +	h = nfct_open(CONFIG(netlink).subsys_id, CONFIG(netlink).groups);  	if (h == NULL)  		return NULL; +	if (CONFIG(netlink).events_reliable) { +		int on = 1; + +		setsockopt(nfct_fd(h), SOL_NETLINK, +			   NETLINK_BROADCAST_SEND_ERROR, &on, sizeof(int)); + +		setsockopt(nfct_fd(h), SOL_NETLINK, +			   NETLINK_NO_ENOBUFS, &on, sizeof(int)); + +		dlog(LOG_NOTICE, "reliable ctnetlink event delivery " +				 "is ENABLED."); +	} +  	if (STATE(filter)) {  		if (CONFIG(filter_from_kernelspace)) {  			if (nfct_filter_attach(nfct_fd(h), @@ -53,10 +67,18 @@ struct nfct_handle *nl_init_event_handler(void)  	fcntl(nfct_fd(h), F_SETFL, O_NONBLOCK);  	/* set up socket buffer size */ -	if (CONFIG(netlink_buffer_size)) { -		CONFIG(netlink_buffer_size) =  -		    nfnl_rcvbufsiz(nfct_nfnlh(h), CONFIG(netlink_buffer_size)); +	if (CONFIG(netlink_buffer_size) && +	    CONFIG(netlink_buffer_size) <= +			CONFIG(netlink_buffer_size_max_grown)) { +		/* we divide netlink_buffer_size by 2 here since value passed +		   to kernel gets doubled in SO_RCVBUF; see net/core/sock.c */ +		CONFIG(netlink_buffer_size) = +		  nfnl_rcvbufsiz(nfct_nfnlh(h), CONFIG(netlink_buffer_size)/2);  	} else { +		dlog(LOG_NOTICE, "NetlinkBufferSize is either not set or " +				 "is greater than NetlinkBufferSizeMaxGrowth. " +				 "Using current system buffer size"); +  		socklen_t socklen = sizeof(unsigned int);  		unsigned int read_size; @@ -70,23 +92,6 @@ struct nfct_handle *nl_init_event_handler(void)  	dlog(LOG_NOTICE, "netlink event socket buffer size has been set "  			 "to %u bytes", CONFIG(netlink_buffer_size)); -	/* ensure that maximum grown size is >= than maximum size */ -	if (CONFIG(netlink_buffer_size_max_grown) < CONFIG(netlink_buffer_size)) -		CONFIG(netlink_buffer_size_max_grown) = -					CONFIG(netlink_buffer_size); - -	if (CONFIG(netlink).events_reliable) { -		int on = 1; - -		setsockopt(nfct_fd(h), SOL_NETLINK, -			   NETLINK_BROADCAST_SEND_ERROR, &on, sizeof(int)); - -		setsockopt(nfct_fd(h), SOL_NETLINK, -			   NETLINK_NO_ENOBUFS, &on, sizeof(int)); - -		dlog(LOG_NOTICE, "reliable ctnetlink event delivery " -				 "is ENABLED."); -	}  	return h;  } @@ -110,31 +115,34 @@ static int warned = 0;  void nl_resize_socket_buffer(struct nfct_handle *h)  { -	/* sock_setsockopt in net/core/sock.c doubles the size of the buffer */  	unsigned int s = CONFIG(netlink_buffer_size);  	/* already warned that we have reached the maximum buffer size */  	if (warned)  		return; -	if (s > CONFIG(netlink_buffer_size_max_grown)) { +	/* since sock_setsockopt in net/core/sock.c doubles the size of socket +	   buffer passed to it using nfnl_rcvbufsiz, only call nfnl_rcvbufsiz +	   if new value is not greater than netlink_buffer_size_max_grown */ +	if (s*2 > CONFIG(netlink_buffer_size_max_grown)) {  		dlog(LOG_WARNING, -		     "maximum netlink socket buffer " -		     "size has been reached. We are likely to " +		     "netlink event socket buffer size cannot " +		     "be doubled further since it will exceed " +		     "NetlinkBufferSizeMaxGrowth. We are likely to "  		     "be losing events, this may lead to "  		     "unsynchronized replicas. Please, consider "  		     "increasing netlink socket buffer size via " -		     "SocketBufferSize and " -		     "SocketBufferSizeMaxGrowth clauses in " +		     "NetlinkBufferSize and " +		     "NetlinkBufferSizeMaxGrowth clauses in "  		     "conntrackd.conf"); -		s = CONFIG(netlink_buffer_size_max_grown);  		warned = 1; +		return;  	}  	CONFIG(netlink_buffer_size) = nfnl_rcvbufsiz(nfct_nfnlh(h), s);  	/* notify the sysadmin */ -	dlog(LOG_NOTICE, "netlink socket buffer size has been increased " +	dlog(LOG_NOTICE, "netlink event socket buffer size has been doubled "  			 "to %u bytes", CONFIG(netlink_buffer_size));  } @@ -157,20 +165,21 @@ int nl_send_resync(struct nfct_handle *h)  /* if the handle has no callback, check for existence, otherwise, update */  int nl_get_conntrack(struct nfct_handle *h, const struct nf_conntrack *ct)  { -	int ret; -	char __tmp[nfct_maxsize()]; -	struct nf_conntrack *tmp = (struct nf_conntrack *) (void *)__tmp; +	int ret = 1; +	struct nf_conntrack *tmp; -	memset(__tmp, 0, sizeof(__tmp)); +	tmp = nfct_new(); +	if (tmp == NULL) +		return -1;  	/* use the original tuple to check if it is there */  	nfct_copy(tmp, ct, NFCT_CP_ORIG); -	ret = nfct_query(h, NFCT_Q_GET, tmp); -	if (ret == -1) -		return errno == ENOENT ? 0 : -1; +	if (nfct_query(h, NFCT_Q_GET, tmp) == -1) +		ret = (errno == ENOENT) ? 0 : -1; -	return 1; +	nfct_destroy(tmp); +	return ret;  }  int nl_create_conntrack(struct nfct_handle *h,  @@ -196,12 +205,14 @@ int nl_create_conntrack(struct nfct_handle *h,  	nfct_setobjopt(ct, NFCT_SOPT_SETUP_REPLY); -	/* -	 * TCP flags to overpass window tracking for recovered connections -	 */ +	/* disable TCP window tracking for recovered connections if required */  	if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) { -		uint8_t flags = IP_CT_TCP_FLAG_BE_LIBERAL | -				IP_CT_TCP_FLAG_SACK_PERM; +		uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM; + +		if (!CONFIG(sync).tcp_window_tracking) +			flags |= IP_CT_TCP_FLAG_BE_LIBERAL; +		else +			flags |= IP_CT_TCP_FLAG_WINDOW_SCALE;  		/* FIXME: workaround, we should send TCP flags in updates */  		if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >= @@ -261,12 +272,14 @@ int nl_update_conntrack(struct nfct_handle *h,  		nfct_attr_unset(ct, ATTR_MASTER_PORT_DST);  	} -	/* -	 * TCP flags to overpass window tracking for recovered connections -	 */ +	/* disable TCP window tracking for recovered connections if required */  	if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) { -		uint8_t flags = IP_CT_TCP_FLAG_BE_LIBERAL | -				IP_CT_TCP_FLAG_SACK_PERM; +		uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM; + +		if (!CONFIG(sync).tcp_window_tracking) +			flags |= IP_CT_TCP_FLAG_BE_LIBERAL; +		else +			flags |= IP_CT_TCP_FLAG_WINDOW_SCALE;  		/* FIXME: workaround, we should send TCP flags in updates */  		if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >= @@ -289,3 +302,61 @@ int nl_destroy_conntrack(struct nfct_handle *h, const struct nf_conntrack *ct)  {  	return nfct_query(h, NFCT_Q_DESTROY, ct);  } + +int nl_create_expect(struct nfct_handle *h, const struct nf_expect *orig, +		     int timeout) +{ +	int ret; +	struct nf_expect *exp; + +	exp = nfexp_clone(orig); +	if (exp == NULL) +		return -1; + +	if (timeout > 0) +		nfexp_set_attr_u32(exp, ATTR_EXP_TIMEOUT, timeout); + +	ret = nfexp_query(h, NFCT_Q_CREATE, exp); +	nfexp_destroy(exp); + +	return ret; +} + +int nl_destroy_expect(struct nfct_handle *h, const struct nf_expect *exp) +{ +	return nfexp_query(h, NFCT_Q_DESTROY, exp); +} + +/* if the handle has no callback, check for existence, otherwise, update */ +int nl_get_expect(struct nfct_handle *h, const struct nf_expect *exp) +{ +	int ret = 1; +	struct nf_expect *tmp; + +	/* XXX: we only need the expectation, not the mask and the master. */ +	tmp = nfexp_clone(exp); +	if (tmp == NULL) +		return -1; + +	if (nfexp_query(h, NFCT_Q_GET, tmp) == -1) +		ret = (errno == ENOENT) ? 0 : -1; + +	nfexp_destroy(tmp); +	return ret; +} + +int nl_dump_expect_table(struct nfct_handle *h) +{ +	return nfexp_query(h, NFCT_Q_DUMP, &CONFIG(family)); +} + +int nl_flush_expect_table(struct nfct_handle *h) +{ +	return nfexp_query(h, NFCT_Q_FLUSH, &CONFIG(family)); +} + +int nl_send_expect_resync(struct nfct_handle *h) +{ +	int family = CONFIG(family); +	return nfexp_send(h, NFCT_Q_DUMP, &family); +} diff --git a/src/network.c b/src/network.c index 6a66a2b..13db37c 100644 --- a/src/network.c +++ b/src/network.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -119,13 +120,20 @@ int nethdr_track_is_seq_set()  #include "cache.h" -static int status2type[] = { -	[C_OBJ_NEW]	= NET_T_STATE_NEW, -	[C_OBJ_ALIVE]	= NET_T_STATE_UPD, -	[C_OBJ_DEAD]	= NET_T_STATE_DEL, +static int status2type[CACHE_T_MAX][C_OBJ_MAX] = { +	[CACHE_T_CT] = { +		[C_OBJ_NEW]	= NET_T_STATE_CT_NEW, +		[C_OBJ_ALIVE]	= NET_T_STATE_CT_UPD, +		[C_OBJ_DEAD]	= NET_T_STATE_CT_DEL, +	}, +	[CACHE_T_EXP] = { +		[C_OBJ_NEW]	= NET_T_STATE_EXP_NEW, +		[C_OBJ_ALIVE]	= NET_T_STATE_EXP_UPD, +		[C_OBJ_DEAD]	= NET_T_STATE_EXP_DEL, +	},  }; -int object_status_to_network_type(int status) +int object_status_to_network_type(struct cache_object *obj)  { -	return status2type[status]; +	return status2type[obj->cache->type][obj->status];  } diff --git a/src/parse.c b/src/parse.c index e6eefe4..81e9c6b 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -24,191 +25,201 @@  #define ssizeof(x) (int)sizeof(x)  #endif -static void parse_u8(struct nf_conntrack *ct, int attr, void *data); -static void parse_u16(struct nf_conntrack *ct, int attr, void *data); -static void parse_u32(struct nf_conntrack *ct, int attr, void *data); -static void parse_group(struct nf_conntrack *ct, int attr, void *data); -static void parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u8(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u16(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u32(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_group(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data); -struct parser { +struct ct_parser {  	void 	(*parse)(struct nf_conntrack *ct, int attr, void *data);  	int 	attr;  	int	size;  }; -static struct parser h[NTA_MAX] = { +static struct ct_parser h[NTA_MAX] = {  	[NTA_IPV4] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_ORIG_IPV4,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)),  	},  	[NTA_IPV6] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_ORIG_IPV6,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)),  	},  	[NTA_PORT] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_ORIG_PORT,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_port)),  	},  	[NTA_L4PROTO] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_L4PROTO,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_TCP_STATE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_TCP_STATE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_STATUS] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_STATUS,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_MARK] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_MARK,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_TIMEOUT] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_TIMEOUT,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_MASTER_IPV4] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_MASTER_IPV4,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)),  	},  	[NTA_MASTER_IPV6] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_MASTER_IPV6,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)),  	},  	[NTA_MASTER_L4PROTO] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_MASTER_L4PROTO,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_MASTER_PORT] = { -		.parse	= parse_group, +		.parse	= ct_parse_group,  		.attr	= ATTR_GRP_MASTER_PORT,  		.size	= NTA_SIZE(sizeof(struct nfct_attr_grp_port)),  	},  	[NTA_SNAT_IPV4]	= { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_SNAT_IPV4,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_DNAT_IPV4] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_DNAT_IPV4,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_SPAT_PORT]	= { -		.parse	= parse_u16, +		.parse	= ct_parse_u16,  		.attr	= ATTR_SNAT_PORT,  		.size	= NTA_SIZE(sizeof(uint16_t)),  	},  	[NTA_DPAT_PORT]	= { -		.parse	= parse_u16, +		.parse	= ct_parse_u16,  		.attr	= ATTR_DNAT_PORT,  		.size	= NTA_SIZE(sizeof(uint16_t)),  	},  	[NTA_NAT_SEQ_ADJ] = { -		.parse	= parse_nat_seq_adj, +		.parse	= ct_parse_nat_seq_adj,  		.size	= NTA_SIZE(sizeof(struct nta_attr_natseqadj)),  	},  	[NTA_SCTP_STATE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_SCTP_STATE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_SCTP_VTAG_ORIG] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_SCTP_VTAG_ORIG,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_SCTP_VTAG_REPL] = { -		.parse	= parse_u32, +		.parse	= ct_parse_u32,  		.attr	= ATTR_SCTP_VTAG_REPL,  		.size	= NTA_SIZE(sizeof(uint32_t)),  	},  	[NTA_DCCP_STATE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_DCCP_STATE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_DCCP_ROLE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_DCCP_ROLE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_ICMP_TYPE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_ICMP_TYPE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_ICMP_CODE] = { -		.parse	= parse_u8, +		.parse	= ct_parse_u8,  		.attr	= ATTR_ICMP_CODE,  		.size	= NTA_SIZE(sizeof(uint8_t)),  	},  	[NTA_ICMP_ID] = { -		.parse	= parse_u16, +		.parse	= ct_parse_u16,  		.attr	= ATTR_ICMP_ID,  		.size	= NTA_SIZE(sizeof(uint16_t)),  	}, +	[NTA_TCP_WSCALE_ORIG] = { +		.parse	= ct_parse_u8, +		.attr	= ATTR_TCP_WSCALE_ORIG, +		.size	= NTA_SIZE(sizeof(uint8_t)), +	}, +	[NTA_TCP_WSCALE_REPL] = { +		.parse	= ct_parse_u8, +		.attr	= ATTR_TCP_WSCALE_REPL, +		.size	= NTA_SIZE(sizeof(uint8_t)), +	},  };  static void -parse_u8(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u8(struct nf_conntrack *ct, int attr, void *data)  {  	uint8_t *value = (uint8_t *) data;  	nfct_set_attr_u8(ct, h[attr].attr, *value);  }  static void -parse_u16(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u16(struct nf_conntrack *ct, int attr, void *data)  {  	uint16_t *value = (uint16_t *) data;  	nfct_set_attr_u16(ct, h[attr].attr, ntohs(*value));  }  static void -parse_u32(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u32(struct nf_conntrack *ct, int attr, void *data)  {  	uint32_t *value = (uint32_t *) data;  	nfct_set_attr_u32(ct, h[attr].attr, ntohl(*value));  }  static void -parse_group(struct nf_conntrack *ct, int attr, void *data) +ct_parse_group(struct nf_conntrack *ct, int attr, void *data)  {  	nfct_set_attr_grp(ct, h[attr].attr, data);  }  static void -parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data) +ct_parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data)  {  	struct nta_attr_natseqadj *this = data;  	nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_CORRECTION_POS,   			  ntohl(this->orig_seq_correction_pos));  	nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_OFFSET_BEFORE,  -			  ntohl(this->orig_seq_correction_pos)); +			  ntohl(this->orig_seq_offset_before));  	nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_OFFSET_AFTER,  -			  ntohl(this->orig_seq_correction_pos)); +			  ntohl(this->orig_seq_offset_after));  	nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_CORRECTION_POS,  -			  ntohl(this->orig_seq_correction_pos)); +			  ntohl(this->repl_seq_correction_pos));  	nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_OFFSET_BEFORE,  -			  ntohl(this->orig_seq_correction_pos)); +			  ntohl(this->repl_seq_offset_before));  	nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_OFFSET_AFTER,  -			  ntohl(this->orig_seq_correction_pos)); +			  ntohl(this->repl_seq_offset_after));  } -int parse_payload(struct nf_conntrack *ct, struct nethdr *net, size_t remain) +int msg2ct(struct nf_conntrack *ct, struct nethdr *net, size_t remain)  {  	int len;  	struct netattr *attr; @@ -237,3 +248,195 @@ int parse_payload(struct nf_conntrack *ct, struct nethdr *net, size_t remain)  	return 0;  } + +static void exp_parse_ct_group(void *ct, int attr, void *data); +static void exp_parse_ct_u8(void *ct, int attr, void *data); +static void exp_parse_u32(void *exp, int attr, void *data); + +static struct exp_parser { +	void 	(*parse)(void *obj, int attr, void *data); +	int 	exp_attr; +	int 	ct_attr; +	int	size; +} exp_h[NTA_EXP_MAX] = { +	[NTA_EXP_MASTER_IPV4] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASTER, +		.ct_attr	= ATTR_GRP_ORIG_IPV4, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), +	}, +	[NTA_EXP_MASTER_IPV6] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASTER, +		.ct_attr	= ATTR_GRP_ORIG_IPV6, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), +	}, +	[NTA_EXP_MASTER_L4PROTO] = { +		.parse		= exp_parse_ct_u8, +		.exp_attr	= ATTR_EXP_MASTER, +		.ct_attr	= ATTR_L4PROTO, +		.size		= NTA_SIZE(sizeof(uint8_t)), +	}, +	[NTA_EXP_MASTER_PORT] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASTER, +		.ct_attr	= ATTR_GRP_ORIG_PORT, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_port)), +	}, +	[NTA_EXP_EXPECT_IPV4] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_EXPECTED, +		.ct_attr	= ATTR_GRP_ORIG_IPV4, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), +	}, +	[NTA_EXP_EXPECT_IPV6] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_EXPECTED, +		.ct_attr	= ATTR_GRP_ORIG_IPV6, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), +	}, +	[NTA_EXP_EXPECT_L4PROTO] = { +		.parse		= exp_parse_ct_u8, +		.exp_attr	= ATTR_EXP_EXPECTED, +		.ct_attr	= ATTR_L4PROTO, +		.size		= NTA_SIZE(sizeof(uint8_t)), +	}, +	[NTA_EXP_EXPECT_PORT] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_EXPECTED, +		.ct_attr	= ATTR_GRP_ORIG_PORT, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_port)), +	}, +	[NTA_EXP_MASK_IPV4] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASK, +		.ct_attr	= ATTR_GRP_ORIG_IPV4, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), +	}, +	[NTA_EXP_MASK_IPV6] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASK, +		.ct_attr	= ATTR_GRP_ORIG_IPV6, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), +	}, +	[NTA_EXP_MASK_L4PROTO] = { +		.parse		= exp_parse_ct_u8, +		.exp_attr	= ATTR_EXP_MASK, +		.ct_attr	= ATTR_L4PROTO, +		.size		= NTA_SIZE(sizeof(uint8_t)), +	}, +	[NTA_EXP_MASK_PORT] = { +		.parse		= exp_parse_ct_group, +		.exp_attr	= ATTR_EXP_MASK, +		.ct_attr	= ATTR_GRP_ORIG_PORT, +		.size		= NTA_SIZE(sizeof(struct nfct_attr_grp_port)), +	}, +	[NTA_EXP_TIMEOUT] = { +		.parse		= exp_parse_u32, +		.exp_attr	= ATTR_EXP_TIMEOUT, +		.size		= NTA_SIZE(sizeof(uint32_t)), +	}, +	[NTA_EXP_FLAGS] = { +		.parse		= exp_parse_u32, +		.exp_attr	= ATTR_EXP_FLAGS, +		.size		= NTA_SIZE(sizeof(uint32_t)), +	}, +}; + +static void exp_parse_ct_group(void *ct, int attr, void *data) +{ +	nfct_set_attr_grp(ct, exp_h[attr].ct_attr, data); +} + +static void exp_parse_ct_u8(void *ct, int attr, void *data) +{ +	uint8_t *value = (uint8_t *) data; +	nfct_set_attr_u8(ct, exp_h[attr].ct_attr, *value); +} + +static void exp_parse_u32(void *exp, int attr, void *data) +{ +	uint32_t *value = (uint32_t *) data; +	nfexp_set_attr_u32(exp, exp_h[attr].exp_attr, ntohl(*value)); +} + +int msg2exp(struct nf_expect *exp, struct nethdr *net, size_t remain) +{ +	int len; +	struct netattr *attr; +	struct nf_conntrack *master, *expected, *mask; + +	if (remain < net->len) +		return -1; + +	len = net->len - NETHDR_SIZ; +	attr = NETHDR_DATA(net); + +	master = nfct_new(); +	if (master == NULL) +		goto err_master; + +	expected = nfct_new(); +	if (expected == NULL) +		goto err_expected; + +	mask = nfct_new(); +	if (mask == NULL) +		goto err_mask; + +	while (len > ssizeof(struct netattr)) { +		ATTR_NETWORK2HOST(attr); +		if (attr->nta_len > len) +			goto err; +		if (attr->nta_attr > NTA_MAX) +			goto err; +		if (attr->nta_len != exp_h[attr->nta_attr].size) +			goto err; +		if (exp_h[attr->nta_attr].parse == NULL) { +			attr = NTA_NEXT(attr, len); +			continue; +		} +		switch(exp_h[attr->nta_attr].exp_attr) { +		case ATTR_EXP_MASTER: +			exp_h[attr->nta_attr].parse(master, attr->nta_attr, +						    NTA_DATA(attr)); +		case ATTR_EXP_EXPECTED: +			exp_h[attr->nta_attr].parse(expected, attr->nta_attr, +						    NTA_DATA(attr)); +		case ATTR_EXP_MASK: +			exp_h[attr->nta_attr].parse(mask, attr->nta_attr, +						    NTA_DATA(attr)); +			break; +		case ATTR_EXP_TIMEOUT: +		case ATTR_EXP_FLAGS: +			exp_h[attr->nta_attr].parse(exp, attr->nta_attr, +						    NTA_DATA(attr)); +			break; +		} +		attr = NTA_NEXT(attr, len); +	} + +	nfexp_set_attr(exp, ATTR_EXP_MASTER, master); +	nfexp_set_attr(exp, ATTR_EXP_EXPECTED, expected); +	nfexp_set_attr(exp, ATTR_EXP_MASK, mask); + +	/* We can release the conntrack objects at this point because the +	 * setter makes a copy of them. This is not efficient, it would be +	 * better to save that extra copy but this is how the library works. +	 * I'm sorry, I cannot change it without breaking backward +	 * compatibility. Probably it is a good idea to think of adding new +	 * interfaces in the near future to get it better. */ +	nfct_destroy(mask); +	nfct_destroy(expected); +	nfct_destroy(master); + +	return 0; +err: +	nfct_destroy(mask); +err_mask: +	nfct_destroy(expected); +err_expected: +	nfct_destroy(master); +err_master: +	return -1; +} diff --git a/src/read_config_lex.c b/src/read_config_lex.c index c463526..a6bcd17 100644 --- a/src/read_config_lex.c +++ b/src/read_config_lex.c @@ -381,8 +381,8 @@ static void yy_fatal_error (yyconst char msg[]  );  	*yy_cp = '\0'; \  	(yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 102 -#define YY_END_OF_BUFFER 103 +#define YY_NUM_RULES 105 +#define YY_END_OF_BUFFER 106  /* This struct is not used in this scanner,     but its presence is necessary. */  struct yy_trans_info @@ -390,319 +390,323 @@ struct yy_trans_info  	flex_int32_t yy_verify;  	flex_int32_t yy_nxt;  	}; -static yyconst flex_int16_t yy_accept[2830] = +static yyconst flex_int16_t yy_accept[2865] =      {   0, -        0,    0,  103,  101,   99,  100,  100,  101,  101,   91, -       87,   87,  101,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,  101,   99, -        0,   98,   88,   91,    0,   87,   87,    0,    0,   90, -       97,   97,   97,   97,   97,   97,    0,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,    0,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,    0,   97,   85,   85,   97,   97,   97,   97,   97, - -        0,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,    0,    0,   85,    0, -       85,    0,    0,   87,   87,    0,    0,    0,   90,    0, -       90,   97,   97,   97,    0,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,    0,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,    0,   97,    0,   97,   97,    0,   86,   86,   97, -        0,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, - -       11,   97,   97,   10,   97,   97,   45,   86,   86,    0, -       87,   87,    0,    0,    0,    0,    0,   90,   90,   90, -       90,   97,   97,   97,    0,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,    0, -       94,   94,   97,   97,   70,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   37, -       97,   95,   95,   97,    0,   97,   77,   95,   97,    0, -       18,   97,   24,   97,   97,   97,   97,   97,   97,   97, -       97,    0,   97,   97,   97,   97,   97,   29,   97,   97, -       79,    1,   97,    0,   94,    0,    0,   87,   87,    0, - -        0,    0,    0,    0,    0,    0,   90,   90,   90,   97, -       97,   92,   92,   97,   97,   97,   54,   97,   97,   97, -       97,   97,   97,   97,   97,   97,   97,    0,   97,   97, -       97,   23,   97,   97,    0,    0,   97,   97,   97,    0, -       97,   97,   97,   97,   97,   97,   97,    0,   97,   97, -        0,   97,   97,   97,   97,   97,   97,   97,   97,   97, -        0,    0,   97,   97,   97,   66,   30,   97,   97,    0, -       97,   92,   92,    0,   87,   87,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,   90,   90,   90,   90, -       90,   97,   97,   67,   97,   97,   55,    0,   97,   97, - -       97,   97,   97,   97,   97,   97,   97,   97,   97,    0, -       39,   63,   97,   97,   97,    0,    0,    0,    0,    0, -        0,   68,   97,   97,    0,   56,   97,   97,   97,   97, -       97,   97,   97,    0,   97,   97,    0,   97,   97,   97, -       97,   97,   97,   97,   97,   97,    0,    0,   97,   97, -       97,   97,   26,    0,   97,    0,   89,   89,   87,   87, +        0,    0,  106,  104,  102,  103,  103,  104,  104,   94, +       90,   90,  104,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  104, +      102,    0,  101,   91,   94,    0,   90,   90,    0,    0, +       93,  100,  100,  100,  100,  100,  100,    0,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,    0,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,    0,  100,   88,  100,   88,  100,  100, + +      100,  100,  100,    0,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,    0, +        0,   88,    0,   88,    0,    0,   90,   90,    0,    0, +        0,   93,    0,   93,  100,  100,  100,    0,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,    0,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,    0,  100,    0,  100,  100, +        0,   89,   89,  100,  100,    0,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, + +      100,  100,  100,  100,  100,   11,  100,  100,   10,  100, +      100,   45,   89,   89,    0,   90,   90,    0,    0,    0, +        0,    0,   93,   93,   93,   93,  100,  100,  100,    0, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,    0,   97,   97,  100,  100, +       70,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,   37,  100,   98,   98,  100, +        0,  100,   77,   98,  100,  100,    0,   18,  100,   24, +      100,  100,  100,  100,  100,  100,  100,  100,    0,  100, +      100,  100,  100,  100,   29,  100,  100,  100,   79,    1, + +      100,    0,   97,    0,    0,   90,   90,    0,    0,    0, +        0,    0,    0,    0,   93,   93,   93,  100,  100,   95, +       95,  100,  100,  100,   54,  100,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,    0,  100,  100,  100, +       23,  100,  100,    0,    0,  100,  100,  100,    0,  100, +      100,  100,  100,  100,  100,  100,    0,  100,  100,  100, +        0,  100,  100,  100,  100,  100,  100,  100,  100,  100, +        0,    0,  100,  100,  100,   66,   30,  100,  100,  100, +        0,  100,   95,   95,    0,   90,   90,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,   93,   93,   93, + +       93,   93,  100,  100,   67,  100,  100,   55,    0,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, +      100,    0,   39,   63,  100,  100,  100,    0,    0,    0, +        0,    0,    0,   68,  100,  100,    0,   56,  100,  100, +      100,  100,  100,  100,  100,    0,  100,  100,  100,    0, +      100,  100,  100,  100,  100,  100,  100,  100,  100,    0, +        0,  100,  100,  100,  100,   26,  100,    0,  100,    0, +       92,   92,   90,   90,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,   93,   93,   93, +       93,   93,   93,   93,  100,  100,   65,   22,    0,  100, + +      100,  100,  100,   74,  100,  100,  100,  100,  100,  100, +      100,    0,   28,  100,  100,    0,    0,    0,    0,    0, +        0,  100,  100,  100,  100,    0,  100,  100,   25,  100, +      100,  100,   99,   99,  100,   84,  100,    0,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,    0,    0, +      100,  100,  100,  100,  100,    0,  100,   99,    0,   90, +       90,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,  100, +      100,    0,  100,  100,   42,  100,  100,  100,  100,  100, + +      100,  100,  100,  100,   50,  100,   12,    0,    0,    0, +        0,    0,    0,  100,  100,  100,  100,   52,   38,   27, +      100,  100,  100,  100,  100,  100,  100,  100,    0,   75, +       80,   64,  100,  100,  100,  100,  100,  100,  100,   48, +       47,  100,  100,  100,   21,  100,    0,  100,   92,   92, +       90,   90,    0,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       97,   97,   65,   22,    0,   97,   97,   97,   97,   74, -       97,   97,   97,   97,   97,   97,    0,   28,   97,   97, - -        0,    0,    0,    0,    0,    0,   97,   97,   97,   97, -        0,   97,   97,   25,   97,   97,   97,   96,   96,   97, -       97,    0,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,    0,    0,   97,   97,   97,   97,    0,   97, -       96,    0,   87,   87,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,  100,  100,    0, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, + +      100,   17,    0,    0,    0,    0,    0,    0,  100,  100, +        8,  100,  100,  100,  100,    9,  100,  100,  100,  100, +        0,  100,  100,  100,  100,   44,  100,  100,   78,  100, +      100,  100,   53,   71,   90,   90,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   97,   97,    0,   97,   97,   42,   97,   97, -       97,   97,   97,   97,   97,   97,   50,   97,   12,    0, -        0,    0,    0,    0,    0,   97,   97,   97,   97,   52, - -       38,   27,   97,   97,   97,   97,   97,   97,   97,   97, -        0,   75,   80,   64,   97,   97,   97,   97,   97,   97, -       97,   48,   47,   97,   97,   97,   21,    0,   97,   89, -       89,   87,   87,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   97, -        0,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   17,    0,    0,    0,    0,    0,    0,   97,   97, -        8,   97,   97,   97,   97,    9,   97,   97,   97,   97, - -        0,   97,   97,   97,   97,   44,   97,   97,   78,   97, -       97,   53,   71,   87,   87,    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,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   97, -       97,   51,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,    0,    0,    0,    0,    0,    0,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   93,   93,   97, -       97,   97,   97,   97,   97,   97,   97,   87,   87,    0, - +        0,    0,    0,    0,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +      100,  100,   51,  100,  100,  100,  100,  100,  100,  100, +      100,  100,  100,  100,    0,    0,    0,    0,    0,    0, + +      100,  100,  100,  100,  100,  100,  100,  100,  100,   96, +       96,  100,  100,  100,  100,  100,  100,  100,  100,  100, +       90,   90,    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,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,  100,  100,  100,  100,  100,  100,  100,  100, +      100,   49,  100,  100,  100,    0,    0,    0,    0,    0, +        0,  100,  100,   72,  100,  100,  100,  100,  100,  100, + +      100,  100,   13,  100,  100,  100,  100,  100,  100,   90, +       90,    0,    0,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   49,   97, -       97,    0,    0,    0,    0,    0,    0,   97,   97,   72, -       97,   97,   97,   97,   97,   97,   97,   97,   13,   97, -       97,   97,   97,   97,   87,   87,    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,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +      100,  100,   14,  100,  100,  100,  100,  100,  100,  100, +      100,  100,    0,    2,    0,    0,    3,    0,  100,  100, +      100,  100,  100,  100,  100,  100,   69,  100,  100,  100, + +      100,  100,  100,  100,   90,   90,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   97,   97,   14,   97,   97, -       97,   97,   97,   97,   97,   97,    0,    2,    0,    0, -        3,    0,   97,   97,   97,   97,   97,   97,   97,   97, -       69,   97,   97,   97,   97,   97,   97,   87,   87,    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,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,  100,   43,  100,   15,  100,  100,  100,  100,  100, +      100,  100,    0,    0,    0,    0,  100,  100,  100,  100, +      100,  100,  100,  100,  100,  100,  100,  100,  100,  100, + +      100,   90,   90,    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, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   97,   43,   97,   15,   97,   97, -       97,   97,   97,   97,    0,    0,    0,    0,   97,   97, -       97,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   87,   87,    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,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,  100,  100,  100, +       58,  100,  100,  100,  100,  100,    0,    6,    0,    7, +       19,  100,  100,  100,  100,  100,  100,  100,  100,  100, + +      100,  100,  100,  100,  100,   90,   90,    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, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   97, -       97,   58,   97,   97,   97,   97,    0,    6,    0,    7, -       19,   97,   97,   97,   97,   97,   97,   97,   97,   97, -       97,   97,   97,   97,   87,   87,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,  100,  100,  100, +      100,  100,  100,  100,   86,    0,    0,  100,  100,  100, + +      100,  100,  100,  100,   62,  100,  100,   41,   61,  100, +      100,   90,   90,    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,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   97,   97,   97,   97, -       97,   97,   97,    0,    0,   97,   97,   97,   97,   97, -       97,   97,   62,   97,   97,   41,   61,   97,   87,   87,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, + +       93,   93,  100,  100,  100,  100,  100,   87,  100,    0, +        0,   20,  100,  100,  100,  100,  100,  100,   31,   40, +       32,  100,   90,   90,    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,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   97, -       97,   97,   97,   97,   84,   97,    0,    0,   20,   97, -       97,   97,   97,   97,   97,   31,   40,   32,   87,   87,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,  100, +       46,  100,  100,  100,  100,    0,    0,   57,  100,  100, +       35,  100,  100,  100,   85,   90,   90,    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,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,    0,    0,    0,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   97,   46,   97,   97,   97, -       97,    0,    0,   57,   97,   97,   35,   97,   97,   97, - -       87,   87,    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,   93, + +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,  100, +      100,  100,  100,  100,    0,    0,  100,  100,  100,  100, +      100,  100,   90,   90,    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,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   97,   97,   97,   97,   97,    0, -        0,   97,   97,   97,   97,   97,   97,   87,   87,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +      100,  100,  100,  100,   73,    0,    0,  100,  100,  100, +      100,  100,  100,   90,   90,    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,    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,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, +        0,    0,    0,    0,    0,    0,    0,    0,    0,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,  100,   16,   83,   82,    0,    0,   60, +       59,  100,  100,   76,  100,   90,   90,    0,    0,    0, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   97,   97,   97,   97,   73, -        0,    0,   97,   97,   97,   97,   97,   97,   87,   87, -        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,    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,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, -        0,    0,    0,    0,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   16, -       83,   82,    0,    0,   60,   59,   97,   97,   76,   97, -       87,   87,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +       93,   93,  100,    0,    0,  100,   81,  100,   90,   90,          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,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   97,    0,    0, -       97,   81,   97,   87,   87,    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,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,  100,    0,    0,  100,  100,   90,   90,    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,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   97,    0,    0,   97, -       97,   87,   87,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,  100,    0,    0,  100,  100,   90,   90,    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,    0,    0,    0,    0,    0,    0,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   97,    0,    0,   97, -       97,   87,   87,    0,    0,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,  100,    4,    5,  100,   33,  100,   90, +       90,    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,    0,    0,    0,    0,    0,    0, -        0,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,    4, -        5,   97,   33,   97,   87,   87,    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,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,  100,  100,   34, +       90,   90,    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,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   97,   97,   34,   87,   87,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +      100,   36,   90,   90,    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,   90,   90,   90,   90,   90,   90, +        0,    0,    0,    0,    0,    0,   93,   93,   93,   93, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   97,   36,   87,   87,    0, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,  100,   90,   90,    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,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,  100,   90,   90,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   87, -       87,    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,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   97,   87,   87,    0,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   87, -       87,    0,    0,    0,    0,    0,    0,    0,    0,    0, - -        0,    0,    0,    0,    0,    0,    0,    0,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   97,   87,   87, + +        0,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,  100,   90,   90,    0,    0,    0,    0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   90,   90,   90,   90,   97,   87, -       87,    0,    0,    0,    0,    0,    0,    0,    0,    0, -        0,   90,   90,   90,   90,   90,   90,   90,   90,   90, -       90,   90,   90,   90,   97,   87,   87,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, - -       90,   90,   90,   90,   97,   87,   87,    0,    0,    0, -        0,    0,    0,   90,   90,   90,   90,   90,   90,   90, -       90,   97,   87,   87,    0,    0,   90,   90,   90,   90, -       90,   90,   90,   97,   87,   87,    0,   90,   90,   90, -       97,   87,   87,   90,   97,   87,   87,   97,   87,   87, -       97,   87,   87,   97,   87,   87,   97,   87,   87,   97, -       87,   87,   97,   87,   87,   97,   87,   87,   97,   87, -       87,   97,   87,   87,   97,   87,   87,   97,   87,   87, -       97,   87,   87,   97,   87,   87,   97,   87,   87,   97, -       87,   87,   97,   87,   87,   97,   87,   87,   97,   87, - -       87,   97,   87,   87,   97,   87,   87,   97,   87,   87, -       97,   87,   87,   97,   87,   87,   97,   87,   87,   97, -       87,   87,   97,   87,   87,   97,   87,   87,    0 +        0,    0,    0,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,  100,   90,   90,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,  100,   90,   90,    0,    0,    0,    0, + +        0,    0,    0,    0,    0,    0,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,  100, +       90,   90,    0,    0,    0,    0,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,  100, +       90,   90,    0,    0,    0,    0,    0,    0,   93,   93, +       93,   93,   93,   93,   93,   93,  100,   90,   90,    0, +        0,   93,   93,   93,   93,   93,   93,   93,  100,   90, +       90,    0,   93,   93,   93,  100,   90,   90,   93,  100, +       90,   90,  100,   90,   90,  100,   90,   90,  100,   90, +       90,  100,   90,   90,  100,   90,   90,  100,   90,   90, + +      100,   90,   90,  100,   90,   90,  100,   90,   90,  100, +       90,   90,  100,   90,   90,  100,   90,   90,  100,   90, +       90,  100,   90,   90,  100,   90,   90,  100,   90,   90, +      100,   90,   90,  100,   90,   90,  100,   90,   90,  100, +       90,   90,  100,   90,   90,  100,   90,   90,  100,   90, +       90,  100,   90,   90,  100,   90,   90,  100,   90,   90, +      100,   90,   90,    0      } ;  static yyconst flex_int32_t yy_ec[256] = @@ -711,16 +715,16 @@ static yyconst flex_int32_t yy_ec[256] =          1,    1,    4,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    5,    1,    6,    7,    1,    1,    1,    1,    1, -        1,    1,    8,    1,    8,    9,   10,   11,   11,   12, -       13,   14,   13,   15,   13,   13,   13,   16,    1,    1, -        1,    1,    1,    1,   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,   26, -        1,    1,    1,    1,   42,    1,   43,   44,   45,   46, - -       47,   48,   49,   50,   51,   26,   52,   53,   54,   55, -       56,   57,   26,   58,   59,   60,   61,   62,   63,   64, -       65,   66,    1,   67,    1,    1,    1,    1,    1,    1, +        1,    1,    8,    1,    9,   10,   11,   12,   12,   13, +       14,   15,   14,   16,   14,   14,   14,   17,    1,    1, +        1,    1,    1,    1,   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,   27, +        1,    1,    1,    1,   43,    1,   44,   45,   46,   47, + +       48,   49,   50,   51,   52,   27,   53,   54,   55,   56, +       57,   58,   27,   59,   60,   61,   62,   63,   64,   65, +       66,   67,    1,   68,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1, @@ -737,2211 +741,2229 @@ static yyconst flex_int32_t yy_ec[256] =          1,    1,    1,    1,    1      } ; -static yyconst flex_int32_t yy_meta[68] = +static yyconst flex_int32_t yy_meta[69] =      {   0,          1,    1,    2,    1,    2,    2,    1,    1,    3,    4, -        5,    5,    5,    5,    5,    6,    5,    5,    5,    5, -        5,    5,    7,    7,    7,    7,    7,    7,    7,    7, -        7,    7,    7,    7,    7,    7,    7,    7,    7,    7, -        7,    1,    5,    5,    5,    5,    5,    5,    7,    7, -        7,    7,    7,    7,    7,    7,    7,    7,    7,    7, -        7,    7,    7,    7,    7,    7,    8 +        5,    6,    6,    6,    6,    6,    7,    6,    6,    6, +        6,    6,    6,    3,    3,    3,    3,    3,    3,    3, +        3,    3,    3,    3,    3,    3,    3,    3,    3,    3, +        3,    3,    1,    6,    6,    6,    6,    6,    6,    3, +        3,    3,    3,    3,    3,    3,    3,    3,    3,    3, +        3,    3,    3,    3,    3,    3,    3,    8      } ; -static yyconst flex_int16_t yy_base[4541] = +static yyconst flex_int16_t yy_base[4576] =      {   0, -        0,    0,10684,10685,   66,10685,10685,10680,   61,    0, -       68,   76,10666,   82,  139,   81,   64,   78,  137,  123, -       98,  147,   53,  100,  152,  155,  182,  193,  189,  127, -      210,  202,  204,  164,10638,  201,  242,  258,  309,  103, -    10677,10685,  269,    0,  275,  288,  299,10663,  103,10668, -      122,  366,10650,  275,10631,10629,  211,10629,  291,10628, -      277,  185,  187,  260,  280,  301,  304,  305,  307,10618, -      279,  333,  306,  175,  334,  332,  354,  337,  359,  350, -      227,  380,  377,  378,  379,  351,  382,  386,  404,  390, -      387,  388,  412,  126,  403,  422,  414,  425,  421,  426, - -      409,  423,  443,  436,  445,  452,  442,  470,  449,  483, -      453,  457,  485,  481,  478,  489,   99,  496,10685,  471, -      547,  521,  546,  559,  573,10655,  325,10654,  107,  528, -      511,  604,  510,  495,  533,10622,10610,10615,  530,10616, -      535,  577,10622,  560,  578,  563,  592,  597,  588,  594, -      595,  593,  612,  613,  617,  619,  621,  624,  653,  625, -      623,  630,  641,  659,  638,  626,  667,  656,  649,  671, -      683,  673,  660,  670,  686,  685,  690,  687,10685,  706, -      677,  693,  703,  691,  705,  695,  697,  714,  713,  731, -      729,  743,  747,  750,  751,  717,  752,  760,  759,  762, - -      761,  767,  769,  763,  783,  775,  771,  768,  805,  834, -      862,  870,10648,  327,10647,10646,10645,  840,  847,  784, -    10650,  876,  849,  851,  872,10602,  883,  850,  886,  888, -      789,  890,10597,  893,  894,  776,  895,  896,  899,10618, -      898,10685,  911,  909,  912,  913,  915,  916,  926,  927, -      917,  929,  930,  931,  965,  954,  918,  951,  932,  921, -      958,  922,10685,  974,  983,  979,  987,  988,  991,   81, -      990,  992,  994,  995,  996,  997, 1004,  998, 1003, 1017, -     1018,   99, 1020, 1013, 1027, 1031, 1019, 1008, 1021, 1040, -     1012, 1022, 1024, 1075, 1076, 1097, 1111, 1122, 1135,10640, - -      786,10639,10638,10637,10636,10635,  793,10640, 1086, 1141, -     1112, 1032,10685, 1105, 1116, 1124, 1097, 1154, 1150, 1152, -     1125, 1153, 1155, 1129, 1178, 1165, 1179,10632, 1158, 1160, -     1181, 1033, 1183, 1184, 1052, 1185, 1186, 1191, 1185,10631, -     1199, 1187, 1192, 1194, 1221, 1215, 1225, 1195, 1210, 1214, -     1228, 1251, 1248, 1241, 1253, 1252, 1255, 1258, 1256, 1259, -    10626,10625, 1260, 1262, 1264, 1263, 1267, 1274, 1268,10606, -     1275, 1266, 1293, 1332, 1342, 1350,10628,  792,10627,10626, -    10625,10624,10623,10622,10621,10620, 1286,10625, 1290, 1293, -    10624, 1356, 1363, 1320, 1321, 1365, 1323,10594, 1366, 1367, - -     1324, 1370, 1368, 1373, 1376, 1377, 1380, 1378, 1382,10607, -     1379, 1381, 1397, 1399, 1391,10584,10584,10574,10581,10581, -    10571, 1395, 1413, 1392,10606, 1394, 1400, 1402, 1405, 1438, -     1410, 1444, 1447, 1441, 1454, 1455, 1437, 1462, 1422, 1460, -     1459, 1465, 1463, 1470, 1469, 1476,10605,10593, 1472, 1468, -     1480, 1484, 1474,10605, 1502, 1497, 1548, 1560, 1567, 1575, -    10605,  797,10604,10603,10602,10601,10600,10599,10598,10597, -    10596,10595,10594, 1300,10599, 1524, 1528,10598, 1532, 1536, -     1581, 1549, 1486, 1487,10590, 1550, 1569, 1552, 1591, 1551, -     1592, 1594, 1616, 1596, 1593, 1597,10570, 1595, 1598, 1599, - -    10546,10558,10543,10543,10555,10540, 1617, 1618, 1605, 1622, -    10572, 1631, 1606, 1627, 1607, 1632, 1623, 1619,10685, 1636, -     1672, 1634, 1654, 1640, 1655, 1661, 1664, 1676, 1675, 1680, -     1684, 1688,10560,10561, 1679, 1686, 1693, 1681,10571, 1690, -     1689, 1750, 1757, 1765,10579, 1006,10578,10577,10576,10575, -    10574,10573,10572,10571,10570,10569,10568,10567,10566,10565, -    10564,10563, 1540,10568, 1704, 1713,10567, 1714, 1722, 1734, -     1742,10566, 1771,  459,10550,  129,   62,10558,  854,  538, -      988,  148, 1161,  248,  808, 1709,10685,  777,10557,10512, -    10513,10523,10509,10510,10520, 1743,  290, 1759, 1778,10685, - -    10550,10549, 1779, 1081, 1785, 1781, 1782, 1515, 1780, 1792, -     1770,10548,10547,10546, 1786, 1788, 1297, 1789, 1787,  130, -     1791,10685,10685, 1793, 1794, 1507,10545,10524, 1808, 1815, -     1849, 1856, 1864,10543, 1403,10542,10541,10540,10539,10538, -    10537,10536,10535,10534,10533,10532,10531,10530,10529,10528, -    10527,10526,10525,10524,10523,10522, 1829,10527, 1836, 1840, -     1871, 1872, 1873, 1874,10526, 1875, 1876, 1883, 1889, 1796, -    10499, 1797, 1819, 1878, 1816, 1795, 1879, 1880,  580, 1881, -     1898,10518,10482,10485,10473,10479,10482,10470, 1882, 1896, -    10511, 1900, 1899, 1897, 1901,10510, 1902, 1904, 1905, 1907, - -     1888, 1903,  345, 1906, 1910,10509, 1913, 1911,10508, 1930, -     1914,10685,10507, 1964, 1972,10506, 1718,10505,10504,10503, -    10502,10501,10500,10499,10498,10497,10496,10495,10494,10493, -    10492,10491,10490,10489,10488,10487,10486,10485,10484,10483, -    10482,10481,10480, 1948,10485, 1955, 1979,10484, 1980, 1981, -     1982,10483, 1983, 1984, 1991, 1992, 1993, 1994,10480, 2000, -     1807,10685, 1966, 1989, 1950, 2007, 2008, 2010, 2012,  805, -     1940, 2013,10431,10423,10430,10419,10411,10418, 2014, 1915, -     2015, 1922, 2016, 2019, 2017, 2020, 2018,10446,10685, 2021, -     2022, 2024, 2023, 2025, 2033, 2026, 2034, 2077, 2085,10442, - -     2042,10438,10434,10430,10426,10422,10418,10414,10410,10406, -    10402,10398,10394,10390,10386,10382,10378,10374,10370,10363, -    10349,10327,10295,10251,10197,10192,10110,10105,10010,10005, -     9890, 2044, 9891, 2068, 2069, 9762, 2092, 2093, 2094, 2095, -     2096, 2097, 2104, 2105, 9757, 2106, 2107, 2108, 2109, 2115, -     2079, 2122,  413, 2123, 2124, 2125, 2127, 2128, 9600, 2126, -     2132, 9568, 9388, 9399, 9213, 9192, 9006, 2130, 2136, 9028, -     2131, 2138, 2139, 2133, 2134, 2135, 2137, 2140, 8804, 2141, -     2148, 2160, 2150, 2149, 2199, 2207, 8799, 2158, 8574, 8569, -     8332, 8327, 8101, 8096, 7870, 7865, 7663, 7658, 7461, 7456, - -     7285, 7280, 7115, 7110, 6969, 6964, 6832, 6827, 6717, 6712, -     6612, 6607, 6527, 6522, 6457, 6410, 6375, 6351, 6334, 6323, -     6315, 6309, 6305, 2161, 6303, 2186, 2189, 6287, 2193, 2214, -     2215, 2216, 6286, 2217, 2218, 2219, 6285, 2226, 2227, 2228, -     2229, 2230, 2231, 2238, 6284, 2244, 2153, 6277, 2235, 2234, -      583, 2156, 2251, 2252, 2253, 2254, 6232,10685, 6241, 6219, -    10685, 6226, 2255, 2233, 2237, 2236, 2256, 2257, 2258, 2259, -     6243, 2261, 2263, 2264, 2265, 2270, 2266, 2310, 2318, 6242, -     2288, 6241, 6240, 6233, 6225, 6217, 6205, 6204, 6203, 6202, -     6195, 6187, 6179, 6167, 6166, 6165, 6164, 6157, 6149, 6129, - -     6128, 6127, 6126, 6119, 6111, 6103, 6091, 6090, 6089, 6088, -     6081, 6073, 6065, 6053, 6052, 6051, 6050, 6043, 6035, 6027, -     2286, 6021, 2325, 2326, 2327, 2328, 2329, 2330, 6020, 2337, -     2338, 2339, 2340, 2341, 2342, 2349, 2350, 2351, 2352, 6019, -     2353, 2354, 2361, 2362, 2368, 6012, 2375, 6005, 2357, 2268, -     2269, 2358, 1065, 2377, 5962, 5946, 5941, 5944, 2260, 2376, -     2359, 2360, 2379, 2383, 1933, 2380, 2381, 2384, 2386, 2387, -     2389, 2390, 2410, 2433, 5974, 2289, 5967, 5959, 5951, 5939, -     5938, 5937, 5936, 5929, 5921, 5913, 5901, 5900, 5899, 5898, -     5891, 5883, 5875, 5863, 5862, 5861, 5860, 5853, 5845, 5825, - -     5824, 5823, 5822, 5815, 5807, 5799, 5787, 5786, 5785, 5784, -     5777, 5769, 5761, 5749, 5748, 5747, 5746, 5739, 5731, 5723, -     2417, 5717, 2440, 2441, 5716, 2442, 2444, 2445, 5715, 2449, -     2452, 2453, 2454, 2456, 2457, 5714, 2461, 2464, 2465, 5707, -     2466, 2468, 2469, 2473, 2476, 2477, 2478, 5699, 2484, 2474, -     2475, 5673, 2491, 2492, 2493, 2040, 5632,10685, 5631,10685, -     5670, 2494, 2392, 2051, 2152, 2495, 2391, 2499, 2496, 2497, -     2498, 2500, 2501, 2502, 2510, 2527, 5663, 2401, 5655, 5647, -     5635, 5634, 5633, 5632, 5625, 5617, 5609, 5597, 5596, 5595, -     5594, 5587, 5579, 5571, 5559, 5558, 5557, 5556, 5549, 5541, - -     5521, 5520, 5519, 5518, 5511, 5503, 5495, 5483, 5482, 5481, -     5480, 5473, 5465, 5457, 5445, 5444, 5443, 5442, 5435, 5427, -     5419, 5407, 5406, 5405, 5404, 5397, 2539, 5395, 2541, 2546, -     5375, 2550, 2551, 2553, 2555, 2560, 2562, 2563, 2564, 5374, -     2565, 2567, 2572, 2574, 2575, 2576, 2577, 2579, 2584, 2586, -     2587, 5373, 2588, 2589, 2591, 2596, 2602, 2592, 2593, 2609, -     2610, 2594, 2611, 5327, 5320, 2595, 2614, 2615, 2616, 2617, -     2618, 2619, 5351, 2620, 2621, 5343, 5331, 2622, 2645, 2673, -     5330, 2654, 5329, 5328, 5321, 5313, 5305, 5293, 5292, 5291, -     5290, 5283, 5275, 5267, 5255, 5254, 5253, 5252, 5245, 5237, - -     5222, 5221, 5220, 5219, 5218, 5210, 5209, 5208, 5207, 5200, -     5192, 5184, 5176, 5175, 5174, 5173, 5164, 5163, 5162, 5161, -     5154, 5146, 5138, 5128, 5127, 5106, 5105, 5104,   54,   70, -      159,  237,  322,  344,  446, 2657,  513, 2662, 2665,  568, -     2680, 2681, 2682, 2683,  696, 2684, 2685, 2692,  704, 2693, -     2694, 2695, 2696, 2697, 2704, 2705,  812, 2706, 2707, 2708, -      926, 2709, 2716, 2717, 2718, 2719, 2720, 2721,  939, 2727, -     2624, 2734, 2735, 2736, 1007, 2504, 1009, 1073, 1197, 2737, -     2738, 2739, 2741, 2740, 2742, 1277, 1333, 2037, 2750, 2781, -     1334, 2751, 1406, 1407, 1479, 1503, 1652, 1700, 1721, 1725, - -     1820, 1841, 1938, 2036, 2061, 2163, 2176, 2188, 2284, 2393, -     2413, 2414, 2418, 2521, 2532, 2623, 2626, 2627, 2635, 2639, -     2648, 2649, 2752, 2753, 2760, 2764, 2765, 2766, 2767, 2769, -     2773, 2782, 2783, 2784, 2786, 2787, 2788, 2789, 2790, 2791, -     2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2807, -     2808, 2809, 2810, 2811, 2812, 2814, 2819, 2821, 2822, 2823, -     2824, 2826, 2827, 2831, 2834, 2835, 2836, 2838, 2839, 2843, -     2845, 2846, 2847, 2848, 2850, 2855, 2857, 2858, 2859, 2860, -     2862, 2867, 2868, 2869, 2870, 2876, 2865, 2866, 2883, 2884, -     2885, 2885, 2886, 2888, 2889, 2890, 2896, 2891, 2892, 2897, - -     2930, 2938, 2893, 2901, 2895, 2898, 2900, 2902, 2910, 2911, -     2914, 2915, 2916, 2917, 2919, 2932, 2939, 2940, 2942, 2943, -     2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, -     2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, -     2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, -     2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, -     2984, 2985, 2986, 2987, 2994, 2995, 2996, 2997, 2998, 2999, -     3001, 3004, 3006, 3008, 3009, 3011, 3012, 3013, 3016, 3020, -     3021, 3023, 3024, 3025, 3026, 3028, 3031, 3033, 3035, 3036, -     3038, 3040, 3043, 3045, 3046, 3047, 3048, 3050, 3053, 3055, - -     3057, 3058, 3060, 3062, 3066, 3059, 3073, 3074, 3075, 3046, -     3047, 3078, 3079, 3084, 3085, 3081, 3080, 3106, 3134, 3089, -     3121, 3083, 3086, 3087, 3088, 3091, 3092, 3122, 3100, 3112, -     3116, 3117, 3118, 3123, 3124, 3125, 3126, 3135, 3136, 3137, -     3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, -     3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, -     3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, -     3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, -     3178, 3179, 3180, 3187, 3188, 3189, 3190, 3191, 3192, 3194, -     3197, 3199, 3201, 3202, 3204, 3206, 3209, 3211, 3213, 3214, - -     3215, 3216, 3218, 3223, 3225, 3226, 3227, 3228, 3230, 3235, -     3236, 3237, 3238, 3239, 3240, 3247, 3248, 3249, 3250, 3251, -     3252, 3258, 3259, 3260, 3261, 3267, 3257, 3256, 3274, 3275, -     3246, 3247, 3278, 3279, 3280, 3281, 3282, 3283, 3317, 3334, -     3291, 3285, 3286, 3288, 3289, 3292, 3293, 3301, 3302, 3303, -     3304, 3306, 3307, 3308, 3309, 3319, 3322, 3323, 3324, 3325, -     3326, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, -     3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, -     3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, -     3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, - -     3374, 3375, 3376, 3377, 3384, 3385, 3386, 3387, 3388, 3389, -     3391, 3396, 3398, 3399, 3400, 3401, 3402, 3403, 3407, 3410, -     3411, 3412, 3414, 3415, 3419, 3421, 3422, 3423, 3424, 3426, -     3429, 3431, 3433, 3434, 3436, 3438, 3441, 3443, 3444, 3445, -     3446, 3448, 3451, 3453, 3455, 3456, 3458, 3460, 3464, 3457, -     3471, 3472, 3431, 3432, 3475, 3476, 3477, 3478, 3479, 3480, -     3490, 3504, 3481, 3482, 3498, 3505, 3506, 3507, 3508, 3510, -     3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, -     3521, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, -     3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, - -     3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, -     3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, -     3562, 3563, 3564, 3571, 3572, 3573, 3574, 3575, 3576, 3581, -     3583, 3584, 3585, 3586, 3588, 3593, 3595, 3596, 3597, 3598, -     3600, 3603, 3605, 3607, 3608, 3610, 3612, 3615, 3617, 3619, -     3620, 3622, 3624, 3626, 3627, 3629, 3631, 3634, 3636, 3638, -     3639, 3641, 3643, 3646, 3648, 3649, 3650, 3656, 3614, 3616, -     3663, 3664, 3666, 3672, 3680, 3674, 3681, 3682, 3689, 3690, -     3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, -     3701, 3702, 3703, 3704, 3707, 3708, 3709, 3710, 3711, 3712, - -     3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, -     3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, -     3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, -     3743, 3744, 3745, 3752, 3753, 3754, 3755, 3756, 3757, 3764, -     3765, 3766, 3767, 3768, 3769, 3770, 3774, 3777, 3778, 3779, -     3781, 3782, 3786, 3788, 3789, 3790, 3791, 3793, 3796, 3798, -     3800, 3801, 3803, 3805, 3808, 3810, 3811, 3812, 3813, 3815, -     3818, 3820, 3822, 3823, 3825, 3827, 3831, 3781, 3795, 3839, -     3840, 3848, 3856, 3842, 3850, 3857, 3864, 3865, 3866, 3867, -     3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, - -     3878, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3888, 3889, -     3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, -     3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, -     3910, 3911, 3912, 3913, 3914, 3915, 3916, 3923, 3924, 3925, -     3926, 3927, 3928, 3935, 3936, 3937, 3938, 3939, 3940, 3945, -     3947, 3948, 3949, 3950, 3952, 3957, 3959, 3960, 3961, 3962, -     3964, 3968, 3969, 3971, 3972, 3973, 3976, 3980, 3981, 3983, -     3984, 3985, 3988, 3991, 3992, 3993, 3999, 3946, 3947, 4006, -     4007, 4015, 4023, 4009, 4017, 4024, 4025, 4032, 4033, 4034, -     4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, - -     4045, 4047, 4055, 4049, 4050, 4052, 4054, 4056, 4057, 4058, -     4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, -     4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, -     4079, 4086, 4087, 4088, 4089, 4090, 4091, 4095, 4098, 4099, -     4100, 4102, 4103, 4107, 4110, 4111, 4112, 4113, 4114, 4115, -     4119, 4122, 4123, 4124, 4126, 4127, 4131, 4133, 4134, 4135, -     4136, 4138, 4141, 4143, 4145, 4146, 4148, 4150, 4154,10685, -    10685, 4147, 4161, 4162, 4170, 4178, 4164, 4172, 4179, 4180, -     4187, 4188, 4189, 4190, 4192, 4193, 4194, 4195, 4197, 4198, -     4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, - -     4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, -     4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4233, 4234, -     4235, 4236, 4237, 4238, 4244, 4245, 4246, 4247, 4248, 4249, -     4256, 4257, 4258, 4259, 4260, 4261, 4267, 4268, 4269, 4270, -     4271, 4272, 4279, 4280, 4281, 4282, 4283, 4284, 4290, 4291, -     4292, 4293, 4299, 4288, 4289, 4313, 4321, 4307, 4315, 4323, -     4324, 4325, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, -     4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, -     4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, -     4360, 4361, 4362, 4363, 4370, 4371, 4372, 4373, 4374, 4375, - -     4382, 4383, 4384, 4385, 4386, 4387, 4388, 4392, 4395, 4396, -     4397, 4399, 4400, 4404, 4406, 4407, 4408, 4409, 4411, 4414, -     4416, 4418, 4419, 4421, 4423, 4427, 4420, 4441, 4449, 4435, -     4443, 4450, 4451, 4452, 4453, 4460, 4461, 4462, 4463, 4464, -     4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, -     4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, -     4485, 4492, 4493, 4494, 4495, 4496, 4497, 4504, 4505, 4506, -     4507, 4508, 4509, 4514, 4516, 4517, 4518, 4519, 4521, 4526, -     4528, 4529, 4530, 4531, 4533, 4537, 4538, 4540, 4546, 4560, -     4568, 4535, 4536, 4539, 4554, 4562, 4569, 4570, 4571, 4572, - -     4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, -     4589, 4590, 4591, 4592, 4593, 4594, 4595, 4602, 4603, 4604, -     4605, 4606, 4607, 4611, 4614, 4615, 4616, 4618, 4619, 4623, -     4626, 4627, 4628, 4629, 4630, 4631, 4635, 4638, 4639, 4640, -     4642, 4643, 4648, 4662, 4670, 4641, 4656, 4664, 4671, 4672, -     4673, 4674, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, -     4689, 4690, 4691, 4692, 4693, 4694, 4701, 4702, 4703, 4704, -     4705, 4706, 4712, 4713, 4714, 4715, 4716, 4717, 4724, 4725, -     4726, 4727, 4728, 4729, 4735, 4736, 4737, 4738, 4744, 4758, -     4766, 4733, 4734, 4752, 4760, 4767, 4768, 4769, 4770, 4777, - -     4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4792, 4793, -     4794, 4795, 4796, 4797, 4804, 4805, 4806, 4807, 4808, 4809, -     4810, 4814, 4817, 4818, 4819, 4821, 4822, 4827, 4841, 4849, -     4820, 4835, 4843, 4850, 4851, 4852, 4853, 4860, 4861, 4862, -     4863, 4864, 4865, 4872, 4873, 4874, 4875, 4876, 4877, 4884, -     4885, 4886, 4887, 4888, 4889, 4894, 4896, 4897, 4903, 4917, -     4925, 4892, 4893, 4895, 4911, 4919, 4926, 4927, 4928, 4929, -     4936, 4943, 4944, 4945, 4946, 4947, 4948, 4952, 4955, 4956, -     4957, 4959, 4960, 4964, 4966, 4980, 4988, 4966, 4974, 4982, -     4989, 4990, 4991, 4998, 5005, 5006, 5007, 5008, 5009, 5010, - -     5016, 5017, 5018, 5019, 5025, 5039, 5047, 5014, 5015, 5033, -     5041, 5048, 5063, 5055, 5069, 5070, 5071, 5072, 5073, 5074, -     5056, 5080, 5094, 5102, 5051, 5080, 5118, 5123, 5094, 5129, -     5130, 5131, 5132, 5138, 5152, 5160, 5096, 5109, 5177, 5178, -     5184, 5198, 5206, 5223, 5229, 5243, 5251, 5267, 5281, 5289, -     5305, 5319, 5327, 5343, 5357, 5365, 5381, 5395, 5403, 5419, -     5433, 5441, 5457, 5471, 5479, 5495, 5509, 5517, 5533, 5547, -     5555, 5571, 5585, 5593, 5609, 5623, 5631, 5647, 5661, 5669, -     5685, 5699, 5707, 5723, 5737, 5745, 5761, 5775, 5783, 5799, -     5813, 5821, 5837, 5851, 5859, 5875, 5889, 5897, 5913, 5927, - -     5935, 5951, 5965, 5973, 5989, 6003, 6011, 6027, 6041, 6049, -     6065, 6079, 6087, 6103, 6117, 6125, 6141, 6155, 6163, 6179, -     6193, 6201, 6217, 6231, 6239, 6255, 6269, 6276,10685, 6303, -     6311, 6317, 6321, 6327, 6329, 6332, 6335, 6337, 6339, 6342, -     6346, 6348, 6350, 6352, 6354, 6357, 6360, 6363, 6365, 6367, -     6369, 6371, 6373, 6375, 6378, 6381, 6383, 6387, 6389, 6391, -     6393, 6395, 6397, 6399, 6401, 6403, 6405, 6408, 6411, 6413, -     6416, 6419, 6422, 6424, 6426, 6428, 6430, 6432, 6434, 6436, -     6438, 6440, 6442, 6444, 6446, 6449, 6452, 6454, 6457, 6460, -     6462, 6465, 6469, 6471, 6473, 6475, 6477, 6479, 6481, 6483, - -     6485, 6487, 6489, 6491, 6493, 6495, 6497, 6499, 6501, 6503, -     6506, 6509, 6511, 6514, 6517, 6519, 6522, 6525, 6528, 6531, -     6534, 6539, 6541, 6543, 6545, 6547, 6549, 6551, 6553, 6555, -     6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6575, -     6577, 6579, 6581, 6584, 6587, 6589, 6592, 6595, 6598, 6601, -     6604, 6607, 6609, 6612, 6615, 6619, 6624, 6626, 6628, 6630, -     6632, 6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, -     6652, 6654, 6656, 6658, 6660, 6662, 6664, 6666, 6668, 6670, -     6672, 6674, 6676, 6679, 6682, 6684, 6687, 6690, 6692, 6695, -     6698, 6701, 6703, 6706, 6709, 6712, 6715, 6718, 6721, 6724, - -     6729, 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, -     6749, 6751, 6753, 6755, 6757, 6759, 6761, 6763, 6765, 6767, -     6769, 6771, 6773, 6775, 6777, 6779, 6781, 6783, 6785, 6787, -     6790, 6793, 6795, 6798, 6801, 6803, 6806, 6809, 6812, 6815, -     6818, 6821, 6824, 6827, 6829, 6832, 6835, 6839, 6844, 6846, -     6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, -     6868, 6870, 6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, -     6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902, 6904, 6906, -     6908, 6910, 6912, 6914, 6917, 6920, 6922, 6925, 6928, 6930, -     6933, 6936, 6939, 6942, 6944, 6947, 6950, 6953, 6955, 6958, - -     6961, 6964, 6967, 6970, 6973, 6976, 6981, 6983, 6985, 6987, -     6989, 6991, 6993, 6995, 6997, 6999, 7001, 7003, 7005, 7007, -     7009, 7011, 7013, 7015, 7017, 7019, 7021, 7023, 7025, 7027, -     7029, 7031, 7033, 7035, 7037, 7039, 7041, 7043, 7045, 7047, -     7049, 7051, 7053, 7055, 7058, 7061, 7063, 7066, 7069, 7072, -     7075, 7078, 7081, 7083, 7086, 7089, 7092, 7095, 7098, 7101, -     7104, 7107, 7110, 7112, 7115, 7118, 7122, 7127, 7129, 7131, -     7133, 7135, 7137, 7139, 7141, 7143, 7145, 7147, 7149, 7151, -     7153, 7155, 7157, 7159, 7161, 7163, 7165, 7167, 7169, 7171, -     7173, 7175, 7177, 7179, 7181, 7183, 7185, 7187, 7189, 7191, - -     7193, 7195, 7197, 7199, 7201, 7203, 7205, 7207, 7209, 7211, -     7213, 7216, 7219, 7221, 7224, 7227, 7229, 7232, 7235, 7238, -     7240, 7243, 7246, 7249, 7252, 7255, 7258, 7260, 7263, 7266, -     7269, 7271, 7274, 7277, 7280, 7283, 7286, 7289, 7292, 7297, -     7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, 7317, -     7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, -     7339, 7341, 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, -     7359, 7361, 7363, 7365, 7367, 7369, 7371, 7373, 7375, 7377, -     7379, 7381, 7383, 7385, 7387, 7390, 7393, 7395, 7398, 7401, -     7403, 7406, 7409, 7412, 7415, 7418, 7421, 7424, 7427, 7429, - -     7432, 7435, 7438, 7441, 7444, 7447, 7450, 7453, 7456, 7458, -     7461, 7464, 7468, 7473, 7475, 7477, 7479, 7481, 7483, 7485, -     7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, -     7507, 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, -     7527, 7529, 7531, 7533, 7535, 7537, 7539, 7541, 7543, 7545, -     7547, 7549, 7551, 7553, 7555, 7557, 7559, 7561, 7563, 7565, -     7567, 7569, 7571, 7573, 7575, 7577, 7580, 7583, 7585, 7588, -     7591, 7593, 7596, 7599, 7602, 7605, 7607, 7610, 7613, 7616, -     7618, 7621, 7624, 7627, 7630, 7633, 7636, 7638, 7641, 7644, -     7647, 7649, 7652, 7655, 7658, 7661, 7664, 7667, 7670, 7675, - -     7677, 7679, 7681, 7683, 7685, 7687, 7689, 7691, 7693, 7695, -     7697, 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, -     7717, 7719, 7721, 7723, 7725, 7727, 7729, 7731, 7733, 7735, -     7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, -     7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, -     7777, 7779, 7781, 7784, 7787, 7789, 7792, 7795, 7798, 7801, -     7804, 7807, 7809, 7812, 7815, 7818, 7821, 7824, 7827, 7830, -     7833, 7836, 7838, 7841, 7844, 7847, 7850, 7853, 7856, 7859, -     7862, 7865, 7867, 7870, 7873, 7877, 7882, 7884, 7886, 7888, -     7890, 7892, 7894, 7896, 7898, 7900, 7902, 7904, 7906, 7908, - -     7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, 7928, -     7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 7946, 7948, -     7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, 7968, -     7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, -     7990, 7992, 7994, 7996, 7998, 8001, 8004, 8006, 8009, 8012, -     8014, 8017, 8020, 8023, 8025, 8028, 8031, 8034, 8037, 8040, -     8043, 8045, 8048, 8051, 8054, 8056, 8059, 8062, 8065, 8068, -     8071, 8074, 8076, 8079, 8082, 8085, 8087, 8090, 8093, 8096, -     8099, 8102, 8105, 8108, 8113, 8115, 8117, 8119, 8121, 8123, -     8125, 8127, 8129, 8131, 8133, 8135, 8137, 8139, 8141, 8143, - -     8145, 8147, 8149, 8151, 8153, 8155, 8157, 8159, 8161, 8163, -     8165, 8167, 8169, 8171, 8173, 8175, 8177, 8179, 8181, 8183, -     8185, 8187, 8189, 8191, 8193, 8195, 8197, 8199, 8201, 8203, +        0,    0,10775,10776,   67,10776,10776,10771,   61,    0, +       68,   76,10756,   82,  139,   81,   64,   78,  137,  123, +       98,  147,   53,  100,  152,  155,  182,  193,  196,  127, +      191,  202,  214,  192,10728,  219,  249,  248,  221,  300, +      104,10768,10776,  286,    0,  295,  326,  350,10753,  103, +    10758,  122,  357,10740,  277,10721,10719,  244,10719,  258, +    10718,  224,  260,  224,  329,  266,  237,  342,  330,  364, +      368,10708,  365,  366,  363,  370,  367,  377,  376,  390, +      379,  341,  375,  382,  391,  403,  397,  159,  398,  396, +      411,  408,  410,  437,  438,  405,  443,  431,  450,  446, + +      458,  445,  451,  435,  460,  467,  464,  469,  475,  483, +      471,  484,  491,  516,  473,  517,  519,  521,  531,   99, +      524,10776,  518,  582,  548,  562,  581,  594,10745,  215, +    10744,  107,  600,  274,  639,  604,  566,  568,10712,10700, +    10705,  601,10706,  603,  612,10712,  621,  571,  629,  606, +      565,  623,  628,  625,  630,  287,  647,  646,  649,  658, +      660,  661,  685,  664,  665,  675,  673,  686,  678,  691, +      688,  692,  699,  701,  702,  696,  723,  707,  703,  717, +      733,  474,10776,  720,  757,  727,  728,  756,  759,  721, +      760,  731,  766,  763,  767,  783,  781,  773,  788,  777, + +      780,  786,  787,  792,  789,  790,  797,  798,  791,  801, +      809,  795,  810,  836,  867,  893,  901,10738,  303,10737, +    10736,10735,  872,  878,  308,10740,  907,  880,  882,  903, +    10692,  914,  881,  917,  919,  921,  923,10687,  924,  925, +      927,  926,  929,  940,  930,10708,  942,10776,  946,  948, +      943,  944,  947,  989,  956,  961,  960,  962,  969,  964, +     1005,  985, 1003,  992, 1006,  963,  996,  966,10776, 1018, +     1021, 1023, 1024, 1025, 1028, 1029,   81, 1030, 1032, 1033, +     1035, 1042, 1034, 1049, 1039, 1044, 1053, 1055,   99, 1061, +     1059, 1066, 1071, 1060, 1062, 1067, 1073, 1103, 1087, 1096, + +     1098, 1108, 1118, 1165, 1175, 1182, 1190,10730,  472,10729, +    10728,10727,10726,10725,  313,10730,  554, 1196, 1116, 1115, +    10776, 1165, 1133, 1203, 1204, 1211, 1205, 1206, 1207, 1210, +     1212, 1222, 1217, 1215, 1233, 1220,10722, 1218, 1235, 1219, +     1221, 1239, 1240,  823, 1101, 1245, 1247, 1241,10721, 1237, +     1260, 1265, 1280, 1283, 1253, 1294, 1278, 1285, 1287, 1289, +     1101, 1306, 1293, 1310, 1295, 1312, 1305, 1313, 1314, 1319, +    10716,10715, 1309, 1318, 1322, 1320, 1321, 1353, 1325, 1335, +    10696, 1327, 1348, 1372, 1384, 1397, 1410,10718,  539,10717, +    10716,10715,10714,10713,10712,10711,10710, 1132,10715, 1140, + +     1143,10714, 1429, 1387, 1362, 1398, 1385, 1388,10684, 1402, +     1400, 1419, 1420, 1411, 1412, 1416, 1421, 1445, 1444, 1422, +     1447,10697, 1446, 1448, 1450, 1468, 1475,10674,10674,10664, +    10671,10671,10661, 1484, 1476, 1469,10696, 1477, 1482, 1478, +     1479, 1480, 1483, 1481, 1505, 1500, 1488, 1494, 1518, 1470, +     1513, 1517, 1507, 1540, 1523, 1543, 1544, 1546, 1548,10695, +    10683, 1552, 1549, 1553, 1566, 1554, 1557,10695, 1563, 1582, +     1584, 1625, 1632, 1641,10695, 1130,10694,10693,10692,10691, +    10690,10689,10688,10687,10686,10685,10684, 1148,10689, 1157, +     1491,10688, 1492, 1576, 1647, 1615, 1560, 1584,10680, 1616, + +     1656, 1657, 1658, 1609, 1659, 1661, 1663, 1664, 1665, 1669, +     1662,10660, 1670, 1682, 1673,10636,10648,10633,10633,10645, +    10630, 1680, 1684, 1689, 1686,10662, 1685, 1688, 1690, 1697, +     1698, 1687, 1694,10776, 1742, 1699, 1729, 1727, 1703, 1723, +     1751, 1752, 1753, 1755, 1756, 1761, 1763, 1764,10650,10651, +     1765, 1766, 1768, 1759, 1771,10661, 1769, 1787, 1828, 1835, +     1844,10669, 1359,10668,10667,10666,10665,10664,10663,10662, +    10661,10660,10659,10658,10657,10656,10655,10654,10653, 1598, +    10658, 1607, 1612,10657, 1711, 1773, 1776, 1787,10656, 1850, +      129,10640,  853,   62,10648,  297, 1777,  177, 1836,  806, + +      404,  130, 1021, 1794,10776, 1857,10647,10602,10603,10613, +    10599,10600,10610, 1858,  536, 1859,  537,10776,10640,10639, +     1860, 1782, 1864, 1862, 1863,  148, 1861, 1871, 1852,10638, +    10637,10636, 1865, 1867, 1869, 1303, 1868, 1046, 1886,10776, +    10776, 1571, 1870, 1887,10635,  269,10614, 1889, 1877, 1928, +     1935, 1943,10633, 1895,10632,10631,10630,10629,10628,10627, +    10626,10625,10624,10623,10622,10621,10620,10619,10618,10617, +    10616,10615,10614,10613,10612, 1791,10617, 1795, 1900, 1915, +     1918, 1950, 1951,10616, 1952, 1953, 1954, 1960, 1897,10589, +     1929, 1937, 1949, 1967, 1572, 1970, 1971,  613, 1972, 1973, + +     1976,10608,10572,10575,10563,10569,10572,10560, 1974, 1975, +    10601,  815, 1978, 1977, 1979,10600, 1981, 1993, 1994, 1982, +     1975, 1983,  160, 1762, 1984,10599, 1996, 1985,10598,  549, +     1997,  836,10776,10597, 2039, 2047,10596, 2005,10595,10594, +    10593,10592,10591,10590,10589,10588,10587,10586,10585,10584, +    10583,10582,10581,10580,10579,10578,10577,10576,10575,10574, +    10573,10572,10571,10570, 2012,10575, 2054, 2055,10574, 2056, +     2057, 2058,10573, 2059, 2066, 2067, 2068, 2069, 2070,10570, +     2076, 1986,10776, 2020, 1330, 2001, 2083, 2084, 2085, 2086, +      949,  823, 2087, 2088,10521,10513,10520,10509,10501,10508, + +     2089, 1999, 2090, 2092, 1355, 1892, 2093, 2091, 2094,10536, +    10776, 2095, 2096, 2097, 2098, 2101, 2111, 2099, 2112, 2109, +     2157, 2165,10532, 2011,10528,10524,10520,10516,10512,10508, +    10504,10500,10496,10492,10488,10484,10480,10476,10472,10468, +    10464,10460,10453,10439,10417,10385,10341,10287,10283,10200, +    10196,10100,10096, 9980, 2119, 9982, 2120, 2145, 9852, 2172, +     2173, 2174, 2175, 2176, 2177, 2184, 2185, 9848, 2186, 2187, +     2188, 2189, 2195, 2159, 2102, 2100, 2202, 2203, 2204, 2206, +     2207, 9690, 2118, 2205, 2210, 9659, 9478, 9490, 9303, 9283, +     9096, 2208, 2211, 9119, 2212, 1213, 2214, 2220, 2213, 2216, + +     2215, 2221, 8894, 2217, 2218, 2219, 2230, 2228, 2110, 2276, +     2284, 8890, 2239, 8664, 8660, 8422, 8418, 8191, 8187, 7960, +     7956, 7753, 7749, 7551, 7547, 7375, 7371, 7205, 7201, 7059, +     7055, 6922, 6918, 6807, 6803, 6702, 6698, 6617, 6613, 6547, +     6500, 6465, 6441, 6424, 6413, 6405, 6400, 6395, 2241, 6393, +     2242, 2291, 6377, 2292, 2293, 2294, 2295, 6376, 2296, 2303, +     2304, 6375, 2305, 2306, 2307, 2308, 2315, 2316, 2317, 6374, +     2323, 2233, 6367, 2314, 2234,  540, 2267, 2330, 2331, 2332, +     2333, 2313, 6322,10776, 6331, 6309,10776, 6316, 2334, 2335, +     2336, 2337, 2341, 2338, 2339, 2340, 6333, 2231, 2342, 2344, + +     2346, 2343, 2347, 2357, 2394, 2402, 6332, 2365, 6331, 6330, +     6323, 6315, 6307, 6295, 6294, 6293, 6292, 6285, 6277, 6269, +     6257, 6256, 6255, 6254, 6247, 6239, 6219, 6218, 6217, 6216, +     6209, 6201, 6193, 6181, 6180, 6179, 6178, 6171, 6163, 6155, +     6143, 6142, 6141, 6140, 6133, 6125, 6117, 2367, 6111, 2409, +     2410, 2411, 2412, 2413, 2414, 6110, 2421, 2422, 2423, 2424, +     2425, 2426, 2433, 2434, 2435, 2436, 6109, 2437, 2438, 2445, +     2446, 2452, 6102, 2348, 6095, 2345, 2441, 2442, 2443, 2444, +     2459, 2460, 6052, 6036, 6031, 6034, 2359, 2461, 2360, 2462, +     2463, 2468,  318, 2464, 2465, 2471, 2349, 2466, 2473, 2474, + +     2472, 2493, 2522, 6064, 2501, 6057, 6049, 6041, 6029, 6028, +     6027, 6026, 6019, 6011, 6003, 5991, 5990, 5989, 5988, 5981, +     5973, 5965, 5953, 5952, 5951, 5950, 5943, 5935, 5915, 5914, +     5913, 5912, 5905, 5897, 5889, 5877, 5876, 5875, 5874, 5867, +     5859, 5851, 5839, 5838, 5837, 5836, 5829, 5821, 5813, 2529, +     5807, 2530, 2531, 5806, 2532, 2533, 2534, 5805, 2541, 2542, +     2543, 2544, 2545, 2546, 5804, 2553, 2554, 2555, 5797, 2556, +     2557, 2558, 2565, 2566, 2567, 2568, 5789, 2574, 2563, 2564, +     5763, 2475, 2476, 2581, 1025, 2582, 5722,10776, 5721,10776, +     5760, 2583, 2584,  708, 1236, 2585, 2586, 2591, 2587, 2588, + +     2589, 2590, 2592, 2593, 2595, 2649, 2657, 5753, 2502, 5745, +     5737, 5725, 5724, 5723, 5722, 5715, 5707, 5699, 5687, 5686, +     5685, 5684, 5677, 5669, 5661, 5649, 5648, 5647, 5646, 5639, +     5631, 5611, 5610, 5609, 5608, 5601, 5593, 5585, 5573, 5572, +     5571, 5570, 5563, 5555, 5547, 5535, 5534, 5533, 5532, 5525, +     5517, 5509, 5497, 5496, 5495, 5494, 5487, 2600, 5485, 2616, +     2618, 5465, 2628, 2632, 2637, 2641, 2664, 2665, 2666, 2667, +     5464, 2668, 2669, 2676, 2677, 2678, 2679, 2680, 2681, 2688, +     2689, 2690, 5463, 2691, 2692, 2693, 2700, 2706, 2695, 2597, +      476, 2135, 2599, 2696, 5456, 5410, 5402, 2596, 2697, 2698, + +     2699, 2713, 2614, 2714, 5433, 2715, 2717, 5421, 5420, 2718, +     2716, 2726, 2769, 5419, 2727, 5418, 5411, 5403, 5395, 5383, +     5382, 5381, 5380, 5373, 5365, 5357, 5345, 5344, 5343, 5342, +     5335, 5327, 5312, 5311, 5310, 5309, 5308, 5300, 5299, 5298, +     5297, 5290, 5282, 5274, 5266, 5265, 5264, 5263, 5254, 5253, +     5252, 5251, 5244, 5236, 5228, 5218, 5217, 5196, 5195, 5194, +       54,   70,  185,  333,  413,  550,  631,  718, 2746,  725, +     2756, 2757,  739, 2759, 2760, 2776, 2777,  740, 2778, 2779, +     2780,  891, 2781, 2788, 2789, 2790, 2791, 2792, 2793,  957, +     2800, 2801, 2802,  958, 2803, 2804, 2805, 2812, 2813, 2814, + +     2815, 1047, 2821, 2810, 2478, 2811, 2828, 1125, 2598, 1113, +     1124, 1389, 2730, 2829, 2830, 2832, 2831, 2833, 1414, 1493, +     1786, 2834, 2875, 2884, 1588, 2739, 1596, 1671, 1701, 1893, +     1902, 1913, 2008, 2022, 2122, 2126, 2147, 2148, 2245, 2254, +     2255, 2256, 2265, 2266, 2268, 2383, 2497, 2500, 2510, 2514, +     2613, 2615, 2624, 2729, 2741, 2742, 2752, 2835, 2836, 2837, +     2839, 2840, 2841, 2842, 2843, 2845, 2846, 2847, 2854, 2856, +     2857, 2858, 2859, 2860, 2864, 2865, 2869, 2878, 2885, 2886, +     2887, 2888, 2889, 2896, 2897, 2898, 2899, 2900, 2901, 2903, +     2908, 2910, 2911, 2912, 2913, 2915, 2916, 2920, 2923, 2924, + +     2925, 2927, 2928, 2932, 2934, 2935, 2936, 2937, 2939, 2944, +     2946, 2947, 2948, 2949, 2951, 2956, 2957, 2958, 2959, 2965, +     2954, 2955, 2972, 2973, 2974, 2974, 2975, 2977, 2978, 2979, +     2985, 2980, 2981, 2986, 2982, 3019, 3027, 2983, 2991, 2987, +     2989, 2990, 2999, 3000, 3003, 3004, 3005, 3006, 3008, 3021, +     3028, 3029, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, +     3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, +     3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, +     3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, +     3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3084, + +     3085, 3086, 3087, 3088, 3089, 3091, 3094, 3096, 3098, 3099, +     3101, 3102, 3103, 3106, 3110, 3111, 3113, 3114, 3115, 3116, +     3118, 3121, 3123, 3125, 3126, 3128, 3130, 3133, 3135, 3136, +     3137, 3138, 3140, 3143, 3145, 3147, 3148, 3150, 3152, 3156, +     3149, 3163, 3164, 3165, 3136, 3137, 3168, 3169, 3174, 3175, +     3171, 3170, 3196, 3224, 3179, 3211, 3173, 3176, 3177, 3178, +     3181, 3182, 3212, 3190, 3202, 3206, 3207, 3208, 3213, 3214, +     3215, 3216, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, +     3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, +     3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, + +     3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, +     3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3277, 3278, +     3279, 3280, 3281, 3282, 3284, 3287, 3289, 3291, 3292, 3294, +     3296, 3299, 3301, 3303, 3304, 3305, 3306, 3308, 3313, 3315, +     3316, 3317, 3318, 3320, 3325, 3326, 3327, 3328, 3329, 3330, +     3337, 3338, 3339, 3340, 3341, 3342, 3348, 3349, 3350, 3351, +     3357, 3347, 3346, 3364, 3365, 3336, 3337, 3368, 3369, 3370, +     3371, 3372, 3373, 3407, 3424, 3381, 3375, 3376, 3378, 3379, +     3382, 3383, 3391, 3392, 3393, 3394, 3396, 3397, 3398, 3399, +     3409, 3412, 3413, 3414, 3415, 3416, 3425, 3426, 3427, 3428, + +     3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, +     3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, +     3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, +     3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3474, +     3475, 3476, 3477, 3478, 3479, 3481, 3486, 3488, 3489, 3490, +     3491, 3492, 3493, 3497, 3500, 3501, 3502, 3504, 3505, 3509, +     3511, 3512, 3513, 3514, 3516, 3519, 3521, 3523, 3524, 3526, +     3528, 3531, 3533, 3534, 3535, 3536, 3538, 3541, 3543, 3545, +     3546, 3548, 3550, 3554, 3547, 3561, 3562, 3521, 3522, 3565, +     3566, 3567, 3568, 3569, 3570, 3580, 3594, 3571, 3572, 3588, + +     3595, 3596, 3597, 3598, 3600, 3601, 3602, 3603, 3604, 3605, +     3606, 3607, 3608, 3609, 3610, 3611, 3613, 3614, 3615, 3616, +     3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, +     3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, +     3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, +     3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3661, 3662, +     3663, 3664, 3665, 3666, 3671, 3673, 3674, 3675, 3676, 3678, +     3683, 3685, 3686, 3687, 3688, 3690, 3693, 3695, 3697, 3698, +     3700, 3702, 3705, 3707, 3709, 3710, 3712, 3714, 3716, 3717, +     3719, 3721, 3724, 3726, 3728, 3729, 3731, 3733, 3736, 3738, + +     3739, 3740, 3746, 3704, 3706, 3753, 3754, 3756, 3762, 3770, +     3764, 3771, 3772, 3779, 3780, 3781, 3782, 3783, 3784, 3785, +     3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3797, +     3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, +     3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, +     3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, +     3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3842, 3843, +     3844, 3845, 3846, 3847, 3854, 3855, 3856, 3857, 3858, 3859, +     3860, 3864, 3867, 3868, 3869, 3871, 3872, 3876, 3878, 3879, +     3880, 3881, 3883, 3886, 3888, 3890, 3891, 3893, 3895, 3898, + +     3900, 3901, 3902, 3903, 3905, 3908, 3910, 3912, 3913, 3915, +     3917, 3921, 3871, 3885, 3929, 3930, 3938, 3946, 3932, 3940, +     3947, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, +     3963, 3964, 3965, 3966, 3967, 3968, 3970, 3971, 3972, 3973, +     3974, 3975, 3976, 3978, 3979, 3980, 3981, 3982, 3983, 3984, +     3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, +     3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, +     4005, 4006, 4013, 4014, 4015, 4016, 4017, 4018, 4025, 4026, +     4027, 4028, 4029, 4030, 4035, 4037, 4038, 4039, 4040, 4042, +     4047, 4049, 4050, 4051, 4052, 4054, 4058, 4059, 4061, 4062, + +     4063, 4066, 4070, 4071, 4073, 4074, 4075, 4078, 4081, 4082, +     4083, 4089, 4036, 4037, 4096, 4097, 4105, 4113, 4099, 4107, +     4114, 4115, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, +     4130, 4131, 4132, 4133, 4134, 4135, 4137, 4145, 4139, 4140, +     4142, 4144, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, +     4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, +     4164, 4165, 4166, 4167, 4168, 4169, 4176, 4177, 4178, 4179, +     4180, 4181, 4185, 4188, 4189, 4190, 4192, 4193, 4197, 4200, +     4201, 4202, 4203, 4204, 4205, 4209, 4212, 4213, 4214, 4216, +     4217, 4221, 4223, 4224, 4225, 4226, 4228, 4231, 4233, 4235, + +     4236, 4238, 4240, 4244,10776,10776, 4237, 4251, 4252, 4260, +     4268, 4254, 4262, 4269, 4270, 4277, 4278, 4279, 4280, 4282, +     4283, 4284, 4285, 4287, 4288, 4289, 4290, 4291, 4292, 4293, +     4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, +     4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, +     4314, 4315, 4316, 4323, 4324, 4325, 4326, 4327, 4328, 4334, +     4335, 4336, 4337, 4338, 4339, 4346, 4347, 4348, 4349, 4350, +     4351, 4357, 4358, 4359, 4360, 4361, 4362, 4369, 4370, 4371, +     4372, 4373, 4374, 4380, 4381, 4382, 4383, 4389, 4378, 4379, +     4403, 4411, 4397, 4405, 4413, 4414, 4415, 4422, 4423, 4424, + +     4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, +     4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, +     4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4460, +     4461, 4462, 4463, 4464, 4465, 4472, 4473, 4474, 4475, 4476, +     4477, 4478, 4482, 4485, 4486, 4487, 4489, 4490, 4494, 4496, +     4497, 4498, 4499, 4501, 4504, 4506, 4508, 4509, 4511, 4513, +     4517, 4510, 4531, 4539, 4525, 4533, 4540, 4541, 4542, 4543, +     4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, +     4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, +     4570, 4571, 4572, 4573, 4574, 4575, 4582, 4583, 4584, 4585, + +     4586, 4587, 4594, 4595, 4596, 4597, 4598, 4599, 4604, 4606, +     4607, 4608, 4609, 4611, 4616, 4618, 4619, 4620, 4621, 4623, +     4627, 4628, 4630, 4636, 4650, 4658, 4625, 4626, 4629, 4644, +     4652, 4659, 4660, 4661, 4662, 4669, 4670, 4671, 4672, 4673, +     4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, +     4684, 4685, 4692, 4693, 4694, 4695, 4696, 4697, 4701, 4704, +     4705, 4706, 4708, 4709, 4713, 4716, 4717, 4718, 4719, 4720, +     4721, 4725, 4728, 4729, 4730, 4732, 4733, 4738, 4752, 4760, +     4731, 4746, 4754, 4761, 4762, 4763, 4764, 4771, 4772, 4773, +     4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, + +     4784, 4791, 4792, 4793, 4794, 4795, 4796, 4802, 4803, 4804, +     4805, 4806, 4807, 4814, 4815, 4816, 4817, 4818, 4819, 4825, +     4826, 4827, 4828, 4834, 4848, 4856, 4823, 4824, 4842, 4850, +     4857, 4858, 4859, 4860, 4867, 4868, 4869, 4870, 4871, 4872, +     4873, 4874, 4875, 4882, 4883, 4884, 4885, 4886, 4887, 4894, +     4895, 4896, 4897, 4898, 4899, 4900, 4904, 4907, 4908, 4909, +     4911, 4912, 4917, 4931, 4939, 4910, 4925, 4933, 4940, 4941, +     4942, 4943, 4950, 4951, 4952, 4953, 4954, 4955, 4962, 4963, +     4964, 4965, 4966, 4967, 4974, 4975, 4976, 4977, 4978, 4979, +     4984, 4986, 4987, 4993, 5007, 5015, 4982, 4983, 4985, 5001, + +     5009, 5016, 5017, 5018, 5019, 5026, 5033, 5034, 5035, 5036, +     5037, 5038, 5042, 5045, 5046, 5047, 5049, 5050, 5054, 5056, +     5070, 5078, 5056, 5064, 5072, 5079, 5080, 5081, 5088, 5095, +     5096, 5097, 5098, 5099, 5100, 5106, 5107, 5108, 5109, 5115, +     5129, 5137, 5104, 5105, 5123, 5131, 5138, 5153, 5145, 5159, +     5160, 5161, 5162, 5163, 5164, 5146, 5170, 5184, 5192, 5141, +     5170, 5208, 5213, 5184, 5219, 5220, 5221, 5222, 5228, 5242, +     5250, 5186, 5199, 5267, 5268, 5274, 5288, 5296, 5313, 5319, +     5333, 5341, 5357, 5371, 5379, 5395, 5409, 5417, 5433, 5447, +     5455, 5471, 5485, 5493, 5509, 5523, 5531, 5547, 5561, 5569, + +     5585, 5599, 5607, 5623, 5637, 5645, 5661, 5675, 5683, 5699, +     5713, 5721, 5737, 5751, 5759, 5775, 5789, 5797, 5813, 5827, +     5835, 5851, 5865, 5873, 5889, 5903, 5911, 5927, 5941, 5949, +     5965, 5979, 5987, 6003, 6017, 6025, 6041, 6055, 6063, 6079, +     6093, 6101, 6117, 6131, 6139, 6155, 6169, 6177, 6193, 6207, +     6215, 6231, 6245, 6253, 6269, 6283, 6291, 6307, 6321, 6329, +     6345, 6359, 6366,10776, 6394, 6402, 6407, 6412, 6417, 6419, +     6422, 6425, 6427, 6429, 6432, 6436, 6438, 6440, 6442, 6444, +     6447, 6450, 6453, 6455, 6457, 6459, 6461, 6463, 6465, 6468, +     6471, 6473, 6477, 6479, 6481, 6483, 6485, 6487, 6489, 6491, + +     6493, 6495, 6498, 6501, 6503, 6506, 6509, 6512, 6514, 6516, +     6518, 6520, 6522, 6524, 6526, 6528, 6530, 6532, 6534, 6536, +     6539, 6542, 6544, 6547, 6550, 6552, 6555, 6559, 6561, 6563, +     6565, 6567, 6569, 6571, 6573, 6575, 6577, 6579, 6581, 6583, +     6585, 6587, 6589, 6591, 6593, 6596, 6599, 6601, 6604, 6607, +     6609, 6612, 6615, 6618, 6621, 6625, 6629, 6631, 6633, 6635, +     6637, 6639, 6641, 6643, 6645, 6647, 6649, 6651, 6653, 6655, +     6657, 6659, 6661, 6663, 6665, 6667, 6669, 6671, 6674, 6677, +     6679, 6682, 6685, 6688, 6691, 6694, 6697, 6699, 6702, 6705, +     6710, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, + +     6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, +     6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6769, 6772, +     6774, 6777, 6780, 6782, 6785, 6788, 6791, 6793, 6796, 6799, +     6802, 6805, 6808, 6811, 6815, 6819, 6821, 6823, 6825, 6827, +     6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, +     6849, 6851, 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, +     6869, 6871, 6873, 6875, 6877, 6880, 6883, 6885, 6888, 6891, +     6893, 6896, 6899, 6902, 6905, 6908, 6911, 6914, 6917, 6919, +     6922, 6925, 6930, 6934, 6936, 6938, 6940, 6942, 6944, 6946, +     6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, + +     6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, +     6988, 6990, 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7007, +     7010, 7012, 7015, 7018, 7020, 7023, 7026, 7029, 7032, 7034, +     7037, 7040, 7043, 7045, 7048, 7051, 7054, 7057, 7060, 7063, +     7067, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, +     7089, 7091, 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, +     7109, 7111, 7113, 7115, 7117, 7119, 7121, 7123, 7125, 7127, +     7129, 7131, 7133, 7135, 7137, 7139, 7141, 7143, 7145, 7148, +     7151, 7153, 7156, 7159, 7162, 7165, 7168, 7171, 7173, 7176, +     7179, 7182, 7185, 7188, 7191, 7194, 7197, 7200, 7202, 7205, + +     7208, 7213, 7217, 7219, 7221, 7223, 7225, 7227, 7229, 7231, +     7233, 7235, 7237, 7239, 7241, 7243, 7245, 7247, 7249, 7251, +     7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, 7269, 7271, +     7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, +     7293, 7295, 7297, 7299, 7301, 7303, 7306, 7309, 7311, 7314, +     7317, 7319, 7322, 7325, 7328, 7330, 7333, 7336, 7339, 7342, +     7345, 7348, 7350, 7353, 7356, 7359, 7361, 7364, 7367, 7370, +     7373, 7376, 7379, 7383, 7387, 7389, 7391, 7393, 7395, 7397, +     7399, 7401, 7403, 7405, 7407, 7409, 7411, 7413, 7415, 7417, +     7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, 7437, + +     7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, +     7459, 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, +     7480, 7483, 7485, 7488, 7491, 7493, 7496, 7499, 7502, 7505, +     7508, 7511, 7514, 7517, 7519, 7522, 7525, 7528, 7531, 7534, +     7537, 7540, 7543, 7546, 7548, 7551, 7554, 7559, 7563, 7565, +     7567, 7569, 7571, 7573, 7575, 7577, 7579, 7581, 7583, 7585, +     7587, 7589, 7591, 7593, 7595, 7597, 7599, 7601, 7603, 7605, +     7607, 7609, 7611, 7613, 7615, 7617, 7619, 7621, 7623, 7625, +     7627, 7629, 7631, 7633, 7635, 7637, 7639, 7641, 7643, 7645, +     7647, 7649, 7651, 7653, 7655, 7657, 7659, 7661, 7663, 7665, + +     7667, 7670, 7673, 7675, 7678, 7681, 7683, 7686, 7689, 7692, +     7695, 7697, 7700, 7703, 7706, 7708, 7711, 7714, 7717, 7720, +     7723, 7726, 7728, 7731, 7734, 7737, 7739, 7742, 7745, 7748, +     7751, 7754, 7757, 7761, 7765, 7767, 7769, 7771, 7773, 7775, +     7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, +     7797, 7799, 7801, 7803, 7805, 7807, 7809, 7811, 7813, 7815, +     7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831, 7833, 7835, +     7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, +     7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7874, 7877, +     7879, 7882, 7885, 7888, 7891, 7894, 7897, 7899, 7902, 7905, + +     7908, 7911, 7914, 7917, 7920, 7923, 7926, 7928, 7931, 7934, +     7937, 7940, 7943, 7946, 7949, 7952, 7955, 7957, 7960, 7963, +     7968, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, +     7990, 7992, 7994, 7996, 7998, 8000, 8002, 8004, 8006, 8008, +     8010, 8012, 8014, 8016, 8018, 8020, 8022, 8024, 8026, 8028, +     8030, 8032, 8034, 8036, 8038, 8040, 8042, 8044, 8046, 8048, +     8050, 8052, 8054, 8056, 8058, 8060, 8062, 8064, 8066, 8068, +     8070, 8072, 8074, 8076, 8078, 8080, 8082, 8084, 8086, 8088, +     8091, 8094, 8096, 8099, 8102, 8104, 8107, 8110, 8113, 8115, +     8118, 8121, 8124, 8127, 8130, 8133, 8135, 8138, 8141, 8144, + +     8146, 8149, 8152, 8155, 8158, 8161, 8164, 8166, 8169, 8172, +     8175, 8177, 8180, 8183, 8186, 8189, 8192, 8195, 8199, 8203,       8205, 8207, 8209, 8211, 8213, 8215, 8217, 8219, 8221, 8223, -     8225, 8227, 8229, 8232, 8235, 8237, 8240, 8243, 8245, 8248, -     8251, 8254, 8257, 8260, 8263, 8266, 8269, 8271, 8274, 8277, -     8280, 8283, 8286, 8289, 8292, 8295, 8298, 8300, 8303, 8306, -     8309, 8312, 8315, 8318, 8321, 8324, 8327, 8329, 8332, 8335, -     8339, 8344, 8346, 8348, 8350, 8352, 8354, 8356, 8358, 8360, -     8362, 8364, 8366, 8368, 8370, 8372, 8374, 8376, 8378, 8380, - -     8382, 8384, 8386, 8388, 8390, 8392, 8394, 8396, 8398, 8400, -     8402, 8404, 8406, 8408, 8410, 8412, 8414, 8416, 8418, 8420, -     8422, 8424, 8426, 8428, 8430, 8432, 8434, 8436, 8438, 8440, +     8225, 8227, 8229, 8231, 8233, 8235, 8237, 8239, 8241, 8243, +     8245, 8247, 8249, 8251, 8253, 8255, 8257, 8259, 8261, 8263, +     8265, 8267, 8269, 8271, 8273, 8275, 8277, 8279, 8281, 8283, +     8285, 8287, 8289, 8291, 8293, 8295, 8297, 8299, 8301, 8303, +     8305, 8307, 8309, 8311, 8313, 8315, 8317, 8319, 8322, 8325, +     8327, 8330, 8333, 8335, 8338, 8341, 8344, 8347, 8350, 8353, +     8356, 8359, 8361, 8364, 8367, 8370, 8373, 8376, 8379, 8382, + +     8385, 8388, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, +     8414, 8417, 8419, 8422, 8425, 8430, 8434, 8436, 8438, 8440,       8442, 8444, 8446, 8448, 8450, 8452, 8454, 8456, 8458, 8460, -     8462, 8465, 8468, 8470, 8473, 8476, 8479, 8482, 8485, 8487, -     8490, 8493, 8496, 8498, 8501, 8504, 8507, 8510, 8513, 8516, -     8518, 8521, 8524, 8527, 8529, 8532, 8535, 8538, 8541, 8544, -     8547, 8549, 8552, 8555, 8558, 8560, 8563, 8566, 8569, 8572, -     8575, 8578, 8581, 8586, 8588, 8590, 8592, 8594, 8596, 8598, -     8600, 8602, 8604, 8606, 8608, 8610, 8612, 8614, 8616, 8618, - -     8620, 8622, 8624, 8626, 8628, 8630, 8632, 8634, 8636, 8638, -     8640, 8642, 8644, 8646, 8648, 8650, 8652, 8654, 8656, 8658, -     8660, 8662, 8664, 8666, 8668, 8670, 8672, 8674, 8676, 8678, +     8462, 8464, 8466, 8468, 8470, 8472, 8474, 8476, 8478, 8480, +     8482, 8484, 8486, 8488, 8490, 8492, 8494, 8496, 8498, 8500, +     8502, 8504, 8506, 8508, 8510, 8512, 8514, 8516, 8518, 8520, +     8522, 8524, 8526, 8528, 8530, 8532, 8534, 8536, 8538, 8540, +     8542, 8544, 8546, 8548, 8550, 8552, 8555, 8558, 8560, 8563, +     8566, 8569, 8572, 8575, 8577, 8580, 8583, 8586, 8588, 8591, +     8594, 8597, 8600, 8603, 8606, 8608, 8611, 8614, 8617, 8619, + +     8622, 8625, 8628, 8631, 8634, 8637, 8639, 8642, 8645, 8648, +     8650, 8653, 8656, 8659, 8662, 8665, 8668, 8672, 8676, 8678,       8680, 8682, 8684, 8686, 8688, 8690, 8692, 8694, 8696, 8698, -     8700, 8703, 8706, 8709, 8712, 8714, 8717, 8720, 8723, 8726, -     8729, 8732, 8735, 8738, 8741, 8743, 8746, 8749, 8752, 8755, -     8758, 8761, 8764, 8767, 8770, 8772, 8775, 8778, 8781, 8784, -     8787, 8790, 8793, 8796, 8799, 8801, 8804, 8807, 8811, 8816, -     8818, 8820, 8822, 8824, 8826, 8828, 8830, 8832, 8834, 8836, -     8838, 8840, 8842, 8844, 8846, 8848, 8850, 8852, 8854, 8856, - -     8858, 8860, 8862, 8864, 8866, 8868, 8870, 8872, 8874, 8876, -     8878, 8880, 8882, 8884, 8886, 8888, 8890, 8892, 8894, 8896, -     8898, 8900, 8902, 8904, 8906, 8908, 8910, 8912, 8914, 8916, -     8918, 8920, 8922, 8924, 8926, 8928, 8931, 8934, 8937, 8940, -     8943, 8946, 8949, 8951, 8954, 8957, 8960, 8963, 8966, 8969, -     8972, 8975, 8977, 8980, 8983, 8986, 8988, 8991, 8994, 8997, -     9000, 9003, 9006, 9008, 9011, 9014, 9017, 9019, 9022, 9025, -     9028, 9031, 9034, 9037, 9040, 9045, 9047, 9049, 9051, 9053, -     9055, 9057, 9059, 9061, 9063, 9065, 9067, 9069, 9071, 9073, -     9075, 9077, 9079, 9081, 9083, 9085, 9087, 9089, 9091, 9093, - -     9095, 9097, 9099, 9101, 9103, 9105, 9107, 9109, 9111, 9113, -     9115, 9117, 9119, 9121, 9123, 9125, 9127, 9129, 9131, 9133, -     9135, 9137, 9139, 9141, 9143, 9145, 9147, 9150, 9153, 9156, -     9159, 9162, 9165, 9168, 9171, 9174, 9177, 9179, 9182, 9185, -     9188, 9191, 9194, 9197, 9200, 9203, 9206, 9208, 9211, 9214, -     9217, 9220, 9223, 9226, 9229, 9232, 9235, 9237, 9240, 9243, -     9247, 9252, 9254, 9256, 9258, 9260, 9262, 9264, 9266, 9268, -     9270, 9272, 9274, 9276, 9278, 9280, 9282, 9284, 9286, 9288, -     9290, 9292, 9294, 9296, 9298, 9300, 9302, 9304, 9306, 9308, -     9310, 9312, 9314, 9316, 9318, 9320, 9322, 9324, 9326, 9328, - -     9330, 9332, 9334, 9336, 9338, 9341, 9344, 9347, 9350, 9352, -     9355, 9358, 9361, 9364, 9367, 9370, 9373, 9375, 9378, 9381, -     9384, 9386, 9389, 9392, 9395, 9398, 9401, 9404, 9406, 9409, -     9412, 9415, 9417, 9420, 9423, 9426, 9429, 9432, 9435, 9438, -     9443, 9445, 9447, 9449, 9451, 9453, 9455, 9457, 9459, 9461, -     9463, 9465, 9467, 9469, 9471, 9473, 9475, 9477, 9479, 9481, -     9483, 9485, 9487, 9489, 9491, 9493, 9495, 9497, 9499, 9501, -     9503, 9505, 9507, 9509, 9511, 9513, 9515, 9517, 9519, 9522, -     9525, 9528, 9531, 9534, 9537, 9539, 9542, 9545, 9548, 9551, -     9554, 9557, 9560, 9563, 9566, 9568, 9571, 9574, 9577, 9580, - -     9583, 9586, 9589, 9592, 9595, 9597, 9600, 9603, 9607, 9612, -     9614, 9616, 9618, 9620, 9622, 9624, 9626, 9628, 9630, 9632, -     9634, 9636, 9638, 9640, 9642, 9644, 9646, 9648, 9650, 9652, -     9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 9670, 9672, -     9674, 9676, 9678, 9680, 9682, 9685, 9688, 9691, 9694, 9697, -     9700, 9703, 9705, 9708, 9711, 9714, 9717, 9720, 9723, 9726, -     9729, 9731, 9734, 9737, 9740, 9742, 9745, 9748, 9751, 9754, -     9757, 9760, 9763, 9768, 9770, 9772, 9774, 9776, 9778, 9780, -     9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796, 9798, 9800, -     9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820, - -     9822, 9824, 9826, 9829, 9832, 9835, 9838, 9841, 9844, 9847, -     9850, 9853, 9856, 9858, 9861, 9864, 9867, 9870, 9873, 9876, -     9879, 9882, 9885, 9887, 9890, 9893, 9897, 9902, 9904, 9906, -     9908, 9910, 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, -     9928, 9930, 9932, 9934, 9936, 9938, 9940, 9942, 9944, 9946, -     9948, 9951, 9954, 9957, 9960, 9962, 9965, 9968, 9971, 9974, -     9977, 9980, 9983, 9985, 9988, 9991, 9994, 9996, 9999,10002, -    10005,10008,10011,10014,10017,10022,10024,10026,10028,10030, -    10032,10034,10036,10038,10040,10042,10044,10046,10048,10050, -    10052,10054,10056,10058,10061,10064,10067,10070,10073,10076, - -    10078,10081,10084,10087,10090,10093,10096,10099,10102,10105, -    10107,10110,10113,10117,10122,10124,10126,10128,10130,10132, -    10134,10136,10138,10140,10142,10144,10146,10148,10150,10152, -    10154,10157,10160,10163,10166,10169,10172,10175,10177,10180, -    10183,10186,10189,10192,10195,10198,10201,10204,10209,10211, -    10213,10215,10217,10219,10221,10223,10225,10227,10230,10233, -    10236,10239,10242,10245,10248,10251,10253,10256,10259,10263, -    10265,10267,10269,10271,10273,10275,10277,10280,10283,10286, -    10289,10292,10295,10298,10301,10304,10307,10309,10311,10313, -    10315,10318,10320,10323,10326,10329,10332,10335,10339,10341, - -    10343,10346,10348,10351,10354,10357,10361,10363,10366,10368, -    10371,10375,10378,10382,10386,10390,10394,10398,10402,10406, -    10410,10414,10418,10422,10426,10430,10434,10438,10442,10446, -    10450,10454,10458,10462,10466,10470,10474,10478,10482,10486 +     8700, 8702, 8704, 8706, 8708, 8710, 8712, 8714, 8716, 8718, +     8720, 8722, 8724, 8726, 8728, 8730, 8732, 8734, 8736, 8738, +     8740, 8742, 8744, 8746, 8748, 8750, 8752, 8754, 8756, 8758, +     8760, 8762, 8764, 8766, 8768, 8770, 8772, 8774, 8776, 8778, +     8780, 8782, 8784, 8786, 8788, 8790, 8793, 8796, 8799, 8802, +     8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, 8831, +     8833, 8836, 8839, 8842, 8845, 8848, 8851, 8854, 8857, 8860, + +     8862, 8865, 8868, 8871, 8874, 8877, 8880, 8883, 8886, 8889, +     8891, 8894, 8897, 8902, 8906, 8908, 8910, 8912, 8914, 8916, +     8918, 8920, 8922, 8924, 8926, 8928, 8930, 8932, 8934, 8936, +     8938, 8940, 8942, 8944, 8946, 8948, 8950, 8952, 8954, 8956, +     8958, 8960, 8962, 8964, 8966, 8968, 8970, 8972, 8974, 8976, +     8978, 8980, 8982, 8984, 8986, 8988, 8990, 8992, 8994, 8996, +     8998, 9000, 9002, 9004, 9006, 9008, 9010, 9012, 9014, 9016, +     9018, 9021, 9024, 9027, 9030, 9033, 9036, 9039, 9041, 9044, +     9047, 9050, 9053, 9056, 9059, 9062, 9065, 9067, 9070, 9073, +     9076, 9078, 9081, 9084, 9087, 9090, 9093, 9096, 9098, 9101, + +     9104, 9107, 9109, 9112, 9115, 9118, 9121, 9124, 9127, 9131, +     9135, 9137, 9139, 9141, 9143, 9145, 9147, 9149, 9151, 9153, +     9155, 9157, 9159, 9161, 9163, 9165, 9167, 9169, 9171, 9173, +     9175, 9177, 9179, 9181, 9183, 9185, 9187, 9189, 9191, 9193, +     9195, 9197, 9199, 9201, 9203, 9205, 9207, 9209, 9211, 9213, +     9215, 9217, 9219, 9221, 9223, 9225, 9227, 9229, 9231, 9233, +     9235, 9237, 9240, 9243, 9246, 9249, 9252, 9255, 9258, 9261, +     9264, 9267, 9269, 9272, 9275, 9278, 9281, 9284, 9287, 9290, +     9293, 9296, 9298, 9301, 9304, 9307, 9310, 9313, 9316, 9319, +     9322, 9325, 9327, 9330, 9333, 9338, 9342, 9344, 9346, 9348, + +     9350, 9352, 9354, 9356, 9358, 9360, 9362, 9364, 9366, 9368, +     9370, 9372, 9374, 9376, 9378, 9380, 9382, 9384, 9386, 9388, +     9390, 9392, 9394, 9396, 9398, 9400, 9402, 9404, 9406, 9408, +     9410, 9412, 9414, 9416, 9418, 9420, 9422, 9424, 9426, 9428, +     9431, 9434, 9437, 9440, 9442, 9445, 9448, 9451, 9454, 9457, +     9460, 9463, 9465, 9468, 9471, 9474, 9476, 9479, 9482, 9485, +     9488, 9491, 9494, 9496, 9499, 9502, 9505, 9507, 9510, 9513, +     9516, 9519, 9522, 9525, 9529, 9533, 9535, 9537, 9539, 9541, +     9543, 9545, 9547, 9549, 9551, 9553, 9555, 9557, 9559, 9561, +     9563, 9565, 9567, 9569, 9571, 9573, 9575, 9577, 9579, 9581, + +     9583, 9585, 9587, 9589, 9591, 9593, 9595, 9597, 9599, 9601, +     9603, 9605, 9607, 9609, 9612, 9615, 9618, 9621, 9624, 9627, +     9629, 9632, 9635, 9638, 9641, 9644, 9647, 9650, 9653, 9656, +     9658, 9661, 9664, 9667, 9670, 9673, 9676, 9679, 9682, 9685, +     9687, 9690, 9693, 9698, 9702, 9704, 9706, 9708, 9710, 9712, +     9714, 9716, 9718, 9720, 9722, 9724, 9726, 9728, 9730, 9732, +     9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748, 9750, 9752, +     9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772, +     9775, 9778, 9781, 9784, 9787, 9790, 9793, 9795, 9798, 9801, +     9804, 9807, 9810, 9813, 9816, 9819, 9821, 9824, 9827, 9830, + +     9832, 9835, 9838, 9841, 9844, 9847, 9850, 9854, 9858, 9860, +     9862, 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, +     9882, 9884, 9886, 9888, 9890, 9892, 9894, 9896, 9898, 9900, +     9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916, 9919, 9922, +     9925, 9928, 9931, 9934, 9937, 9940, 9943, 9946, 9948, 9951, +     9954, 9957, 9960, 9963, 9966, 9969, 9972, 9975, 9977, 9980, +     9983, 9988, 9992, 9994, 9996, 9998,10000,10002,10004,10006, +    10008,10010,10012,10014,10016,10018,10020,10022,10024,10026, +    10028,10030,10032,10034,10036,10038,10041,10044,10047,10050, +    10052,10055,10058,10061,10064,10067,10070,10073,10075,10078, + +    10081,10084,10086,10089,10092,10095,10098,10101,10104,10108, +    10112,10114,10116,10118,10120,10122,10124,10126,10128,10130, +    10132,10134,10136,10138,10140,10142,10144,10146,10148,10151, +    10154,10157,10160,10163,10166,10168,10171,10174,10177,10180, +    10183,10186,10189,10192,10195,10197,10200,10203,10208,10212, +    10214,10216,10218,10220,10222,10224,10226,10228,10230,10232, +    10234,10236,10238,10240,10242,10244,10247,10250,10253,10256, +    10259,10262,10265,10267,10270,10273,10276,10279,10282,10285, +    10288,10291,10295,10299,10301,10303,10305,10307,10309,10311, +    10313,10315,10317,10320,10323,10326,10329,10332,10335,10338, + +    10341,10343,10346,10349,10353,10355,10357,10359,10361,10363, +    10365,10367,10370,10373,10376,10379,10382,10385,10388,10391, +    10394,10397,10399,10401,10403,10405,10408,10410,10413,10416, +    10419,10422,10425,10429,10431,10433,10436,10438,10441,10444, +    10447,10451,10453,10456,10458,10461,10465,10468,10472,10476, +    10480,10484,10488,10492,10496,10500,10504,10508,10512,10516, +    10520,10524,10528,10532,10536,10540,10544,10548,10552,10556, +    10560,10564,10568,10572,10576      } ; -static yyconst flex_int16_t yy_def[4541] = +static yyconst flex_int16_t yy_def[4576] =      {   0, -     2829,    1, 2829, 2829, 2829, 2829, 2829, 2830, 2829, 2831, -     2832, 2832, 2829, 2833, 2833,   15,   15,   15,   15, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833,   15,   15,   15, 2833, 2833, 2829, 2829, -     2830, 2829, 2829, 2831, 2829, 2834, 2834, 2835, 2834, 2836, -     2833,   15,   52, 2833,   52,   52, 2829,   52, 2833,   52, -     2833, 2833,   52, 2833, 2833, 2833, 2833, 2833, 2833,   52, -     2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2829, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, - -     2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2837, 2837, 2838, 2837, 2839, 2836, 2829, -     2840,   52, 2833, 2833, 2829,  132,  132,  132, 2833,  132, -     2833, 2833,  132, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2829, 2833, 2829, 2833, 2833, 2829, 2833, 2829, 2833, -     2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, -     2841, 2841, 2842, 2841, 2843, 2844, 2845, 2829, 2829, 2846, -     2847,  132, 2833, 2833, 2829,  222, 2833, 2833, 2833, 2833, -     2833, 2833,  222, 2833, 2833, 2833, 2833, 2833, 2833, 2829, -     2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2829, 2833, 2829, 2833, 2833, 2829, 2833, 2829, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2829, 2829, 2829, 2829, 2848, 2848, 2849, - -     2848, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857,  222, -     2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, -     2833, 2833, 2833, 2833, 2829, 2829, 2833, 2833, 2833, 2829, -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, -     2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2829, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, -     2833, 2829, 2829, 2829, 2858, 2858, 2859, 2858, 2860, 2861, -     2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, -     2872,  222, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, - -     2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, -     2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, 2829, 2829, -     2829, 2833, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2829, 2833, 2833, 2829, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2833, 2833, -     2833, 2833, 2833, 2829, 2833, 2829, 2829, 2829, 2873, 2873, -     2874, 2873, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, -     2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, -      222, 2833, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, 2833, - -     2829, 2829, 2829, 2829, 2829, 2829, 2833, 2833, 2833, 2833, -     2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, -     2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, -     2833, 2833, 2829, 2829, 2833, 2833, 2833, 2833, 2829, 2833, -     2829, 2829, 2893, 2893, 2894, 2893, 2895, 2896, 2897, 2898, -     2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, -     2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, -     2919, 2920, 2921, 2921, 2829, 2921, 2921, 2921, 2921, 2921, -     2921, 2921, 2921, 2921, 2921, 2921, 2829, 2921, 2921, 2829, -     2829, 2829, 2829, 2829, 2829, 2921, 2921, 2921, 2921, 2829, - -     2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, -     2829, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, -     2921, 2829, 2829, 2921, 2921, 2921, 2921, 2829, 2921, 2829, -     2829, 2922, 2922, 2923, 2922, 2924, 2925, 2926, 2927, 2928, -     2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, -     2939, 2940, 2927, 2941, 2942, 2943, 2944, 2945, 2946, 2947, -     2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2956, -     2829, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, -     2956, 2956, 2829, 2829, 2829, 2829, 2829, 2829, 2956, 2956, -     2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, - -     2829, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, -     2956, 2829, 2956, 2957, 2957, 2958, 2957, 2959, 2960, 2961, -     2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, -     2972, 2973, 2974, 2975, 2976, 2962, 2977, 2978, 2979, 2980, -     2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, -     2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, -     3000, 2829, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, -     3000, 3000, 2829, 2829, 2829, 2829, 2829, 2829, 3000, 3000, -     3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 2829, 3000, -     3000, 3000, 3000, 3000, 3000, 3000, 3000, 3001, 3001, 3002, - -     3001, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, -     3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3005, -     3021, 3022, 3023, 3024, 3025, 3026, 3027, 3011, 3028, 3029, -     3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, -     3040, 3041, 3042, 3043, 3044, 3036, 3045, 3046, 3047, 3048, -     3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, -     3048, 2829, 2829, 2829, 2829, 2829, 2829, 3048, 3048, 3048, -     3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, -     3048, 3048, 3048, 3048, 3049, 3049, 3050, 3049, 3051, 3052, -     3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, - -     3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, -     3073, 3074, 3075, 3076, 3077, 3059, 3078, 3079, 3080, 3081, -     3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, -     3092, 3093, 3094, 3095, 3096, 3097, 3098, 3090, 3099, 3100, -     3101, 3102, 3103, 3104, 3105, 3106, 3106, 3106, 3106, 3106, -     3106, 3106, 3106, 3106, 3106, 3106, 2829, 2829, 2829, 2829, -     2829, 2829, 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, -     3106, 3106, 3106, 3106, 3106, 3106, 3106, 3107, 3107, 3108, -     3107, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, -     3118, 3119, 3120, 3112, 3121, 3122, 3123, 3124, 3125, 3126, - -     3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3115, 3135, -     3136, 3137, 3138, 3139, 3140, 3141, 3122, 3142, 3143, 3144, -     3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, -     3155, 3156, 3149, 3157, 3158, 3159, 3160, 3161, 3162, 3163, -     3155, 3164, 3165, 3166, 3167, 3167, 3167, 3167, 3167, 3167, -     3167, 3167, 3167, 3167, 2829, 2829, 2829, 2829, 3167, 3167, -     3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, -     3167, 3167, 3168, 3168, 3169, 3168, 3170, 3171, 3172, 3173, -     3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3173, 3182, -     3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, - -     3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, -     3203, 3204, 3183, 3205, 3206, 3207, 3208, 3209, 3210, 3211, -     3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, -     3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, -     3222, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3239, -     3239, 3239, 3239, 3239, 3239, 3239, 2829, 2829, 2829, 2829, -     3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, -     3239, 3239, 3239, 3239, 3240, 3240, 3241, 3240, 3242, 3243, -     3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3244, 3252, -     3253, 3254, 3255, 3256, 3257, 3258, 3250, 3259, 3260, 3261, - -     3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, -     3272, 3273, 3274, 3275, 3253, 3276, 3277, 3278, 3279, 3280, -     3281, 3282, 3260, 3283, 3284, 3285, 3286, 3287, 3288, 3289, -     3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, -     3291, 3300, 3301, 3302, 3294, 3303, 3304, 3305, 3306, 3307, -     3308, 3309, 3301, 3310, 3311, 3312, 3313, 3313, 3313, 3313, -     3313, 3313, 3313, 2829, 2829, 3313, 3313, 3313, 3313, 3313, -     3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3314, 3314, -     3315, 3314, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, +     2864,    1, 2864, 2864, 2864, 2864, 2864, 2865, 2864, 2866, +     2867, 2867, 2864, 2868, 2868,   15,   15,   15,   15, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868,   15,   15,   15, 2868, 2868, 2868, 2864, +     2864, 2865, 2864, 2864, 2866, 2864, 2869, 2869, 2870, 2869, +     2871, 2868,   15,   53, 2868,   53,   53, 2864,   53, 2868, +       53, 2868, 2868,   53, 2868, 2868, 2868, 2868, 2868, 2868, +     2868,   53, 2868, 2868, 2864, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, 2868, 2868, + +     2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2872, 2872, 2873, 2872, +     2874, 2871, 2864, 2875,   53, 2868, 2868, 2864,  135,  135, +      135, 2868,  135, 2868, 2868,  135, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2868, 2868, +     2864, 2868, 2864, 2868, 2868, 2864, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2864, 2864, 2864, 2876, 2876, 2877, 2876, 2878, +     2879, 2880, 2864, 2864, 2881, 2882,  135, 2868, 2868, 2864, +      227, 2868, 2868, 2868, 2868, 2868, 2868,  227, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, +     2864, 2868, 2868, 2864, 2868, 2868, 2864, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + +     2868, 2864, 2864, 2864, 2864, 2883, 2883, 2884, 2883, 2885, +     2886, 2887, 2888, 2889, 2890, 2891, 2892,  227, 2868, 2868, +     2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, +     2868, 2868, 2868, 2864, 2864, 2868, 2868, 2868, 2864, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, +     2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2864, 2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2864, 2868, 2864, 2864, 2864, 2893, 2893, 2894, 2893, 2895, +     2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, + +     2906, 2907,  227, 2868, 2868, 2868, 2868, 2868, 2864, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2864, 2868, 2868, 2868, 2868, 2868, 2864, 2864, 2864, +     2864, 2864, 2864, 2868, 2868, 2868, 2864, 2868, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, +     2864, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, +     2864, 2864, 2908, 2908, 2909, 2908, 2910, 2911, 2912, 2913, +     2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, +     2924, 2925, 2926, 2927,  227, 2868, 2868, 2868, 2864, 2868, + +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, +     2868, 2864, 2868, 2868, 2868, 2864, 2864, 2864, 2864, 2864, +     2864, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, +     2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, 2868, 2868, +     2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2864, +     2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2864, 2928, +     2928, 2929, 2928, 2930, 2931, 2932, 2933, 2934, 2935, 2936, +     2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, +     2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, +     2956, 2864, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, + +     2956, 2956, 2956, 2956, 2864, 2956, 2956, 2864, 2864, 2864, +     2864, 2864, 2864, 2956, 2956, 2956, 2956, 2864, 2956, 2956, +     2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2864, 2956, +     2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2864, +     2864, 2956, 2956, 2956, 2956, 2956, 2864, 2956, 2864, 2864, +     2957, 2957, 2958, 2957, 2959, 2960, 2961, 2962, 2963, 2964, +     2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, +     2975, 2962, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, +     2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2991, 2864, +     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + +     2991, 2991, 2864, 2864, 2864, 2864, 2864, 2864, 2991, 2991, +     2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, +     2864, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, +     2991, 2991, 2864, 2991, 2992, 2992, 2993, 2992, 2994, 2995, +     2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, +     3006, 3007, 3008, 3009, 3010, 3011, 2997, 3012, 3013, 3014, +     3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, +     3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, +     3035, 3035, 2864, 3035, 3035, 3035, 3035, 3035, 3035, 3035, +     3035, 3035, 3035, 3035, 2864, 2864, 2864, 2864, 2864, 2864, + +     3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, +     2864, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, +     3036, 3036, 3037, 3036, 3038, 3039, 3040, 3041, 3042, 3043, +     3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, +     3054, 3055, 3040, 3056, 3057, 3058, 3059, 3060, 3061, 3062, +     3046, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, +     3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3071, 3080, +     3081, 3082, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, +     3083, 3083, 3083, 3083, 3083, 2864, 2864, 2864, 2864, 2864, +     2864, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, + +     3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3084, +     3084, 3085, 3084, 3086, 3087, 3088, 3089, 3090, 3091, 3092, +     3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, +     3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, +     3094, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, +     3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, +     3132, 3133, 3125, 3134, 3135, 3136, 3137, 3138, 3139, 3140, +     3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, +     3141, 3141, 2864, 2864, 2864, 2864, 2864, 2864, 3141, 3141, +     3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, + +     3141, 3141, 3141, 3141, 3142, 3142, 3143, 3142, 3144, 3145, +     3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, +     3147, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, +     3165, 3166, 3167, 3168, 3169, 3150, 3170, 3171, 3172, 3173, +     3174, 3175, 3176, 3157, 3177, 3178, 3179, 3180, 3181, 3182, +     3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3184, +     3192, 3193, 3194, 3195, 3196, 3197, 3198, 3190, 3199, 3200, +     3201, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, +     3202, 3202, 2864, 2864, 2864, 2864, 3202, 3202, 3202, 3202, +     3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, + +     3202, 3203, 3203, 3204, 3203, 3205, 3206, 3207, 3208, 3209, +     3210, 3211, 3212, 3213, 3214, 3215, 3216, 3208, 3217, 3218, +     3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, +     3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, +     3239, 3218, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, +     3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, +     3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3257, +     3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3274, 3274, +     3274, 3274, 3274, 3274, 3274, 3274, 2864, 2864, 2864, 2864, +     3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, + +     3274, 3274, 3274, 3274, 3274, 3275, 3275, 3276, 3275, 3277, +     3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3279, +     3287, 3288, 3289, 3290, 3291, 3292, 3293, 3285, 3294, 3295, +     3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, +     3306, 3307, 3308, 3309, 3310, 3288, 3311, 3312, 3313, 3314, +     3315, 3316, 3317, 3295, 3318, 3319, 3320, 3321, 3322, 3323,       3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, - -     3324, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, -     3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, -     3353, 3354, 3355, 3356, 3357, 3358, 3359, 3335, 3360, 3361, -     3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, -     3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3372, -     3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, -     3391, 3382, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, -     3399, 3399, 3399, 3399, 3399, 3399, 2829, 2829, 3399, 3399, -     3399, 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3400, 3400, -     3401, 3400, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, - -     3410, 3411, 3412, 3413, 3405, 3414, 3415, 3416, 3408, 3417, -     3418, 3419, 3420, 3421, 3422, 3423, 3415, 3424, 3425, 3426, -     3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, -     3437, 3438, 3439, 3440, 3441, 3442, 3443, 3418, 3444, 3445, -     3446, 3447, 3448, 3449, 3450, 3425, 3451, 3452, 3453, 3454, -     3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, -     3465, 3458, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3464, -     3473, 3474, 3475, 3467, 3476, 3477, 3478, 3479, 3480, 3481, -     3482, 3474, 3483, 3484, 3485, 3486, 3486, 3486, 3486, 3486, -     3486, 2829, 2829, 3486, 3486, 3486, 3486, 3486, 3486, 3486, - -     3487, 3487, 3488, 3487, 3489, 3490, 3491, 3492, 3493, 3494, -     3495, 3496, 3497, 3498, 3490, 3499, 3500, 3501, 3502, 3503, -     3504, 3505, 3506, 3507, 3508, 3509, 3500, 3510, 3511, 3512, -     3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, -     3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, -     3533, 3534, 3535, 3536, 3537, 3538, 3511, 3539, 3540, 3541, -     3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, -     3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, -     3562, 3563, 3564, 3565, 3556, 3566, 3567, 3568, 3569, 3570, -     3571, 3572, 3573, 3574, 3575, 3576, 3567, 3577, 3578, 3579, - -     3580, 3581, 3582, 3583, 3584, 3584, 3584, 3584, 3584, 2829, -     2829, 3584, 3584, 3584, 3584, 3584, 3584, 3585, 3585, 3585, -     3585, 3586, 3587, 3588, 3589, 3590, 3591, 3585, 3592, 3593, -     3594, 3595, 3596, 3597, 3598, 3590, 3599, 3600, 3601, 3593, -     3602, 3603, 3604, 3605, 3606, 3607, 3608, 3600, 3609, 3610, -     3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, -     3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, -     3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, -     3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, -     3651, 3652, 3653, 3654, 3655, 3656, 3657, 3649, 3658, 3659, - -     3660, 3652, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3659, -     3668, 3669, 3670, 3662, 3671, 3672, 3673, 3674, 3675, 3676, -     3677, 3669, 3678, 3679, 3680, 3681, 3681, 3681, 3681, 3681, -     2829, 2829, 3681, 3681, 3681, 3681, 3681, 3681, 3682, 3682, -     3682, 3683, 3684, 3685, 3686, 3687, 3688, 3685, 3689, 3690, -     3688, 3684, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, -     3699, 3700, 3701, 3692, 3702, 3703, 3704, 3705, 3706, 3707, -     3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, -     3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, -     3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, +     3334, 3326, 3335, 3336, 3337, 3329, 3338, 3339, 3340, 3341, +     3342, 3343, 3344, 3336, 3345, 3346, 3347, 3348, 3348, 3348, +     3348, 3348, 3348, 3348, 3348, 2864, 2864, 3348, 3348, 3348, + +     3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, +     3348, 3349, 3349, 3350, 3349, 3351, 3352, 3353, 3354, 3355, +     3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, +     3366, 3367, 3368, 3359, 3369, 3370, 3371, 3372, 3373, 3374, +     3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, +     3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, +     3370, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, +     3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, +     3414, 3415, 3407, 3416, 3417, 3418, 3419, 3420, 3421, 3422, +     3423, 3424, 3425, 3426, 3417, 3427, 3428, 3429, 3430, 3431, + +     3432, 3433, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 2864, +     2864, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, +     3434, 3434, 3435, 3435, 3436, 3435, 3437, 3438, 3439, 3440, +     3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3440, 3449, +     3450, 3451, 3443, 3452, 3453, 3454, 3455, 3456, 3457, 3458, +     3450, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, +     3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, +     3478, 3453, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3460, +     3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, +     3496, 3497, 3498, 3499, 3500, 3493, 3501, 3502, 3503, 3504, + +     3505, 3506, 3507, 3499, 3508, 3509, 3510, 3502, 3511, 3512, +     3513, 3514, 3515, 3516, 3517, 3509, 3518, 3519, 3520, 3521, +     3521, 3521, 3521, 3521, 3521, 2864, 2864, 3521, 3521, 3521, +     3521, 3521, 3521, 3521, 3521, 3522, 3522, 3523, 3522, 3524, +     3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3525, +     3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, +     3544, 3535, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, +     3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, +     3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, +     3573, 3546, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, + +     3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, +     3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3591, +     3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, +     3611, 3602, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, +     3619, 3619, 3619, 3619, 2864, 2864, 3619, 3619, 3619, 3619, +     3619, 3619, 3620, 3620, 3620, 3620, 3621, 3622, 3623, 3624, +     3625, 3626, 3620, 3627, 3628, 3629, 3630, 3631, 3632, 3633, +     3625, 3634, 3635, 3636, 3628, 3637, 3638, 3639, 3640, 3641, +     3642, 3643, 3635, 3644, 3645, 3646, 3647, 3648, 3649, 3650, +     3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, + +     3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, +     3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, +     3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, +     3691, 3692, 3684, 3693, 3694, 3695, 3687, 3696, 3697, 3698, +     3699, 3700, 3701, 3702, 3694, 3703, 3704, 3705, 3697, 3706, +     3707, 3708, 3709, 3710, 3711, 3712, 3704, 3713, 3714, 3715, +     3716, 3716, 3716, 3716, 3716, 2864, 2864, 3716, 3716, 3716, +     3716, 3716, 3716, 3717, 3717, 3717, 3718, 3719, 3720, 3721, +     3722, 3723, 3720, 3724, 3725, 3723, 3719, 3726, 3727, 3728, +     3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3727, 3737,       3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, -     3748, 3749, 3750, 3751, 3752, 3753, 3745, 3754, 3755, 3756, -     3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3755, 3765, -     3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, -     3766, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3783, -     3783, 3783, 2829, 2829, 3783, 3783, 3783, 3783, 3783, 3783, -     3784, 3784, 3785, 3786, 3787, 3788, 3789, 3787, 3790, 3791, -     3792, 3793, 3794, 3788, 3795, 3796, 3797, 3790, 3798, 3799, -     3800, 3801, 3802, 3803, 3804, 3796, 3805, 3806, 3807, 3808, -     3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, - -     3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, -     3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, -     3839, 3840, 3841, 3842, 3842, 3843, 3844, 3845, 3846, 3847, -     3848, 3842, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3847, -     3856, 3857, 3858, 3850, 3859, 3860, 3861, 3862, 3863, 3864, -     3865, 3857, 3866, 3867, 3868, 3860, 3869, 3870, 3871, 3872, -     3873, 3874, 3875, 3867, 3876, 3877, 3878, 3879, 2829, 2829, -     3879, 3879, 3879, 3880, 3880, 3881, 3882, 3883, 3884, 3882, -     3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, -     3895, 3896, 3887, 3897, 3898, 3899, 3900, 3901, 3902, 3903, - -     3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, -     3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, -     3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, +     3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, +     3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, +     3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, +     3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, +     3788, 3780, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, +     3797, 3798, 3799, 3790, 3800, 3801, 3802, 3803, 3804, 3805, +     3806, 3807, 3808, 3809, 3810, 3801, 3811, 3812, 3813, 3814, +     3815, 3816, 3817, 3818, 3818, 3818, 3818, 2864, 2864, 3818, +     3818, 3818, 3818, 3818, 3818, 3819, 3819, 3820, 3821, 3822, + +     3823, 3824, 3822, 3825, 3826, 3827, 3828, 3829, 3823, 3830, +     3831, 3832, 3825, 3833, 3834, 3835, 3836, 3837, 3838, 3839, +     3831, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, +     3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, +     3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, +     3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3877, +     3878, 3879, 3880, 3881, 3882, 3883, 3877, 3884, 3885, 3886, +     3887, 3888, 3889, 3890, 3882, 3891, 3892, 3893, 3885, 3894, +     3895, 3896, 3897, 3898, 3899, 3900, 3892, 3901, 3902, 3903, +     3895, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3902, 3911, + +     3912, 3913, 3914, 2864, 2864, 3914, 3914, 3914, 3915, 3915, +     3916, 3917, 3918, 3919, 3917, 3920, 3921, 3922, 3923, 3924, +     3925, 3926, 3927, 3928, 3929, 3930, 3931, 3922, 3932, 3933,       3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, -     3940, 3944, 3945, 3943, 3939, 3946, 3947, 3948, 3949, 3950, -     3951, 3952, 3953, 3954, 3955, 3956, 3947, 3957, 3958, 3959, -     3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3958, 3968, -     3969, 3970, 3971, 3972, 3973, 3974, 3975, 2829, 2829, 3975, -     3975, 3976, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3978, -     3983, 3984, 3985, 3978, 3986, 3987, 3988, 3989, 3990, 3991, - -     3992, 3984, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, -     4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, -     4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, -     4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, -     4031, 4032, 4030, 4033, 4034, 4035, 4036, 4037, 4031, 4038, -     4039, 4040, 4033, 4041, 4042, 4043, 4044, 4045, 4046, 4047, -     4039, 4048, 4049, 4050, 4042, 4051, 4052, 4053, 4054, 4055, -     4056, 4057, 4049, 4058, 4059, 4060, 4061, 2829, 2829, 4061, -     4061, 4062, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, -     4066, 4070, 4071, 4069, 4065, 4072, 4073, 4074, 4075, 4076, - -     4077, 4078, 4062, 4079, 4080, 4081, 4082, 4083, 4084, 4085, -     4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, -     4096, 4097, 4098, 4073, 4099, 4100, 4101, 4102, 4103, 4104, -     4105, 4106, 4107, 4108, 4109, 4107, 4110, 4111, 4112, 4113, -     4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4112, 4122, -     4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, -     4123, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 2829, -     2829, 4140, 4140, 4140, 4141, 4141, 4142, 4143, 4144, 4145, -     4146, 4144, 4147, 4148, 4149, 4150, 4151, 4145, 4152, 4153, -     4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, - -     4164, 4165, 4166, 4167, 4168, 4169, 4147, 4170, 4171, 4172, -     4173, 4174, 4175, 4176, 4153, 4177, 4178, 4179, 4180, 4181, -     4182, 4183, 4184, 4185, 4181, 4186, 4187, 4188, 4181, 4189, -     4190, 4191, 4192, 4193, 4194, 4195, 4187, 4196, 4197, 4198, -     4190, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4197, 4206, -     4207, 4208, 4209, 4209, 4209, 4210, 4210, 4211, 4212, 4213, -     4214, 4212, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, -     4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, -     4233, 4234, 4235, 4236, 4237, 4238, 4217, 4239, 4240, 4241, -     4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, - -     4252, 4249, 4253, 4254, 4252, 4248, 4255, 4256, 4257, 4258, -     4259, 4260, 4261, 4262, 4263, 4264, 4265, 4256, 4266, 4267, -     4268, 4269, 4270, 4271, 4272, 4273, 4273, 4274, 4274, 4275, -     4276, 4277, 4278, 4279, 4280, 4276, 4281, 4282, 4283, 4284, -     4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4276, -     4294, 4295, 4296, 4297, 4298, 4299, 4300, 4282, 4301, 4302, -     4303, 4304, 4305, 4306, 4307, 4308, 4306, 4309, 4310, 4311, -     4312, 4313, 4307, 4314, 4315, 4316, 4309, 4317, 4318, 4319, -     4320, 4321, 4322, 4323, 4315, 4324, 4325, 4326, 4327, 4328, -     4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, - -     4329, 4338, 4339, 4340, 4341, 4332, 4342, 4343, 4344, 4331, -     4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, -     4355, 4353, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, -     4364, 4365, 4366, 4367, 4358, 4368, 4369, 4370, 4371, 4372, -     4373, 4374, 4375, 4376, 4376, 4377, 4378, 4379, 4380, 4381, -     4382, 4383, 4377, 4384, 4385, 4379, 4386, 4387, 4388, 4389, -     4390, 4391, 4380, 4392, 4393, 4394, 4395, 4396, 4397, 4398, -     4399, 4400, 4396, 4401, 4402, 4403, 4396, 4404, 4405, 4406, -     4407, 4408, 4409, 4410, 4402, 4411, 4412, 4413, 4414, 4415, -     4415, 4416, 4417, 4418, 4419, 4420, 4421, 4417, 4422, 4423, - -     4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, -     4434, 4435, 4436, 4437, 4438, 4435, 4439, 4440, 4438, 4434, -     4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4449, -     4425, 4450, 4451, 4452, 4453, 4428, 4454, 4455, 4431, 4450, -     4456, 4457, 4458, 4436, 4434, 4459, 4460, 4461, 4459, 4462, -     4463, 4464, 4465, 4466, 4460, 4467, 4468, 4469, 4448, 4470, -     4470, 4454, 4471, 4472, 4454, 4456, 4473, 4474, 4475, 4476, -     4477, 4463, 4478, 4479, 4466, 4478, 4460, 4480, 4481, 4482, -     4483, 4484, 4485, 4486, 2659, 4487, 4487, 4488, 4489, 4475, -     4488, 4490, 4491, 4492, 4480, 4493, 4483, 4494, 4495, 4486, - -     4493, 4496, 4497, 4498, 2659, 4499, 4499, 4475, 4500, 2829, -     4501, 2829, 2829, 4502, 4494, 4496, 4503, 4504, 4505, 4506, -     2829, 2705, 4507, 4507, 4508, 4508, 2829, 2829, 4509, 4505, -     4503, 4510, 4511, 2705, 4512, 4512, 2829, 2829, 4513, 2829, -     2705, 4514, 4514, 4511, 2705, 4515, 4515, 2745, 4516, 4516, -     2745, 4517, 4517, 2745, 4518, 4518, 2745, 4519, 4519, 2757, -     4520, 4520, 2757, 4521, 4521, 2757, 4522, 4522, 2757, 4523, -     4523, 2769, 4524, 4524, 2769, 4525, 4525, 2769, 4526, 4526, -     2769, 4527, 4527, 2781, 4528, 4528, 2781, 4529, 4529, 2781, -     4530, 4530, 2781, 4531, 4531, 2793, 4532, 4532, 2793, 4533, - -     4533, 2793, 4534, 4534, 2793, 4535, 4535, 2805, 4536, 4536, -     2805, 4537, 4537, 2805, 4538, 4538, 2805, 4539, 4539, 2817, -     4540, 4540, 2817, 2829, 2829, 2817, 2829, 2829,    0, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829 +     3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, +     3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, +     3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, +     3974, 3975, 3976, 3977, 3978, 3975, 3979, 3980, 3978, 3974, +     3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, +     3991, 3982, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, + +     4000, 4001, 4002, 3993, 4003, 4004, 4005, 4006, 4007, 4008, +     4009, 4010, 2864, 2864, 4010, 4010, 4011, 4011, 4012, 4013, +     4014, 4015, 4016, 4017, 4013, 4018, 4019, 4020, 4013, 4021, +     4022, 4023, 4024, 4025, 4026, 4027, 4019, 4028, 4029, 4030, +     4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, +     4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, +     4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, +     4061, 4062, 4063, 4064, 4065, 4066, 4067, 4065, 4068, 4069, +     4070, 4071, 4072, 4066, 4073, 4074, 4075, 4068, 4076, 4077, +     4078, 4079, 4080, 4081, 4082, 4074, 4083, 4084, 4085, 4077, + +     4086, 4087, 4088, 4089, 4090, 4091, 4092, 4084, 4093, 4094, +     4095, 4096, 2864, 2864, 4096, 4096, 4097, 4097, 4098, 4099, +     4100, 4101, 4102, 4103, 4104, 4101, 4105, 4106, 4104, 4100, +     4107, 4108, 4109, 4110, 4111, 4112, 4113, 4097, 4114, 4115, +     4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, +     4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4108, 4134, +     4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, +     4142, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, +     4154, 4155, 4156, 4147, 4157, 4158, 4159, 4160, 4161, 4162, +     4163, 4164, 4165, 4166, 4167, 4158, 4168, 4169, 4170, 4171, + +     4172, 4173, 4174, 4175, 2864, 2864, 4175, 4175, 4175, 4176, +     4176, 4177, 4178, 4179, 4180, 4181, 4179, 4182, 4183, 4184, +     4185, 4186, 4180, 4187, 4188, 4189, 4190, 4191, 4192, 4193, +     4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, +     4204, 4182, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4188, +     4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4216, +     4221, 4222, 4223, 4216, 4224, 4225, 4226, 4227, 4228, 4229, +     4230, 4222, 4231, 4232, 4233, 4225, 4234, 4235, 4236, 4237, +     4238, 4239, 4240, 4232, 4241, 4242, 4243, 4244, 4244, 4244, +     4245, 4245, 4246, 4247, 4248, 4249, 4247, 4250, 4251, 4252, + +     4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, +     4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, +     4273, 4252, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, +     4282, 4283, 4284, 4285, 4286, 4287, 4284, 4288, 4289, 4287, +     4283, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, +     4299, 4300, 4291, 4301, 4302, 4303, 4304, 4305, 4306, 4307, +     4308, 4308, 4309, 4309, 4310, 4311, 4312, 4313, 4314, 4315, +     4311, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, +     4325, 4326, 4327, 4328, 4311, 4329, 4330, 4331, 4332, 4333, +     4334, 4335, 4317, 4336, 4337, 4338, 4339, 4340, 4341, 4342, + +     4343, 4341, 4344, 4345, 4346, 4347, 4348, 4342, 4349, 4350, +     4351, 4344, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4350, +     4359, 4360, 4361, 4362, 4363, 4363, 4364, 4365, 4366, 4367, +     4368, 4369, 4370, 4371, 4372, 4364, 4373, 4374, 4375, 4376, +     4367, 4377, 4378, 4379, 4366, 4380, 4381, 4382, 4383, 4384, +     4385, 4386, 4387, 4388, 4389, 4390, 4388, 4391, 4392, 4393, +     4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4393, +     4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4411, +     4412, 4413, 4414, 4415, 4416, 4417, 4418, 4412, 4419, 4420, +     4414, 4421, 4422, 4423, 4424, 4425, 4426, 4415, 4427, 4428, + +     4429, 4430, 4431, 4432, 4433, 4434, 4435, 4431, 4436, 4437, +     4438, 4431, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4437, +     4446, 4447, 4448, 4449, 4450, 4450, 4451, 4452, 4453, 4454, +     4455, 4456, 4452, 4457, 4458, 4459, 4460, 4461, 4462, 4463, +     4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, +     4470, 4474, 4475, 4473, 4469, 4476, 4477, 4478, 4479, 4480, +     4481, 4482, 4483, 4484, 4484, 4460, 4485, 4486, 4487, 4488, +     4463, 4489, 4490, 4466, 4485, 4491, 4492, 4493, 4471, 4469, +     4494, 4495, 4496, 4494, 4497, 4498, 4499, 4500, 4501, 4495, +     4502, 4503, 4504, 4483, 4505, 4505, 4489, 4506, 4507, 4489, + +     4491, 4508, 4509, 4510, 4511, 4512, 4498, 4513, 4514, 4501, +     4513, 4495, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 2694, +     4522, 4522, 4523, 4524, 4510, 4523, 4525, 4526, 4527, 4515, +     4528, 4518, 4529, 4530, 4521, 4528, 4531, 4532, 4533, 2694, +     4534, 4534, 4510, 4535, 2864, 4536, 2864, 2864, 4537, 4529, +     4531, 4538, 4539, 4540, 4541, 2864, 2740, 4542, 4542, 4543, +     4543, 2864, 2864, 4544, 4540, 4538, 4545, 4546, 2740, 4547, +     4547, 2864, 2864, 4548, 2864, 2740, 4549, 4549, 4546, 2740, +     4550, 4550, 2780, 4551, 4551, 2780, 4552, 4552, 2780, 4553, +     4553, 2780, 4554, 4554, 2792, 4555, 4555, 2792, 4556, 4556, + +     2792, 4557, 4557, 2792, 4558, 4558, 2804, 4559, 4559, 2804, +     4560, 4560, 2804, 4561, 4561, 2804, 4562, 4562, 2816, 4563, +     4563, 2816, 4564, 4564, 2816, 4565, 4565, 2816, 4566, 4566, +     2828, 4567, 4567, 2828, 4568, 4568, 2828, 4569, 4569, 2828, +     4570, 4570, 2840, 4571, 4571, 2840, 4572, 4572, 2840, 4573, +     4573, 2840, 4574, 4574, 2852, 4575, 4575, 2852, 2864, 2864, +     2852, 2864, 2864,    0, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864      } ; -static yyconst flex_int16_t yy_nxt[10753] = +static yyconst flex_int16_t yy_nxt[10845] =      {   0, -        4,    5,    6,    7,    5,    4,    8,    9,    4,   10, -       11,   11,   12,   12,   12,   13,   14,   15,   16,   17, -       18,   19,   20,   21,   22,   23,   24,   25,   26,   27, -       28,   29,   23,   30,   31,   32,   33,   23,   23,   23, -       23,    4,   34,   35,   35,   35,   35,   36,   23,   23, -       23,   23,   23,   23,   37,   28,   38,   23,   23,   23, -       23,   23,   23,   23,   23,   23,   39,   40, 2829, 1416, -       40,   43,   43,   43,   43,   43,   45, 2829,   46,   46, -       47,   47,   47,   48,   45, 1437,   47,   47,   47,   47, -       47,   48,   52,   52,   52,   52,   52,   48,   52,   52, - -       53,   52,   52,   52,   40,  351,   52,   40,   59,   54, -       63, 2829,   65, 2829,   64, 2829,  130,  172,  126, 2829, -       52,  673,   50,   60,   52,   52,   55,   56,   52,   52, -       61,  351,  361,  362,   54,   66,   62, 2829, 2829,   67, -       76, 2829, 2829,  172, 2829, 2829,   80,  351,   57,   52, -       52,   52,   52,   52,   48,   52,   52,   52,   52,   52, -       52,   68, 2829, 2829, 2829,  172, 2829, 2829,   81,   74, -     2829,  102,   69,  103, 1445,  672,   82,  707,   77,   70, -       75,   58,   52,   52,   52,   52,   52,   71, 2829, 2829, -     2829,   54, 2829, 2829,   72,   78,   69, 2829,   88,   85, - -     2829,   79,   83,   73, 2829, 2829,   52,   84, 2829,   96, -       86,  677,   89, 2829,   93,   87,   54, 2829, 2829, 2829, -      110, 2829,   94,  113,   88, 2829,  111,  135,   90,  156, -       57,   97,   91,  114,  143,   96,   69,   89,  142,  144, -       93, 2829, 2829,   52,   98,  145,   99,   94,   92,  100, -      104, 2829, 1416,  135,  105,  101,  116, 2829,   88,   95, -       69,  163,  115, 2829,  106,  107,  112,   73, 2829,  108, -     2829,  679,   89, 2829,  109, 2829, 2829,  135,   96,   43, -       43,   43,   43,   43,   88,  122,  122,  123,  123,  123, -     2829,  134, 2829, 2829, 2829, 2829,   45,   89,  124,  124, - -      125,  125,  125,  126,   96, 2829, 2829,   45,   92,  125, -      125,  125,  125,  125,  126,  147, 2829,  134,  146, 2829, -     2829,  139, 2829,  141,  101,  117, 2829,  152,  151,  101, -      118,  154,  690, 2829,  150, 2829,   57, 1437,  119,  120, -      213,  135,  300, 2829,   73, 2829, 2829, 2829, 2829, 2829, -      149,  117, 2829,  152,  151,  101,  118, 2829,  148, 1445, -     2829,   57,  791,  119,  120, 2829, 2829, 2829,   73, 2829, -     2829, 2829,  152,  152, 2829,  121,  132,  132,  132,  132, -      132,  126,  132,  132,  132,  132,  132,  132,  155,  157, -      158,  160, 2829, 2829, 2829, 2829,  169, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829,  171, 2829,  172,  162,  132,  132, -      132,  132,  132,  132,  164,  159, 2829, 2829,  161, 2829, -     2829,  168,  166,  174,  179, 2829,  167, 2829, 2829, 2829, -      171,  176,  172,  178,  170,  165, 2829, 2829, 2829,  173, -     2829, 2829,  181, 2829, 2829, 2829, 2829,  174, 2829,  175, -      179, 2829,  172, 2829,  177,  180, 2829, 2829, 2829,  178, -     2829,  129,  949,  173, 2829,  193,  181, 2829, 2829,  179, -      174,  185, 2829,  182, 2829,  181,  186,  183,  179,  180, -     2829,  202,  184,  187,  188, 2829,  196, 2829,  181, 2829, -      189, 2829, 2829, 2829,  194,  190, 2829,  195, 2829,  191, - -     2829,  192, 2829,  199, 2829,  205,  174,  200, 2829, 2829, -     2829, 2829,  197,  203,  201, 2829,  204,  179, 2829, 2829, -      130,  670,  130, 2829,  206, 2829,  221,  198,  224,  210, -      174,  122,  122,  123,  123,  123, 2829,  174,  218,  219, -      219,  219,  219,  179, 2829, 2829,  207, 2829,  223, 2829, -     2829, 2829,  224, 2829,  210, 2829,  123,  123,  123,  123, -      123,  225,  179,  135,  229,  172,  225,   45,  208,  211, -      211,  212,  212,  212,  213, 2829, 2829,  130, 2829,  231, -      181,   45,  174,  212,  212,  212,  212,  212,  213,  135, -      225,  172, 2829, 2829,  208, 2829, 2829,  675, 2829,  225, - -      770, 2829,  234, 2829,  181,  236,  174, 2829,  237, 2829, -     2829, 1049, 2829,  209,  222,  222,  222,  222,  222,  213, -      222,  222,  222,  222,  222,  222, 2829, 2829, 2829, 2829, -      232,  242, 2829,  241, 2829,  240, 2829,  235, 2829, 2829, -     2829, 2829,  239, 2829, 2829, 2829,  222,  222,  222,  222, -      222,  222,  238, 2829, 2829,  242, 2829,  241, 2829,  242, -     2829,  242,  243, 2829, 2829,  246,  249,  250, 2829,  252, -      245, 2829,  244,  248, 2829, 2829,  254,  257, 2829, 2829, -      251,  247, 2829, 2829,  253, 2829, 2829, 2829,  258, 2829, -     2829, 2829, 2829,  264,  255,  260, 2829,  256, 2829,  263, - -     2829, 2829, 2829,  265, 2829,  130, 2829, 2829, 2829,  262, -     2829,  270, 2829,  130,  259, 2829,  263,  264, 2829, 2829, -     2829, 2829, 2829,  265,  263, 2829,  265,  265, 2829, 2829, -      261,  267, 2829, 2829,  262,  270,  265, 2829,  266,  263, -      269,  263,  271,  270, 2829,  276, 2829,  265,  277,  263, -      273, 2829, 2829, 2829,  275,  272,  268, 2829, 2829, 2829, -      274, 2829, 2829, 2829,  269, 2829, 2829, 2829,  285, 2829, -      278, 2829,  270,  279, 2829, 2829, 2829, 2829, 2829, 2829, -     2829,  280, 2829, 2829, 2829,  284, 2829,  290,  282,  281, -     2829, 2829, 2829,  130, 2829, 2829,  283, 2829, 2829,  308, - -     2829,  377,  130,  288, 2829, 2829,  242,  461,  388, 2829, -      287,  286,  545, 2829,  289,  291, 2829, 2829, 2829,  324, -     2829,  130,  292, 2829,  859, 2829, 2829, 2829, 2829, 2829, -      242,  263,  293, 2829,  242, 2829,  682, 2829,  294,  270, -      319, 2829, 2829,  242,  296,  296,  297,  297,  297, 2829, -      218,  219,  219,  219,  219, 2829,  263,  219,  219,  219, -      219,  219,  294,  270, 2829, 2829, 2829,  242,  680, 2829, -       45,  295,  298,  298,  299,  299,  299,  300,   45,  312, -      299,  299,  299,  299,  299,  300,  310,  310,  310,  310, -      310,  300,  310,  310,  310,  310,  310,  310, 2829,  311, - -      313, 2829,  316, 2829,  312, 2829,  317,  674, 2829, 2829, -     2829, 2829,  325, 2829, 2829, 2829, 2829,  313,  310,  310, -      310,  310,  310,  310, 2829,  313, 2829, 2829, 2829,  315, -     2829, 2829, 2829, 2829,  318,  130, 2829, 2829,  313,  343, -      320, 2829, 2829,  333, 2829, 2829, 2829, 2829,  130, 2829, -      334,  323, 2829,  326, 2829,  330, 2829,  322,  327, 2829, -     2829, 2829, 2829,  329, 2829, 2829, 2829,  335,  336, 2829, -      331,  332,  340, 2829,  337, 2829,  339, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829,  341,  338, 2829, 2829, 2829, -      347,  345, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  348, - -      342,  344, 2829, 2829,  348, 2829, 2829, 2829,  346, 2829, -     2829, 2829, 2829, 2829, 2829,  350,  347, 2829, 2829, 2829, -     2829,  634, 2829, 2829, 2829,  348,  352, 2829, 2829,  349, -      348, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  676, 2829, -      348,  350, 2829,  355,  357, 2829, 2829, 2829, 2829,  348, -     1492,  354,  353, 2829,  348, 2829, 2829,  351, 2829,  356, -     2829, 2829, 2829, 2829, 2829,  363,  358,  359,  364, 2829, -     2829,  416,  360,  365, 2829,  368,  369,  366, 2829, 2829, -     2829,  370,  371, 2829, 2829, 2829, 2829, 2829, 2829,  367, -     2829,  348,  348, 2829,  417,  130, 2829, 2829, 2829, 2829, - -      351,  391,  418,  313,  313,  374, 2829,  296,  296,  297, -      297,  297, 2829, 1155, 1493,  694,  397,  348,  348,  374, -     2829,  297,  297,  297,  297,  297,  351, 2829,  313,  313, -       45, 2829,  375,  375,  376,  376,  376,  377,  398, 2829, -     2829,  372,  373,   45, 2829,  376,  376,  376,  376,  376, -      377,  392,  392,  392,  392,  392,  377,  392,  392,  392, -      392,  392,  392, 2829,  394, 2829,  393, 2829, 2829, 2829, -     2829, 2829,  404, 2829,  395, 2829, 2829,  403, 2829,  396, -     2829,  406, 2829,  392,  392,  392,  392,  392,  392,  399, -     2829, 2829,  400, 2829, 2829, 2829, 2829,  408, 2829, 2829, - -     2829, 2829, 2829,  409,  419,  407, 2829, 2829,  401, 2829, -      405,  402, 2829,  434, 2829,  678, 2829,  412, 2829, 2829, -     2829, 2829,  411,  413, 2829, 2829, 2829,  420,  426, 2829, -     2829, 2829,  422,  414,  415,  421, 2829,  424,  423,  434, -     2829,  427,  428,  433, 2829, 2829,  429, 2829,  436, 2829, -     2829, 2829, 2829, 2829,  430,  431, 2829, 2829, 2829,  432, -     2829,  434,  437, 2829,  435, 2829, 2829, 2829, 2829,  433, -     2829, 2829,  436, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -      437, 2829, 2829, 2829,  434,  440,  437, 2829,  441, 2829, -     2829,  434, 2829,  444,  437,  130,  442,  438,  439,  130, - -      445,  475,  130,  452,  446,  478,  450, 2829,  478,  130, -      434,  434, 2829,  443, 2829,  564,  453, 2829, 2829, 2829, -      449, 2829, 2829,  451, 2829, 2829, 2829,  437, 2829, 2829, -     2829,  455,  434, 2829, 2829, 2829, 2829,  434, 2829, 2829, -     2829, 2829,  457,  457,  458,  458,  458,  704, 2829,  129, -       45,  437,  459,  459,  460,  460,  460,  461,   45,  456, -      460,  460,  460,  460,  460,  461,  481,  481,  481,  481, -      481,  461,  481,  481,  481,  481,  481,  481, 2829,  483, -     2829, 2829, 2829, 2829,  488, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  481,  481, - -      481,  481,  481,  481,  494,  489, 2829, 2829,  482, 2829, -     2829, 2829, 2829,  484, 2829, 2829,  486, 2829,  716,  491, -     2829, 1503, 1503,  493,  487, 2829,  507,  490, 2829, 2829, -      508, 2829, 2829, 2829, 2829,  512, 2829, 2829,  495, 2829, -      492,  496, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  498, -      510,  514,  499, 2829,  513,  509,  500, 2829, 2829, 2829, -     2829, 2829, 2829, 2829,  516, 2829, 2829,  519, 2829, 2829, -     2829, 2829,  522,  518, 2829, 2829, 2829, 2829, 2829, 2829, -     2829,  524,  515, 2829, 2829, 2829,  517, 2829, 2829, 2829, -      521, 2829,  519,  531,  129, 2829,  522,  537,  518, 2829, - -      538, 2829, 2829,  522, 2829,  520,  523,  519,  532,  526, -     2829,  530,  528,  519,  521,  525,  527, 2829, 1503,  536, -     2829,  522, 2829,  519,  535, 2829, 2829,  529, 2829, 2829, -     2829, 2829,  522,  130, 2829, 2829, 2829,  130, 2829,  567, -     2829,  130, 2829,  567,  540,  130, 2829,  567,  519,  130, -     2829,  572, 2829, 2829,  711,  658,  522,  542,  457,  457, -      458,  458,  458,  541, 2829, 2829, 2829, 2829, 2829,  542, -      458,  458,  458,  458,  458,   45,  698,  543,  543,  544, -      544,  544,  545,   45, 2829,  544,  544,  544,  544,  544, -      545,  573,  573,  573,  573,  573,  545,  573,  573,  573, - -      573,  573,  573,  576,  574,  578, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  577, -     2829, 2829, 2829,  573,  573,  573,  573,  573,  573,  581, -      584, 2829, 2829, 2829, 2829, 2829,  582, 2829, 2829,  585, -      583,  579, 2829,  586,  603,  589, 2829, 2829,  588,  598, -      580, 2829,  602,  607,  611, 2829,  608, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829,  609, 1510,  604, 2829, -     2829, 2829, 2829, 2829,  596,  597, 2829,  605,  599, 2829, -      611,  606, 2829, 2829, 2829, 2829,  601, 2829, 2829, 2829, -     2829, 2829,  610, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -      611, 2829, 2829, 2829,  613, 2829, 2829,  614, 2829,  611, -      616,  617,  612,  130,  615, 1503,  627,  618,  610,  564, -     2829, 2829,  130,  130, 2829,  624, 2829, 2829,  564,  564, -     2829,  130,  625,  800,  629,  611, 1395,  665,  611,  619, -     1514, 2829, 2829,  130,  620, 2829, 2829, 2829,  621,  564, -     2829,  130, 2829,  626, 2829,  611, 2829,  665, 2829, 2829, -      630,  630,  631,  631,  631,   45,  681,  632,  632,  633, -      633,  633,  634,   45, 2829,  633,  633,  633,  633,  633, -      634,  669,  669,  669,  669,  669,  634,  669,  669,  669, -      669,  669,  669, 2829, 2829, 2829, 2829, 2829,  689,  701, - -     2829, 2829, 2829, 2829, 2829,  691, 2829, 2829, 2829, 2829, -     2829, 2829, 2829,  669,  669,  669,  669,  669,  669,  695, -      692,  700, 2829, 2829,  701,  630,  630,  631,  631,  631, -      761, 2829,  702,  706, 2829, 1503,  701,  708,  130,  693, -      696,  699,  697,  705,  745,  130,  700,  703,  767,  130, -      709,  748,  763,  710,  713,  658, 1395,  851,  701,  631, -      631,  631,  631,  631,   45,  764,  714,  714,  715,  715, -      715,  716,   45,  766,  715,  715,  715,  715,  715,  716, -      130,  130,  130,  130,  130,  130,  658,  752,  658,  752, -      748,  752,  130, 2829, 2829, 2829, 2829, 2829,  759,  760, - -      760,  760,  760,  760,  716,  760,  760,  760,  760,  760, -      760, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829,  789,  765, 2829, 2829,  771, 2829, 2829, -     2829,  760,  760,  760,  760,  760,  760, 2829,  768,  769, -      772,  779,  788,  780,  781, 2829,  782,  796, 2829,  785, -      786,  787,  783, 1514,  789, 2829,  784,  130,  790,  792, -      794,  797,  869,  833,  130, 2829, 1167,  860,  793,  871, -      836,  795,   45,  789,  798,  798,  799,  799,  799,  800, -       45, 2829,  799,  799,  799,  799,  799,  800,  130,  130, -      130,  130,  130,  130,  836,  745,  745,  748,  836,  748, - -      130,  130,  130,  130, 2829,  854,  845,  836,  748,  845, -      850,  850,  850,  850,  850,  800,  850,  850,  850,  850, -      850,  850, 2829, 2829,  853, 2829,  852, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829,  850,  850,  850,  850,  850,  850, 2829, 2829, -     2829,  129, 2829,  130,  856, 2829,  857,  887,  858,  925, -      872,  870,  855,  873,  874, 1500, 2829, 1263, 1268,  868, -      879,  881,  861,  880,  875,  876, 1503,  130,  130,  882, -      884,  877,  878,  928,  928,   45,  883,  885,  885,  886, -      886,  886,  887,   45, 2829,  886,  886,  886,  886,  886, - -      887,  130,  130,  130,  130,  130,  130,  928,  933,  928, -      836,  937,  928,  130,  130,  130,  130,  130,  130,  836, -      937,  928,  933,  937,  945,  946,  946,  946,  946,  946, -      887,  946,  946,  946,  946,  946,  946, 2829, 2829, 2829, -     2829, 2829, 2829, 2829,  947, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829,  946,  946,  946, -      946,  946,  946, 2829, 2829, 2829, 2829, 2829, 2829, 1269, -      130, 2829,  955,  980,  963, 2829, 1022,  965, 1510,  968, -      952,  948,  956,  950,  953,  954,  964,  972,  951,  966, -      967, 1514,  970,  969,  975,  130,  971,  976,  130, 1046, - -      973,  925,  130, 1522,  925,  974,  977,   45,  925,  978, -      978,  979,  979,  979,  980,   45, 1050,  979,  979,  979, -      979,  979,  980,  130,  130,  130,  130,  130,  130, 1029, -      925, 1029,  925,  928,  933,  130,  130,  130,  130,  130, -      130,  925, 1029,  933, 1040, 1029,  933,  130, 2829, 2829, -     2829, 2829, 2829, 1040, 1045, 1045, 1045, 1045, 1045,  980, -     1045, 1045, 1045, 1045, 1045, 1045, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 1060, 2829, 2829, -     2829, 2829, 1062, 2829, 2829, 2829, 1045, 1045, 1045, 1045, -     1045, 1045, 1047, 1048, 1061,  130, 2829, 2829, 1069, 1395, - -     1072, 1122, 1063, 1075, 1177, 1051, 1052, 1053, 1067, 1054, -     1059, 1153, 1161, 1068, 1064, 1070, 1065, 1071,   45, 1066, -     1073, 1073, 1074, 1074, 1074, 1075,   45, 1152, 1074, 1074, -     1074, 1074, 1074, 1075,  130,  130,  130,  130,  130,  130, -     1125, 1022, 1022, 1129, 1022, 1129,  130,  130,  130,  130, -      130,  130, 1125, 1129, 1136, 1022, 1129, 1029,  130,  130, -      130,  130,  130,  130, 1140, 1129, 1029, 1140, 1129, 1136, -      130,  130, 2829, 2829, 2829, 2829, 1140, 1148, 1149, 1149, -     1149, 1149, 1149, 1075, 1149, 1149, 1149, 1149, 1149, 1149, -     2829, 2829, 2829, 1163, 2829, 2829, 2829, 1162, 2829, 2829, - -     1154, 2829, 2829, 1151, 2829, 2829, 2829, 2829, 1514, 2829, -     1149, 1149, 1149, 1149, 1149, 1149, 1281, 1166,   45, 1164, -     1175, 1175, 1176, 1176, 1176, 1177,  130, 1169, 1404, 1526, -     1150, 1156, 1228, 1514, 1168, 1173, 1171, 1271, 1165, 1170, -     1174,   45, 1267, 1176, 1176, 1176, 1176, 1176, 1177,  130, -      130,  130, 1172,  130,  130, 1231, 1231, 1122,  130, 1122, -     1125,  130,  130,  130, 1231,  130,  130, 1125, 1240, 1231, -      130, 1125, 1240,  130,  130,  130, 1125,  130,  130, 1129, -     1136, 1125,  130, 1240, 1136,  130,  130,  130, 1252, 2829, -     2829, 1240, 1136, 1252, 1257, 1257, 1257, 1257, 1257, 1177, - -     1257, 1257, 1257, 1257, 1257, 1257, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,   45, 2829, -     1279, 1279, 1280, 1280, 1280, 1281, 1257, 1257, 1257, 1257, -     1257, 1257, 1272, 1259, 1258,   45, 1404, 1280, 1280, 1280, -     1280, 1280, 1281, 1260, 1261, 1270, 1276, 1526,  130, 1266, -      130, 1274, 1262, 1273, 1337,  130, 1340, 1491, 1277,  130, -      130, 1340,  130, 1275,  130, 1340, 1345, 1278, 1340,  130, -     1231,  130,  130,  130,  130, 1349,  130, 1340, 1231, 1349, -     1340,  130, 1345,  130,  130,  130,  130, 1349,  130, 1357, -     1231, 1349, 1240,  130, 1361,  130,  130,  130,  130, 1349, - -      130, 1240, 1361, 1349, 1357,  130, 1361, 2829, 2829, 2829, -     2829, 1369, 1370, 1370, 1370, 1370, 1370, 1281, 1370, 1370, -     1370, 1370, 1370, 1370, 2829, 2829, 2829, 1373, 1374, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,  129, 2829, -     1371, 1514, 1522, 1375, 1370, 1370, 1370, 1370, 1370, 1370, -     1526, 1372, 1379,   45, 1534, 1389, 1389, 1390, 1390, 1390, -     1391, 1376, 2829, 1536,  129, 1385,  130, 1387, 1388, 1391, -     1384,  130, 1451, 1487,  130, 1381, 1382, 1337, 1386, 1380, -     1337,   45, 1383, 1390, 1390, 1390, 1390, 1390, 1391,  130, -      130,  130,  130,  130,  130, 1337, 1458, 1337, 1458, 1337, - -     1340,  130,  130,  130,  130,  130,  130, 1345, 1337, 1458, -     1345, 1469, 1458,  130,  130,  130,  130,  130,  130, 1345, -     1469, 1345, 1349, 1357, 1345,  130,  130,  130,  130,  130, -      130, 1469, 1357, 1481, 1469, 1357, 1481, 1486, 1486, 1486, -     1486, 1486, 1391, 1486, 1486, 1486, 1486, 1486, 1486, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829,   45, 2829, -     1501, 1501, 1502, 1502, 1502, 1503, 1503, 1536, 1540, 1486, -     1486, 1486, 1486, 1486, 1486, 1536, 1488, 1489, 1490, 1540, -      129, 1540, 1545, 1494, 1540, 1495, 1496, 1497, 1545,   45, -     1498, 1502, 1502, 1502, 1502, 1502, 1503,  129, 1545, 1550, - -     1499, 1545, 1550,  129, 1404, 1526, 1550, 1556, 1526, 1550, -     1556,  129, 1526, 1534, 1556, 1564,  130,  130,  130,  130, -      130,  130, 1566,  130, 1569, 1451, 1451, 1573,  130, 1451, -      130,  130,  130,  130, 1573,  130,  130, 1569, 1573, 1580, -      130, 1451, 1573,  130,  130,  130, 1458,  130,  130, 1584, -     1573, 1458,  130, 1584,  130,  130,  130,  130, 1573,  130, -     1580, 1584, 1592, 1458,  130, 1584,  130,  130,  130,  130, -     1469,  130, 1596, 1584, 1469, 1596,  130,  130,  130,  130, -     2829, 2829, 1584, 1592, 1596, 1604, 1605, 1605, 1605, 1605, -     1605, 1503, 1605, 1605, 1605, 1605, 1605, 1605, 2829, 2829, - -     2829, 1610, 1611, 2829, 2829, 2829, 2829, 2829,  129, 2829, -     1503, 2829, 2829, 1503, 1606, 1624, 1503, 1503, 1605, 1605, -     1605, 1605, 1605, 1605, 1614, 1624,  129, 1607, 1608, 1503, -     1503, 1510,  129, 1615, 1503, 1609, 1612, 1613,   45, 1617, -     1618, 1618, 1619, 1619, 1619, 1503,   45, 1624, 1619, 1619, -     1619, 1619, 1619, 1503, 1510, 1635, 1616, 1624, 1510, 1635, -      129, 1510, 1514, 1522,  129, 1510, 1635, 1522, 1647, 1635, -     1522, 1647,  129, 1653,  129, 1656, 1653, 1656,  129, 1656, -     1661, 1656, 1661,  129, 1661, 1666, 1661, 1666,  129, 1666, -     1671, 1522, 1666, 1671,  129, 1522, 1647, 1671, 1679, 1647, - -     1671, 1679,  129,  130,  130,  130,  130,  130,  130, 1685, -      130, 1688, 1688,  130, 1566,  130, 1566,  130,  130, 1569, -      130,  130,  130, 1688, 1569,  130, 1697, 1688, 1569,  130, -      130, 1697,  130,  130,  130,  130, 1569,  130, 1573, 1580, -      130, 1569,  130, 1697,  130,  130, 1580,  130, 1709,  130, -     1697, 1580,  130, 1709,  130,  130,  130,  130, 1580,  130, -     1584, 1592,  130, 1580,  130, 1709,  130,  130, 1592,  130, -     1721,  130, 1709, 1592, 2829, 1721, 1726, 1726, 1726, 1726, -     1726, 1503, 1726, 1726, 1726, 1726, 1726, 1726, 2829, 2829, -     2829, 1731, 1732, 2829, 2829, 2829, 2829, 2829, 1503, 2829, - -     2829, 1624,  129, 1624, 1503, 1727, 1624, 1747, 1726, 1726, -     1726, 1726, 1726, 1726,   45, 1624, 1739, 1739, 1740, 1740, -     1740, 1503, 1728, 1729, 1733, 1734, 1735, 1624, 1736, 2829, -     2829, 1751, 1624, 1624, 1730, 1737, 1503, 1503, 1751,  129, -     1624, 1747,   45, 1738, 1740, 1740, 1740, 1740, 1740, 1503, -     1751, 1759, 1624, 1751, 1635, 1763, 1751, 1635, 1763,  129, -     1751, 1759, 1763, 1771, 1772,  129, 1775, 1775,  129, 1775, -     1780, 1775, 1780,  129, 1780, 1785, 1780, 1785,  129, 1785, -     1790, 1785, 1790,  129, 1635, 1763, 1790, 1796, 1763, 1790, -     1796,  129, 1763, 1771, 1796, 1804,  130,  130,  130,  130, - -      130,  130, 1806,  130, 1806, 1806,  130, 1806,  130, 1812, -      130,  130, 1806,  130, 1688,  130, 1816, 1806,  130, 1688, -      130, 1816,  130,  130,  130,  130, 1806,  130, 1812, 1816, -     1824, 1688,  130, 1816,  130,  130,  130,  130, 1697,  130, -     1828, 1816, 1697, 1828,  130,  130,  130,  130,  130,  130, -     1816, 1824, 1828, 1836, 1697, 1828,  130,  130,  130,  130, -      130,  130, 1709, 1840, 1828, 1709, 1840,  130,  130,  130, -      130, 2829, 2829, 1828, 1836, 1840, 1848, 1849, 1849, 1849, -     1849, 1849, 1503, 1849, 1849, 1849, 1849, 1849, 1849, 2829, -     2829, 1853, 1854, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     1624, 1624, 1851, 1624, 1624, 1860, 1503, 1747,  129, 1849, -     1849, 1849, 1849, 1849, 1849, 1850, 1624, 1624, 1747,  129, -     1852, 1624, 1747, 1747, 1873,   45, 1859, 1861, 1861, 1862, -     1862, 1862, 1503, 1858, 1747, 1855, 1856, 1747, 1873,  129, -     1747, 1751,   45, 1857, 1862, 1862, 1862, 1862, 1862, 1503, -     1759,  129, 1747, 1873, 1759, 1885, 1873, 1759, 1885,  129, -      129, 1891, 1891,  129, 1891, 1896, 1891, 1896,  129, 1896, -     1901, 1896, 1901,  129, 1901, 1906, 1901, 1906,  129, 1906, -     1911, 1759, 1906, 1911,  129, 1759, 1885, 1911, 1919, 1885, -     1911, 1919,  129,  130,  130,  130,  130,  130,  130, 1806, - -      130, 1806, 1806, 1928, 1806,  130, 1928,  130,  130,  130, -      130,  130,  130, 1806, 1806, 1812,  130, 1806, 1928,  130, -      130,  130, 1812,  130,  130, 1939, 1928, 1812,  130, 1939, -      130,  130,  130,  130, 1812,  130, 1816, 1824,  130, 1812, -      130, 1939,  130,  130, 1824,  130, 1951,  130, 1939, 1824, -      130, 1951,  130,  130,  130,  130, 1824,  130, 1828, 1836, -      130, 1824,  130, 1951,  130,  130, 1836,  130, 1963,  130, -     1951, 1836, 2829, 1963, 1968, 1968, 1968, 1968, 1968, 1503, -     1968, 1968, 1968, 1968, 1968, 1968, 2829, 2829, 1969, 1970, -     2829, 2829, 2829, 2829, 2829, 2829, 1624, 1624,   45, 1971, - -     1974, 1974, 1975, 1975, 1975, 1624, 1968, 1968, 1968, 1968, -     1968, 1968,   45, 1747, 1975, 1975, 1975, 1975, 1975, 1624, -     1747, 1979, 1747, 1747, 1972, 1747, 1747, 1979,  129, 1747, -     1979, 1979, 1988, 1747, 1979, 1873, 1992, 1973, 1979, 1873, -     1992,  129, 1979, 1988, 1992, 2000, 1891,  129, 1891, 2004, -     1891, 2004,  129, 2004, 2009, 2004, 2009,  129, 2009, 2014, -     2009, 2014,  129, 2014, 2019, 2014, 2019,  129, 1873, 1992, -     2019, 2025, 1992, 2019, 2025,  129, 1992, 2000, 2025, 2033, -      130,  130,  130,  130,  130,  130, 1806, 1806, 1806, 1928, -      130, 1928,  130,  130,  130,  130, 1928,  130, 2040, 1806, - -     1928, 1928,  130, 2044,  130,  130,  130,  130, 1928,  130, -     1928, 2044,  130, 1928,  130, 2040,  130,  130, 2044,  130, -     2052,  130, 1928, 2044,  130, 1939,  130, 2056,  130,  130, -     2044,  130, 1939,  130, 2056,  130,  130, 2044,  130, 2052, -      130, 2056, 2064,  130, 1939,  130, 2056,  130,  130, 1951, -      130, 2068,  130, 2056, 1951,  130, 2068,  130,  130,  130, -     2078, 2056, 2079, 2064, 2068, 2076, 2077, 2077, 2077, 2077, -     2077, 1624, 2077, 2077, 2077, 2077, 2077, 2077, 2829, 2829, -       45, 2829, 2082, 2082, 2083, 2083, 2083, 1624,   45, 1747, -     2083, 2083, 2083, 2083, 2083, 1624, 1747, 1979, 2077, 2077, - -     2077, 2077, 2077, 2077,  129, 1747, 1747, 1979, 1979, 2089, -     1979, 1979, 2089,  129, 1979, 1979, 1988,  129, 1979, 2089, -     2080, 2081, 1988, 2101, 2089, 1988, 2101,  129, 1891, 1891, -     2004,  129, 2004, 2110, 2004, 2110,  129, 2110, 2115, 2110, -     2115,  129, 2115, 2120, 2115, 2120,  129, 2120, 2125, 1988, -     2120, 2125,  129, 1988, 2101, 2125, 2133, 2101, 2125, 2133, -      129,  130,  130,  130,  130,  130,  130, 1806, 1928, 1928, -     1928, 1928, 2040,  130,  130,  130,  130,  130,  130,  130, -     1928, 1928, 2040,  130, 1928, 2040,  130,  130,  130, 2040, -      130,  130, 2148, 2040, 2040,  130, 2148,  130,  130,  130, - -      130, 2040,  130, 2044, 2052,  130, 2040,  130, 2148,  130, -      130, 2052,  130, 2160,  130, 2148, 2052,  130, 2160,  130, -      130,  130,  130, 2052,  130, 2056, 2064,  130, 2052,  130, -     2160,  130,  130, 2064,  130, 2172,  130, 2160, 2064, 2178, -     2172, 2177, 2177, 2177, 2177, 2177, 1624, 2177, 2177, 2177, -     2177, 2177, 2177, 2179, 2829, 2829,   45, 1979, 2182, 2182, -     2183, 2183, 2183, 1624,   45, 1979, 2183, 2183, 2183, 2183, -     2183, 1624, 1979, 2177, 2177, 2177, 2177, 2177, 2177, 1979, -     2089,  129, 1979, 2089, 2089, 2190, 1979, 2089, 2089, 2194, -     2089, 2089, 2194,  129, 2180, 2089, 2190, 2194, 2202, 1891, - -     2004, 2004, 2181, 2110,  129, 2110, 2207, 2110, 2207,  129, -     2207, 2212, 2207, 2212,  129, 2212, 2217, 2212, 2217,  129, -     2089, 2194, 2217, 2223, 2194, 2217, 2223,  129, 2194, 2202, -     2223, 2231,  130,  130,  130,  130,  130,  130, 1928, 1928, -     2040, 2040, 2235, 2040,  130,  130,  130,  130,  130,  130, -     2040, 2040, 2040, 2235,  130, 2040,  130,  130,  130,  130, -     2235,  130, 2235, 2244, 2040, 2235,  130, 2148,  130,  130, -      130,  130, 2248,  130, 2235, 2148, 2248,  130,  130, 2235, -      130,  130,  130, 2244, 2248,  130, 2256, 2148, 2248,  130, -      130, 2160,  130,  130,  130, 2260, 2248,  130, 2160, 2260, - -      130,  130,  130, 2248, 2270, 2271, 2256, 2260, 2268, 2269, -     2269, 2269, 2269, 2269, 1624, 2269, 2269, 2269, 2269, 2269, -     2269, 2829, 2829,   45, 1979, 2275, 2275, 2276, 2276, 2276, -     1624,   45, 2089, 2276, 2276, 2276, 2276, 2276, 1624, 2089, -     2089, 2269, 2269, 2269, 2269, 2269, 2269, 2089, 2190,  129, -     2089, 2089, 2190,  129, 2089, 2190, 2190, 2287, 2190, 2190, -     2287, 2273,  129, 2829, 2110, 2110, 2274, 2207, 2272,  129, -     2004, 2207, 2296, 2207, 2296,  129, 2296, 2301, 2296, 2301, -      129, 2301, 2306, 2190, 2301, 2306,  129, 2190, 2287, 2306, -     2314, 2287, 2306, 2314,  129,  130,  130,  130,  130,  130, - -      130, 2040, 2040, 2235,  130, 2040, 2040,  130,  130,  130, -     2235,  130,  130, 2235, 2324, 2235,  130, 2235, 2324,  130, -      130,  130,  130,  130,  130, 2235, 2235, 2244,  130, 2235, -     2324,  130,  130,  130, 2244,  130,  130, 2336, 2324, 2244, -      130, 2336,  130,  130,  130,  130, 2244,  130, 2248, 2256, -      130, 2244,  130, 2336,  130,  130, 2256,  130, 2348,  130, -     2336, 2256, 2829, 2348, 2353, 2353, 2353, 2353, 2353, 1624, -     2353, 2353, 2353, 2353, 2353, 2353, 2829, 2829,   45, 2089, -     2356, 2356, 2357, 2357, 2357, 1747,   45, 2089, 2357, 2357, -     2357, 2357, 2357, 1747, 2190, 2190, 2353, 2353, 2353, 2353, - -     2353, 2353, 2361, 2190, 2190, 2190, 2354, 2190, 2361,  129, -     2190, 2355, 2361, 2361, 2370, 2110, 2207, 2207, 2296,  129, -     2296, 2375, 2296, 2375,  129, 2375, 2380, 2375, 2380,  129, -     2190, 2361, 2380, 2386, 2361, 2380, 2386,  129, 2361, 2370, -     2386, 2394,  130,  130,  130,  130,  130,  130, 2235, 2235, -     2235, 2235, 2324,  130,  130,  130,  130,  130,  130, 2235, -     2324, 2324, 2401, 2235, 2324,  130,  130,  130,  130,  130, -      130, 2324, 2405, 2324, 2324, 2405,  130,  130,  130,  130, -      130,  130, 2324, 2401, 2405, 2413, 2324, 2405,  130,  130, -      130,  130,  130,  130, 2336, 2417, 2405, 2336, 2417,  130, - -      130,  130,  130, 2829, 2829, 2405, 2413, 2417, 2425, 2426, -     2426, 2426, 2426, 2426, 1747, 2426, 2426, 2426, 2426, 2426, -     2426,   45, 2190, 2428, 2428, 2429, 2429, 2429, 1747,   45, -     2190, 2429, 2429, 2429, 2429, 2429, 1747, 2427, 2361,  129, -     2190, 2426, 2426, 2426, 2426, 2426, 2426, 2190, 2361, 2361, -     2435, 2361, 2361, 2435,  129, 2207, 2296, 2296, 2375,  129, -     2375, 2444, 2375, 2444,  129, 2444, 2449, 2361, 2444, 2449, -      129, 2361, 2435, 2449, 2457, 2435, 2449, 2457,  129,  130, -      130,  130,  130,  130,  130, 2235, 2324, 2324, 2324, 2324, -     2401,  130,  130,  130,  130,  130,  130,  130, 2324, 2324, - -     2401,  130, 2324, 2401,  130,  130,  130, 2401,  130,  130, -     2472, 2401, 2401,  130, 2472,  130,  130,  130,  130, 2401, -      130, 2405, 2413,  130, 2401,  130, 2472,  130,  130, 2413, -      130, 2484,  130, 2472, 2413, 2829, 2484, 2489, 2489, 2489, -     2489, 2489, 1747, 2489, 2489, 2489, 2489, 2489, 2489,   45, -     2361, 2490, 2490, 2491, 2491, 2491, 1747,   45, 2361, 2491, -     2491, 2491, 2491, 2491, 1747, 2361, 2361, 2435,  129, 2489, -     2489, 2489, 2489, 2489, 2489, 2361, 2435, 2435, 2498, 2296, -     2375, 2375, 2444,  129, 2444, 2503, 2444, 2503,  129, 2361, -     2435, 2503, 2509, 2435, 2503, 2509,  129, 2435, 2498, 2509, - -     2517,  130,  130,  130,  130,  130,  130, 2324, 2324, 2401, -     2401, 2521, 2401,  130,  130,  130,  130,  130,  130, 2401, -     2401, 2401, 2521,  130, 2401,  130,  130,  130,  130, 2521, -      130, 2521, 2530, 2401, 2521,  130, 2472,  130,  130,  130, -      130, 2534,  130, 2521, 2472, 2534,  130,  130, 2521,  130, -     2361, 2435, 2530, 2534, 2435, 2542, 2543, 2543, 2543, 2543, -     2543, 1747, 2543, 2543, 2543, 2543, 2543, 2543,   45, 2435, -     2544, 2544, 2545, 2545, 2545, 1747,   45, 2435, 2545, 2545, -     2545, 2545, 2545, 1747, 2498,  129, 2375, 2444, 2543, 2543, -     2543, 2543, 2543, 2543, 2444, 2503,  129, 2503, 2555, 2435, - -     2503, 2555,  129, 2435, 2498, 2555, 2562, 2498, 2555, 2562, -      129,  130,  130,  130,  130,  130,  130, 2401, 2401, 2521, -      130, 2401, 2401,  130,  130,  130, 2521,  130,  130, 2521, -     2572, 2521,  130, 2521, 2572,  130,  130,  130,  130,  130, -      130, 2521, 2521, 2530,  130, 2521, 2572,  130,  130,  130, -     2530,  130,  130, 2584, 2572, 2530, 2435, 2584, 2589, 2589, -     2589, 2589, 2589, 1747, 2589, 2589, 2589, 2589, 2589, 2589, -       45, 2435, 2590, 2590, 2591, 2591, 2591, 1979,   45, 2498, -     2591, 2591, 2591, 2591, 2591, 1979, 2498, 2595, 2444, 2503, -     2589, 2589, 2589, 2589, 2589, 2589, 2503, 2555,  129, 2498, - -     2555, 2600, 2498, 2555, 2600,  129, 2498, 2595, 2600, 2608, -      130,  130,  130,  130,  130,  130, 2521, 2521, 2521, 2521, -     2572,  130,  130,  130,  130,  130,  130, 2521, 2572, 2572, -     2615, 2521, 2572,  130,  130,  130,  130,  130,  130, 2572, -     2619, 2572, 2572, 2619,  130,  130,  130,  130, 2498, 2498, -     2572, 2615, 2619, 2627, 2628, 2628, 2628, 2628, 2628, 1979, -     2628, 2628, 2628, 2628, 2628, 2628,   45, 2595, 2629, 2629, -     2630, 2630, 2630, 1979,   45,  129, 2630, 2630, 2630, 2630, -     2630, 1979, 2503, 2555, 2555, 2600, 2628, 2628, 2628, 2628, -     2628, 2628,  129, 2498, 2595, 2600, 2639, 2595, 2600, 2639, - -      129,  130,  130,  130,  130,  130,  130, 2521, 2572, 2572, -     2572, 2572, 2615,  130,  130,  130,  130,  130,  130,  130, -     2572, 2572, 2615,  130, 2572, 2615,  130,  130,  130, 2615, -      130,  130, 2654, 2615, 2615, 2595, 2654, 2659, 2659, 2659, -     2659, 2659, 1979, 2659, 2659, 2659, 2659, 2659, 2659,   45, -     2595, 2660, 2660, 2661, 2661, 2661, 1979,   45, 2664, 2661, -     2661, 2661, 2661, 2661, 1979, 2555, 2600, 2595, 2600, 2659, -     2659, 2659, 2659, 2659, 2659, 2639,  129, 2595, 2664, 2639, -     2671,  130,  130,  130,  130,  130,  130, 2572, 2572, 2615, -     2615, 2675, 2615,  130,  130,  130,  130,  130,  130, 2615, - -     2615, 2615, 2675,  130, 2615,  130,  130, 2595, 2664, 2675, -      129, 2675, 2684, 2685, 2685, 2685, 2685, 2685, 1979, 2685, -     2685, 2685, 2685, 2685, 2685,   45, 2600, 2686, 2686, 2687, -     2687, 2687, 1979,   45, 2664, 2687, 2687, 2687, 2687, 2687, -     1979, 2639, 2664, 2639, 2671, 2685, 2685, 2685, 2685, 2685, -     2685,  129,  130,  130,  130,  130,  130,  130, 2615, 2615, -     2675,  130, 2615, 2615,  130,  130,  130, 2675,  130,  130, -     2675, 2700, 2675,  130, 2675, 2700, 2705, 2705, 2705, 2705, -     2705, 2664, 2705, 2705, 2705, 2705, 2705, 2705,   45, 2710, -     2706, 2706, 2707, 2707, 2707, 2089,   45, 2639, 2707, 2707, - -     2707, 2707, 2707, 2089, 2664, 2710, 2671, 2713, 2705, 2705, -     2705, 2705, 2705, 2705,  130,  130,  130,  130,  130,  130, -     2675, 2675, 2675, 2675, 2700,  130,  130,  130,  130, 2664, -     2710, 2675, 2700, 2700, 2721, 2722, 2722, 2722, 2722, 2722, -     2089, 2722, 2722, 2722, 2722, 2722, 2722,   45,  129, 2723, -     2723, 2724, 2724, 2724, 2089,   45, 2710, 2724, 2724, 2724, -     2724, 2724, 2089, 2671, 2713,  130, 2710, 2722, 2722, 2722, -     2722, 2722, 2722, 2727, 2728, 2728, 2728, 2728,  130,  130, -      130,  130,  130,  130, 2675, 2700, 2700, 2700, 2700, 2721, -     2734, 2734, 2734, 2734, 2734, 2710, 2734, 2734, 2734, 2734, - -     2734, 2734,   45, 2713, 2735, 2735, 2736, 2736, 2736, 2089, -       45, 2710, 2736, 2736, 2736, 2736, 2736, 2089, 2713, 1296, -      129, 1437, 2734, 2734, 2734, 2734, 2734, 2734, 2727, 2728, -     2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728,  130,  130, -      130,  130, 1432, 1296, 2700, 2700, 2721, 2721, 2741, 2741, -     2741, 2741, 2741, 1437, 2741, 2741, 2741, 2741, 2741, 2741, -       45, 1432, 2742, 2742, 2743, 2743, 2743, 2089,   45,  129, -     2743, 2743, 2743, 2743, 2743, 2089, 1432, 1427, 1432, 1427, -     2741, 2741, 2741, 2741, 2741, 2741,  130,  130,  129, 1427, -     1422, 1427, 2721, 2721, 2745, 2745, 2745, 2745, 2745, 1422, - -     2745, 2745, 2745, 2745, 2745, 2745,   45,  129, 2746, 2746, -     2747, 2747, 2747, 2190,   45, 1422, 2747, 2747, 2747, 2747, -     2747, 2190, 1422,  129, 1416, 1296, 2745, 2745, 2745, 2745, -     2745, 2745,  130, 1404, 1416, 1296, 1404, 1285, 2721, 2748, -     2748, 2748, 2748, 2748, 2190, 2748, 2748, 2748, 2748, 2748, -     2748,   45,  129, 2749, 2749, 2750, 2750, 2750, 2190,   45, -     1296, 2750, 2750, 2750, 2750, 2750, 2190, 1289, 1285,  129, -     1404, 2748, 2748, 2748, 2748, 2748, 2748, 2751, 2751, 2751, -     2751, 2751, 1285, 2751, 2751, 2751, 2751, 2751, 2751,   45, -     1395, 2752, 2752, 2753, 2753, 2753, 2190,   45, 1404, 2753, - -     2753, 2753, 2753, 2753, 2190, 1285, 1395,  129, 1285, 2751, -     2751, 2751, 2751, 2751, 2751, 2754, 2754, 2754, 2754, 2754, -     1281, 2754, 2754, 2754, 2754, 2754, 2754,   45, 1281, 2755, -     2755, 2756, 2756, 2756, 2190,   45,  129, 2756, 2756, 2756, -     2756, 2756, 2190, 1395, 1395,  129, 2829, 2754, 2754, 2754, -     2754, 2754, 2754, 2757, 2757, 2757, 2757, 2757, 2829, 2757, -     2757, 2757, 2757, 2757, 2757,   45, 2829, 2758, 2758, 2759, -     2759, 2759, 2361,   45, 1378, 2759, 2759, 2759, 2759, 2759, -     2361, 1377,  130,  130,  130, 2757, 2757, 2757, 2757, 2757, -     2757, 2760, 2760, 2760, 2760, 2760, 2361, 2760, 2760, 2760, - -     2760, 2760, 2760,   45,  130, 2761, 2761, 2762, 2762, 2762, -     2361,   45, 1335, 2762, 2762, 2762, 2762, 2762, 2361, 1327, -     1308, 1300,  129, 2760, 2760, 2760, 2760, 2760, 2760, 2763, -     2763, 2763, 2763, 2763, 1327, 2763, 2763, 2763, 2763, 2763, -     2763,   45, 1321, 2764, 2764, 2765, 2765, 2765, 2361,   45, -     1300, 2765, 2765, 2765, 2765, 2765, 2361, 1327, 1321, 1300, -     1185, 2763, 2763, 2763, 2763, 2763, 2763, 2766, 2766, 2766, -     2766, 2766,  129, 2766, 2766, 2766, 2766, 2766, 2766,   45, -     1321, 2767, 2767, 2768, 2768, 2768, 2361,   45, 1316, 2768, -     2768, 2768, 2768, 2768, 2361, 1321, 1316,  129, 1316, 2766, - -     2766, 2766, 2766, 2766, 2766, 2769, 2769, 2769, 2769, 2769, -     1311, 2769, 2769, 2769, 2769, 2769, 2769,   45, 1316, 2770, -     2770, 2771, 2771, 2771, 2435,   45, 1311, 2771, 2771, 2771, -     2771, 2771, 2435,  129, 1311, 1311,  129, 2769, 2769, 2769, -     2769, 2769, 2769, 2772, 2772, 2772, 2772, 2772, 2435, 2772, -     2772, 2772, 2772, 2772, 2772,   45, 1308, 2773, 2773, 2774, -     2774, 2774, 2435,   45, 1300, 2774, 2774, 2774, 2774, 2774, -     2435, 1296, 1289,  129, 1300, 2772, 2772, 2772, 2772, 2772, -     2772, 2775, 2775, 2775, 2775, 2775, 1185, 2775, 2775, 2775, -     2775, 2775, 2775,   45, 1289, 2776, 2776, 2777, 2777, 2777, - -     2435,   45, 1300, 2777, 2777, 2777, 2777, 2777, 2435, 1185, -     1289, 1177, 1296, 2775, 2775, 2775, 2775, 2775, 2775, 2778, -     2778, 2778, 2778, 2778, 1289, 2778, 2778, 2778, 2778, 2778, -     2778,   45, 1285, 2779, 2779, 2780, 2780, 2780, 2435,   45, -      129, 2780, 2780, 2780, 2780, 2780, 2435, 1289, 1177, 1289, -     1177, 2778, 2778, 2778, 2778, 2778, 2778, 2781, 2781, 2781, -     2781, 2781, 1177, 2781, 2781, 2781, 2781, 2781, 2781,   45, -     1285, 2782, 2782, 2783, 2783, 2783, 2498,   45,  129, 2783, -     2783, 2783, 2783, 2783, 2498, 2829, 1265, 1264, 2829, 2781, -     2781, 2781, 2781, 2781, 2781, 2784, 2784, 2784, 2784, 2784, - -     2498, 2784, 2784, 2784, 2784, 2784, 2784,   45,  130, 2785, -     2785, 2786, 2786, 2786, 2498,   45,  130, 2786, 2786, 2786, -     2786, 2786, 2498,  130,  130,  130,  130, 2784, 2784, 2784, -     2784, 2784, 2784, 2787, 2787, 2787, 2787, 2787,  129, 2787, -     2787, 2787, 2787, 2787, 2787,   45, 1222, 2788, 2788, 2789, -     2789, 2789, 2498,   45, 1214, 2789, 2789, 2789, 2789, 2789, -     2498, 1196, 1222, 1214, 1196, 2787, 2787, 2787, 2787, 2787, -     2787, 2790, 2790, 2790, 2790, 2790, 1084, 2790, 2790, 2790, -     2790, 2790, 2790,   45,  129, 2791, 2791, 2792, 2792, 2792, -     2498,   45, 1214, 2792, 2792, 2792, 2792, 2792, 2498, 1209, - -     1084, 1214, 1209, 2790, 2790, 2790, 2790, 2790, 2790, 2793, -     2793, 2793, 2793, 2793,  129, 2793, 2793, 2793, 2793, 2793, -     2793,   45, 1209, 2794, 2794, 2795, 2795, 2795, 2595,   45, -     1204, 2795, 2795, 2795, 2795, 2795, 2595, 1209, 1204,  129, -     1204, 2793, 2793, 2793, 2793, 2793, 2793, 2796, 2796, 2796, -     2796, 2796, 2595, 2796, 2796, 2796, 2796, 2796, 2796,   45, -     1204, 2797, 2797, 2798, 2798, 2798, 2595,   45,  129, 2798, -     2798, 2798, 2798, 2798, 2595, 1201,  129, 1196, 1084, 2796, -     2796, 2796, 2796, 2796, 2796, 2799, 2799, 2799, 2799, 2799, -     1185, 2799, 2799, 2799, 2799, 2799, 2799,   45, 1196, 2800, - -     2800, 2801, 2801, 2801, 2595,   45, 1084, 2801, 2801, 2801, -     2801, 2801, 2595, 1185, 1075,  129, 1084, 2799, 2799, 2799, -     2799, 2799, 2799, 2802, 2802, 2802, 2802, 2802, 1079, 2802, -     2802, 2802, 2802, 2802, 2802,   45, 1075, 2803, 2803, 2804, -     2804, 2804, 2595,   45,  129, 2804, 2804, 2804, 2804, 2804, -     2595, 1185, 1075, 1185, 1075, 2802, 2802, 2802, 2802, 2802, -     2802, 2805, 2805, 2805, 2805, 2805,  129, 2805, 2805, 2805, -     2805, 2805, 2805,   45, 1075, 2806, 2806, 2807, 2807, 2807, -     2664,   45, 1075, 2807, 2807, 2807, 2807, 2807, 2664,  129, -     1160, 1159, 1158, 2805, 2805, 2805, 2805, 2805, 2805, 2808, - -     2808, 2808, 2808, 2808, 2664, 2808, 2808, 2808, 2808, 2808, -     2808,   45, 1157, 2809, 2809, 2810, 2810, 2810, 2664,   45, -     2829, 2810, 2810, 2810, 2810, 2810, 2664, 2829,  130,  130, -      130, 2808, 2808, 2808, 2808, 2808, 2808, 2811, 2811, 2811, -     2811, 2811, 1120, 2811, 2811, 2811, 2811, 2811, 2811,   45, -     1112, 2812, 2812, 2813, 2813, 2813, 2664,   45, 1096, 2813, -     2813, 2813, 2813, 2813, 2664, 1088,  129, 1112, 1106, 2811, -     2811, 2811, 2811, 2811, 2811, 2814, 2814, 2814, 2814, 2814, -     1088, 2814, 2814, 2814, 2814, 2814, 2814,   45, 1112, 2815, -     2815, 2816, 2816, 2816, 2664,   45, 1106, 2816, 2816, 2816, - -     2816, 2816, 2664, 1088,  984,  129, 1106, 2814, 2814, 2814, -     2814, 2814, 2814, 2817, 2817, 2817, 2817, 2817, 1101, 2817, -     2817, 2817, 2817, 2817, 2817,   45, 1106, 2818, 2818, 2819, -     2819, 2819, 2710,   45, 1101, 2819, 2819, 2819, 2819, 2819, -     2710,  129, 1101, 1098, 1101, 2817, 2817, 2817, 2817, 2817, -     2817, 2820, 2820, 2820, 2820, 2820, 2710, 2820, 2820, 2820, -     2820, 2820, 2820,   45,  129, 2821, 2821, 2822, 2822, 2822, -     2710,   45, 1098, 2822, 2822, 2822, 2822, 2822, 2710, 1096, -     1088, 1084, 1079, 2820, 2820, 2820, 2820, 2820, 2820, 2823, -     2823, 2823, 2823, 2823,  129, 2823, 2823, 2823, 2823, 2823, - -     2823,   45, 1088, 2824, 2824, 2825, 2825, 2825, 2710,   45, -      984, 2825, 2825, 2825, 2825, 2825, 2710, 1079, 1088,  984, -     1079, 2823, 2823, 2823, 2823, 2823, 2823, 2826, 2826, 2826, -     2826, 2826, 1084, 2826, 2826, 2826, 2826, 2826, 2826,   45, -     1079, 2827, 2827, 2828, 2828, 2828, 2710,   45,  129, 2828, -     2828, 2828, 2828, 2828, 2710, 1079, 1079,  129, 2829, 2826, -     2826, 2826, 2826, 2826, 2826,   51,   51,   51,   51,   51, -     1058,   51,   51,   51,   51,   51,   51,   45, 1057, 2827, -     2827, 2828, 2828, 2828,   45, 1056, 2828, 2828, 2828, 2828, -     2828, 1055, 2829,  130,  130,  130,  130,   51,   51,   51, - -       51,   51,   51,   41,   41,   41,   41,   41,   41,   41, -       41,   44,  130,   44,   44,   44,   44,   44,   44,   49, -      129,   49,   49,   51, 1016,   51,   51,   51,   51,  127, -     1008,  127,  127,  128,  128,  131,  131,  214,  993,  214, -      214,  215,  215,  216,  216,  220,  220,  220,  301, 1016, -      301,  301,  302,  302,  303,  303,  305,  305,  306,  306, -      307,  307,  307,  309,  309,  378, 1008,  378,  378,  379, -      379,  380,  380,  382,  382,  383,  383,  384,  384,  385, -      385,  387,  387,  387,  389,  389,  390,  390,  390,  462, -      993,  462,  462,  463,  463,  464,  464,  466,  466,  467, - -      467,  468,  468,  469,  469,  471,  471,  472,  472,  473, -      473,  474,  474,  474,  476,  476,  477,  477,  477,  479, -      479,  479,  480,  480,  546,  891,  546,  546,  547,  547, -      548,  548,  550,  550,  552,  552,  553,  553,  554,  554, -      556,  556,  557,  557,  558,  558,  559,  559,  560,  560, -      561,  561,  563,  563,  563,  565,  565,  566,  566,  566, -      568,  568,  568,  569,  569,  570,  570,  570,  571,  571, -      571,  635,  129,  635,  635,  636,  636,  637,  637,  639, -      639,  640,  640,  641,  641,  643,  643,  644,  644,  646, -      646,  647,  647,  648,  648,  649,  649,  650,  650,  651, - -      651,  653,  653,  654,  654,  655,  655,  656,  656,  657, -      657,  657,  659,  659,  660,  660,  660,  661,  661,  661, -      662,  662,  663,  663,  663,  664,  664,  664,  666,  666, -      666,  667,  667,  667,  668,  668,   51, 1008,   51,   51, -       51,  717, 1003,  717,  717,  718,  718,  719,  719,  721, -      721,  722,  722,  723,  723,  724,  724,  635,  635,  727, -      727,  728,  728,  730,  730,  731,  731,  732,  732,  733, -      733,  734,  734,  736,  736,  737,  737,  738,  738,  739, -      739,  740,  740,  741,  741,  742,  742,  744,  744,  744, -      746,  746,  747,  747,  747,  749,  749,  749,  750,  750, - -      750,  751,  751,  751,  753,  753,  753,  754,  754,  754, -      755,  755,  756,  756,  756,  757,  757,  757,  758,  758, -      758,   51,  891,   51,   51,   51,  801, 1008,  801,  801, -      802,  802,  803,  803,  804,  804,  805,  805,  806,  806, -      807,  807,  809,  809,  810,  810,  811,  811,  812,  812, -      813,  813,  815,  815,  816,  816,  817,  817,  818,  818, -      820,  820,  821,  821,  822,  822,  823,  823,  824,  824, -      825,  825,  826,  826,  828,  828,  829,  829,  830,  830, -      831,  831,  832,  832,  832,  834,  834,  835,  835,  835, -      837,  837,  837,  838,  838,  744,  744,  744,  839,  839, - -      839,  840,  840,  840,  841,  841,  842,  842,  842,  843, -      843,  843,  844,  844,  844,  846,  846,  846,  847,  847, -      847,  848,  848,  848,  849,  849,   51, 1003,   51,   51, -       51,  888,  129,  888,  888,  889,  889,  890,  890,  892, -      892,  893,  893,  894,  894,  896,  896,  897,  897,  898, -      898,  899,  899,  900,  900,  901,  901,  903,  903,  905, -      905,  906,  906,  907,  907,  908,  908,  809,  809,  910, -      910,  911,  911,  912,  912,  913,  913,  914,  914,  916, -      916,  917,  917,  918,  918,  919,  919,  920,  920,  921, -      921,  922,  922,  924,  924,  924,  926,  926,  927,  927, - -      927,  929,  929,  929,  930,  930,  931,  931,  931,  932, -      932,  932,  934,  934,  934,  935,  935,  935,  936,  936, -      936,  938,  938,  938,  939,  939,  939,  940,  940,  940, -      941,  941,  942,  942,  942,  943,  943,  943,  944,  944, -      944,   51, 1003,   51,   51,   51,  981,  999,  981,  981, -      982,  982,  983,  983,  985,  985,  986,  986,  888,  888, -      987,  987,  988,  988,  989,  989,  990,  990,  991,  991, -      992,  992,  994,  994,  995,  995,  996,  996,  997,  997, -      998,  998, 1000, 1000, 1001, 1001, 1002, 1002,  896,  896, -     1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1009, 1009, - -     1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1014, 1014, -     1015, 1015, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1020, -     1021, 1021, 1021, 1023, 1023, 1024, 1024, 1024, 1025, 1025, -     1025, 1026, 1026, 1027, 1027, 1027, 1028, 1028, 1028, 1030, -     1030, 1030, 1031, 1031, 1031, 1032, 1032, 1033, 1033, 1033, -     1034, 1034, 1034, 1035, 1035, 1035, 1036, 1036, 1037, 1037, -     1037, 1038, 1038, 1038, 1039, 1039, 1039, 1041, 1041, 1041, -     1042, 1042, 1042, 1043, 1043, 1043, 1044, 1044,   51, 1003, -       51,   51,   51, 1076,  999, 1076, 1076, 1077, 1077, 1078, -     1078, 1080, 1080, 1081, 1081, 1082, 1082, 1083, 1083, 1085, - -     1085, 1086, 1086, 1087, 1087, 1089, 1089, 1090, 1090, 1091, -     1091, 1092, 1092, 1093, 1093, 1094, 1094, 1095, 1095, 1097, -     1097, 1099, 1099, 1100, 1100,  987,  987, 1102, 1102, 1103, -     1103, 1104, 1104, 1105, 1105,  995,  995, 1107, 1107, 1108, -     1108, 1109, 1109, 1110, 1110, 1111, 1111, 1113, 1113, 1114, -     1114, 1115, 1115, 1116, 1116, 1117, 1117, 1118, 1118, 1119, -     1119, 1121, 1121, 1121, 1123, 1123, 1124, 1124, 1124, 1126, -     1126, 1126, 1127, 1127, 1127, 1128, 1128, 1128, 1130, 1130, -     1130, 1131, 1131, 1131, 1132, 1132, 1133, 1133, 1133, 1134, -     1134, 1134, 1135, 1135, 1135, 1137, 1137, 1137, 1138, 1138, - -     1138, 1139, 1139, 1139, 1141, 1141, 1141, 1142, 1142, 1142, -     1143, 1143, 1143, 1144, 1144, 1145, 1145, 1145, 1146, 1146, -     1146, 1147, 1147, 1147,   51,  129,   51,   51,   51, 1178, -      999, 1178, 1178, 1179, 1179, 1180, 1180, 1181, 1181, 1182, -     1182, 1183, 1183, 1184, 1184, 1186, 1186, 1187, 1187, 1188, -     1188, 1189, 1189, 1190, 1190, 1191, 1191, 1192, 1192, 1193, -     1193, 1194, 1194, 1195, 1195, 1197, 1197, 1198, 1198, 1199, -     1199, 1200, 1200,  981,  981, 1202, 1202, 1203, 1203, 1205, -     1205, 1206, 1206, 1207, 1207, 1208, 1208, 1090, 1090, 1210, -     1210, 1211, 1211, 1212, 1212, 1213, 1213, 1215, 1215, 1216, - -     1216, 1217, 1217, 1218, 1218, 1219, 1219, 1220, 1220, 1221, -     1221, 1223, 1223, 1224, 1224, 1225, 1225, 1226, 1226, 1227, -     1227, 1227, 1229, 1229, 1230, 1230, 1230, 1232, 1232, 1232, -     1233, 1233, 1121, 1121, 1121, 1234, 1234, 1234, 1235, 1235, -     1235, 1236, 1236, 1237, 1237, 1237, 1238, 1238, 1238, 1239, -     1239, 1239, 1241, 1241, 1241, 1242, 1242, 1242, 1243, 1243, -     1243, 1244, 1244, 1245, 1245, 1245, 1246, 1246, 1246, 1247, -     1247, 1247, 1248, 1248, 1249, 1249, 1249, 1250, 1250, 1250, -     1251, 1251, 1251, 1253, 1253, 1253, 1254, 1254, 1254, 1255, -     1255, 1255, 1256, 1256,   51,  129,   51,   51,   51, 1282, - -      993, 1282, 1282, 1283, 1283, 1284, 1284, 1286, 1286, 1287, -     1287, 1288, 1288, 1290, 1290, 1291, 1291, 1292, 1292, 1293, -     1293, 1294, 1294, 1295, 1295, 1297, 1297, 1298, 1298, 1299, -     1299, 1301, 1301, 1302, 1302, 1303, 1303, 1304, 1304, 1305, -     1305, 1306, 1306, 1307, 1307, 1309, 1309, 1310, 1310, 1312, -     1312, 1313, 1313, 1314, 1314, 1315, 1315, 1190, 1190, 1317, -     1317, 1318, 1318, 1319, 1319, 1320, 1320, 1198, 1198, 1322, -     1322, 1323, 1323, 1324, 1324, 1325, 1325, 1326, 1326, 1328, -     1328, 1329, 1329, 1330, 1330, 1331, 1331, 1332, 1332, 1333, -     1333, 1334, 1334, 1336, 1336, 1336, 1338, 1338, 1339, 1339, - -     1339, 1341, 1341, 1341, 1342, 1342, 1343, 1343, 1343, 1344, -     1344, 1344, 1346, 1346, 1346, 1347, 1347, 1347, 1348, 1348, -     1348, 1350, 1350, 1350, 1351, 1351, 1351, 1352, 1352, 1352, -     1353, 1353, 1354, 1354, 1354, 1355, 1355, 1355, 1356, 1356, -     1356, 1358, 1358, 1358, 1359, 1359, 1359, 1360, 1360, 1360, -     1362, 1362, 1362, 1363, 1363, 1363, 1364, 1364, 1364, 1365, -     1365, 1366, 1366, 1366, 1367, 1367, 1367, 1368, 1368, 1368, -       51,  891,   51,   51,   51, 1392,  984, 1392, 1392, 1393, -     1393, 1394, 1394, 1396, 1396, 1397, 1397, 1282, 1282, 1398, -     1398, 1399, 1399, 1400, 1400, 1401, 1401, 1402, 1402, 1403, - -     1403, 1405, 1405, 1406, 1406, 1407, 1407, 1408, 1408, 1409, -     1409, 1410, 1410, 1411, 1411, 1412, 1412, 1413, 1413, 1414, -     1414, 1415, 1415, 1417, 1417, 1418, 1418, 1419, 1419, 1420, -     1420, 1421, 1421, 1423, 1423, 1424, 1424, 1425, 1425, 1426, -     1426, 1186, 1186, 1428, 1428, 1429, 1429, 1430, 1430, 1431, -     1431, 1302, 1302, 1433, 1433, 1434, 1434, 1435, 1435, 1436, -     1436, 1438, 1438, 1439, 1439, 1440, 1440, 1441, 1441, 1442, -     1442, 1443, 1443, 1444, 1444, 1446, 1446, 1447, 1447, 1448, -     1448, 1449, 1449, 1450, 1450, 1450, 1452, 1452, 1453, 1453, -     1453, 1454, 1454, 1454, 1455, 1455, 1456, 1456, 1456, 1457, - -     1457, 1457, 1459, 1459, 1459, 1460, 1460, 1460, 1461, 1461, -     1462, 1462, 1462, 1463, 1463, 1463, 1464, 1464, 1464, 1465, -     1465, 1466, 1466, 1466, 1467, 1467, 1467, 1468, 1468, 1468, -     1470, 1470, 1470, 1471, 1471, 1471, 1472, 1472, 1472, 1473, -     1473, 1474, 1474, 1474, 1475, 1475, 1475, 1476, 1476, 1476, -     1477, 1477, 1478, 1478, 1478, 1479, 1479, 1479, 1480, 1480, -     1480, 1482, 1482, 1482, 1483, 1483, 1483, 1484, 1484, 1484, -     1485, 1485,   51,  993,   51,   51,   51, 1504,  891, 1504, -     1504, 1393, 1393, 1505, 1505, 1506, 1506, 1507, 1507, 1508, -     1508, 1509, 1509, 1511, 1511, 1512, 1512, 1513, 1513, 1515, - -     1515, 1516, 1516, 1517, 1517, 1518, 1518, 1519, 1519, 1520, -     1520, 1521, 1521, 1523, 1523, 1524, 1524, 1525, 1525, 1527, -     1527, 1528, 1528, 1529, 1529, 1530, 1530, 1531, 1531, 1532, -     1532, 1533, 1533, 1535, 1535, 1537, 1537, 1538, 1538, 1539, -     1539, 1290, 1290, 1541, 1541, 1542, 1542, 1543, 1543, 1544, -     1544, 1410, 1410, 1546, 1546, 1547, 1547, 1548, 1548, 1549, -     1549, 1418, 1418, 1551, 1551, 1552, 1552, 1553, 1553, 1554, -     1554, 1555, 1555, 1557, 1557, 1558, 1558, 1559, 1559, 1560, -     1560, 1561, 1561, 1562, 1562, 1563, 1563, 1565, 1565, 1565, -     1567, 1567, 1568, 1568, 1568, 1570, 1570, 1570, 1571, 1571, - -     1571, 1572, 1572, 1572, 1574, 1574, 1574, 1575, 1575, 1575, -     1576, 1576, 1577, 1577, 1577, 1578, 1578, 1578, 1579, 1579, -     1579, 1581, 1581, 1581, 1582, 1582, 1582, 1583, 1583, 1583, -     1585, 1585, 1585, 1586, 1586, 1586, 1587, 1587, 1587, 1588, -     1588, 1589, 1589, 1589, 1590, 1590, 1590, 1591, 1591, 1591, -     1593, 1593, 1593, 1594, 1594, 1594, 1595, 1595, 1595, 1597, -     1597, 1597, 1598, 1598, 1598, 1599, 1599, 1599, 1600, 1600, -     1601, 1601, 1601, 1602, 1602, 1602, 1603, 1603, 1603,   51, -      984,   51,   51,   51, 1620,  129, 1620, 1620, 1507, 1507, -     1621, 1621, 1622, 1622, 1623, 1623, 1625, 1625, 1626, 1626, - -     1627, 1627, 1628, 1628, 1629, 1629, 1630, 1630, 1631, 1631, -     1632, 1632, 1633, 1633, 1634, 1634, 1636, 1636, 1637, 1637, -     1638, 1638, 1639, 1639, 1640, 1640, 1641, 1641, 1642, 1642, -     1643, 1643, 1644, 1644, 1645, 1645, 1646, 1646, 1648, 1648, -     1649, 1649, 1650, 1650, 1651, 1651, 1652, 1652, 1654, 1654, -     1655, 1655, 1398, 1398, 1657, 1657, 1658, 1658, 1659, 1659, -     1660, 1660, 1406, 1406, 1662, 1662, 1663, 1663, 1664, 1664, -     1665, 1665, 1528, 1528, 1667, 1667, 1668, 1668, 1669, 1669, -     1670, 1670, 1672, 1672, 1673, 1673, 1674, 1674, 1675, 1675, -     1676, 1676, 1677, 1677, 1678, 1678, 1680, 1680, 1681, 1681, - -     1682, 1682, 1683, 1683, 1684, 1684, 1684, 1686, 1686, 1687, -     1687, 1687, 1689, 1689, 1689, 1690, 1690, 1565, 1565, 1565, -     1691, 1691, 1691, 1692, 1692, 1692, 1693, 1693, 1694, 1694, -     1694, 1695, 1695, 1695, 1696, 1696, 1696, 1698, 1698, 1698, -     1699, 1699, 1699, 1700, 1700, 1700, 1701, 1701, 1702, 1702, -     1702, 1703, 1703, 1703, 1704, 1704, 1704, 1705, 1705, 1706, -     1706, 1706, 1707, 1707, 1707, 1708, 1708, 1708, 1710, 1710, -     1710, 1711, 1711, 1711, 1712, 1712, 1712, 1713, 1713, 1714, -     1714, 1714, 1715, 1715, 1715, 1716, 1716, 1716, 1717, 1717, -     1718, 1718, 1718, 1719, 1719, 1719, 1720, 1720, 1720, 1722, - -     1722, 1722, 1723, 1723, 1723, 1724, 1724, 1724, 1725, 1725, -       51,  891,   51,   51,   51, 1741,  887, 1741, 1741, 1742, -     1742, 1743, 1743, 1627, 1627, 1744, 1744, 1745, 1745, 1746, -     1746, 1748, 1748, 1749, 1749, 1750, 1750, 1752, 1752, 1753, -     1753, 1754, 1754, 1755, 1755, 1756, 1756, 1757, 1757, 1758, -     1758, 1760, 1760, 1761, 1761, 1762, 1762, 1764, 1764, 1765, -     1765, 1766, 1766, 1767, 1767, 1768, 1768, 1769, 1769, 1770, -     1770, 1392, 1392, 1773, 1773, 1774, 1774, 1776, 1776, 1777, -     1777, 1778, 1778, 1779, 1779, 1516, 1516, 1781, 1781, 1782, -     1782, 1783, 1783, 1784, 1784, 1641, 1641, 1786, 1786, 1787, - -     1787, 1788, 1788, 1789, 1789, 1649, 1649, 1791, 1791, 1792, -     1792, 1761, 1761, 1793, 1793, 1794, 1794, 1795, 1795, 1797, -     1797, 1798, 1798, 1799, 1799, 1800, 1800, 1769, 1769, 1801, -     1801, 1802, 1802, 1803, 1803, 1805, 1805, 1805, 1686, 1686, -     1807, 1807, 1807, 1808, 1808, 1808, 1809, 1809, 1810, 1810, -     1810, 1811, 1811, 1811, 1813, 1813, 1813, 1814, 1814, 1814, -     1815, 1815, 1815, 1817, 1817, 1817, 1818, 1818, 1818, 1819, -     1819, 1819, 1820, 1820, 1821, 1821, 1821, 1822, 1822, 1822, -     1823, 1823, 1823, 1825, 1825, 1825, 1826, 1826, 1826, 1827, -     1827, 1827, 1829, 1829, 1829, 1830, 1830, 1830, 1831, 1831, - -     1831, 1832, 1832, 1833, 1833, 1833, 1834, 1834, 1834, 1835, -     1835, 1835, 1837, 1837, 1837, 1838, 1838, 1838, 1839, 1839, -     1839, 1841, 1841, 1841, 1842, 1842, 1842, 1843, 1843, 1843, -     1844, 1844, 1845, 1845, 1845, 1846, 1846, 1846, 1847, 1847, -     1847,   51,  887,   51,   51,   51, 1742,  129, 1742, 1742, -     1744, 1744, 1863, 1863, 1864, 1864, 1865, 1865, 1866, 1866, -     1867, 1867, 1868, 1868, 1869, 1869, 1870, 1870, 1871, 1871, -     1872, 1872, 1874, 1874, 1875, 1875, 1876, 1876, 1877, 1877, -     1878, 1878, 1879, 1879, 1880, 1880, 1881, 1881, 1882, 1882, -     1883, 1883, 1884, 1884, 1886, 1886, 1887, 1887, 1888, 1888, - -     1889, 1889, 1773, 1773, 1890, 1890, 1892, 1892, 1893, 1893, -     1894, 1894, 1895, 1895, 1629, 1629, 1897, 1897, 1898, 1898, -     1899, 1899, 1900, 1900, 1637, 1637, 1902, 1902, 1903, 1903, -     1904, 1904, 1905, 1905, 1765, 1765, 1907, 1907, 1908, 1908, -     1909, 1909, 1910, 1910, 1912, 1912, 1913, 1913, 1914, 1914, -     1915, 1915, 1883, 1883, 1916, 1916, 1917, 1917, 1918, 1918, -     1920, 1920, 1921, 1921, 1922, 1922, 1923, 1923, 1924, 1924, -     1924, 1809, 1809, 1925, 1925, 1925, 1926, 1926, 1926, 1927, -     1927, 1927, 1929, 1929, 1929, 1930, 1930, 1930, 1931, 1931, -     1932, 1932, 1932, 1933, 1933, 1933, 1934, 1934, 1934, 1935, - -     1935, 1936, 1936, 1936, 1937, 1937, 1937, 1938, 1938, 1938, -     1940, 1940, 1940, 1941, 1941, 1941, 1942, 1942, 1942, 1943, -     1943, 1944, 1944, 1944, 1945, 1945, 1945, 1946, 1946, 1946, -     1947, 1947, 1948, 1948, 1948, 1949, 1949, 1949, 1950, 1950, -     1950, 1952, 1952, 1952, 1953, 1953, 1953, 1954, 1954, 1954, -     1955, 1955, 1956, 1956, 1956, 1957, 1957, 1957, 1958, 1958, -     1958, 1959, 1959, 1960, 1960, 1960, 1961, 1961, 1961, 1962, -     1962, 1962, 1964, 1964, 1964, 1965, 1965, 1965, 1966, 1966, -     1966, 1967, 1967,   51,  984,   51,   51,   51, 1744,  984, -     1744, 1744, 1865, 1865, 1863, 1863, 1976, 1976, 1977, 1977, - -     1978, 1978, 1980, 1980, 1981, 1981, 1982, 1982, 1983, 1983, -     1984, 1984, 1985, 1985, 1986, 1986, 1987, 1987, 1989, 1989, -     1990, 1990, 1991, 1991, 1993, 1993, 1994, 1994, 1995, 1995, -     1996, 1996, 1997, 1997, 1998, 1998, 1999, 1999, 2001, 2001, -     1893, 1893, 2002, 2002, 2003, 2003, 1625, 1625, 2005, 2005, -     2006, 2006, 2007, 2007, 2008, 2008, 1753, 1753, 2010, 2010, -     2011, 2011, 2012, 2012, 2013, 2013, 1879, 1879, 2015, 2015, -     2016, 2016, 2017, 2017, 2018, 2018, 1887, 1887, 2020, 2020, -     2021, 2021, 1990, 1990, 2022, 2022, 2023, 2023, 2024, 2024, -     2026, 2026, 2027, 2027, 2028, 2028, 2029, 2029, 1998, 1998, - -     2030, 2030, 2031, 2031, 2032, 2032, 2034, 2034, 2034, 2035, -     2035, 2035, 2036, 2036, 2036, 1931, 1931, 2037, 2037, 2037, -     2038, 2038, 2038, 2039, 2039, 2039, 2041, 2041, 2041, 2042, -     2042, 2042, 2043, 2043, 2043, 2045, 2045, 2045, 2046, 2046, -     2046, 2047, 2047, 2047, 2048, 2048, 2049, 2049, 2049, 2050, -     2050, 2050, 2051, 2051, 2051, 2053, 2053, 2053, 2054, 2054, -     2054, 2055, 2055, 2055, 2057, 2057, 2057, 2058, 2058, 2058, -     2059, 2059, 2059, 2060, 2060, 2061, 2061, 2061, 2062, 2062, -     2062, 2063, 2063, 2063, 2065, 2065, 2065, 2066, 2066, 2066, -     2067, 2067, 2067, 2069, 2069, 2069, 2070, 2070, 2070, 2071, - -     2071, 2071, 2072, 2072, 2073, 2073, 2073, 2074, 2074, 2074, -     2075, 2075, 2075,   51,  129,   51,   51,   51, 1864, 2829, -     1864, 1864, 1981, 1981, 2084, 2084, 2085, 2085, 1984, 1984, -     1977, 1977, 2086, 2086, 2087, 2087, 2088, 2088, 2090, 2090, -     2091, 2091, 2092, 2092, 2093, 2093, 2094, 2094, 2095, 2095, -     2096, 2096, 2097, 2097, 2098, 2098, 2099, 2099, 2100, 2100, -     2102, 2102, 2103, 2103, 2104, 2104, 2105, 2105, 2106, 2106, -     1742, 1742, 2107, 2107, 2006, 2006, 2108, 2108, 2109, 2109, -     1868, 1868, 2111, 2111, 2112, 2112, 2113, 2113, 2114, 2114, -     1875, 1875, 2116, 2116, 2117, 2117, 2118, 2118, 2119, 2119, - -     1994, 1994, 2121, 2121, 2122, 2122, 2123, 2123, 2124, 2124, -     2126, 2126, 2127, 2127, 2128, 2128, 2129, 2129, 2099, 2099, -     2130, 2130, 2131, 2131, 2132, 2132, 2134, 2134, 2135, 2135, -     2136, 2136, 2137, 2137, 2035, 2035, 2035, 2037, 2037, 2037, -     2138, 2138, 2138, 2139, 2139, 2139, 2140, 2140, 2140, 2141, -     2141, 2141, 2142, 2142, 2143, 2143, 2143, 2144, 2144, 2144, -     2145, 2145, 2145, 2146, 2146, 2146, 2147, 2147, 2147, 2149, -     2149, 2149, 2150, 2150, 2150, 2151, 2151, 2151, 2152, 2152, -     2153, 2153, 2153, 2154, 2154, 2154, 2155, 2155, 2155, 2156, -     2156, 2157, 2157, 2157, 2158, 2158, 2158, 2159, 2159, 2159, - -     2161, 2161, 2161, 2162, 2162, 2162, 2163, 2163, 2163, 2164, -     2164, 2165, 2165, 2165, 2166, 2166, 2166, 2167, 2167, 2167, -     2168, 2168, 2169, 2169, 2169, 2170, 2170, 2170, 2171, 2171, -     2171, 2173, 2173, 2173, 2174, 2174, 2174, 2175, 2175, 2175, -     2176, 2176,   51, 2829,   51,   51,   51, 1863,  962, 1863, -     1863, 2086, 2086, 2184, 2184, 2090, 2090, 2185, 2185, 2186, -     2186, 2093, 2093, 2187, 2187, 2188, 2188, 2189, 2189, 2191, -     2191, 2192, 2192, 2193, 2193, 2195, 2195, 2196, 2196, 2197, -     2197, 2198, 2198, 2199, 2199, 2200, 2200, 2201, 2201, 1742, -     1742, 2203, 2203, 1865, 1865, 2204, 2204, 2112, 2112, 2205, - -     2205, 2206, 2206, 1982, 1982, 2208, 2208, 2209, 2209, 2210, -     2210, 2211, 2211, 2095, 2095, 2213, 2213, 2214, 2214, 2215, -     2215, 2216, 2216, 2103, 2103, 2218, 2218, 2219, 2219, 2192, -     2192, 2220, 2220, 2221, 2221, 2222, 2222, 2224, 2224, 2225, -     2225, 2226, 2226, 2227, 2227, 2200, 2200, 2228, 2228, 2229, -     2229, 2230, 2230, 2140, 2140, 2140, 2138, 2138, 2138, 2232, -     2232, 2232, 2233, 2233, 2233, 2234, 2234, 2234, 2236, 2236, -     2236, 2237, 2237, 2237, 2238, 2238, 2238, 2239, 2239, 2239, -     2240, 2240, 2241, 2241, 2241, 2242, 2242, 2242, 2243, 2243, -     2243, 2245, 2245, 2245, 2246, 2246, 2246, 2247, 2247, 2247, - -     2249, 2249, 2249, 2250, 2250, 2250, 2251, 2251, 2251, 2252, -     2252, 2253, 2253, 2253, 2254, 2254, 2254, 2255, 2255, 2255, -     2257, 2257, 2257, 2258, 2258, 2258, 2259, 2259, 2259, 2261, -     2261, 2261, 2262, 2262, 2262, 2263, 2263, 2263, 2264, 2264, -     2265, 2265, 2265, 2266, 2266, 2266, 2267, 2267, 2267,   51, -      961,   51,   51,   51, 1865,  960, 1865, 1865, 2185, 2185, -     2187, 2187, 2277, 2277, 2278, 2278, 2279, 2279, 2280, 2280, -     2281, 2281, 2282, 2282, 2283, 2283, 2284, 2284, 2285, 2285, -     2286, 2286, 2288, 2288, 2289, 2289, 2290, 2290, 2291, 2291, -     2292, 2292, 2084, 2084, 2293, 2293, 2209, 2209, 2294, 2294, - -     2295, 2295, 2091, 2091, 2297, 2297, 2298, 2298, 2299, 2299, -     2300, 2300, 2196, 2196, 2302, 2302, 2303, 2303, 2304, 2304, -     2305, 2305, 2307, 2307, 2308, 2308, 2309, 2309, 2310, 2310, -     2311, 2311, 2312, 2312, 2313, 2313, 2315, 2315, 2316, 2316, -     2317, 2317, 2318, 2318, 2237, 2237, 2237, 2319, 2319, 2319, -     2320, 2320, 2320, 2240, 2240, 2233, 2233, 2233, 2321, 2321, -     2321, 2322, 2322, 2322, 2323, 2323, 2323, 2325, 2325, 2325, -     2326, 2326, 2326, 2327, 2327, 2327, 2328, 2328, 2329, 2329, -     2329, 2330, 2330, 2330, 2331, 2331, 2331, 2332, 2332, 2333, -     2333, 2333, 2334, 2334, 2334, 2335, 2335, 2335, 2337, 2337, - -     2337, 2338, 2338, 2338, 2339, 2339, 2339, 2340, 2340, 2341, -     2341, 2341, 2342, 2342, 2342, 2343, 2343, 2343, 2344, 2344, -     2345, 2345, 2345, 2346, 2346, 2346, 2347, 2347, 2347, 2349, -     2349, 2349, 2350, 2350, 2350, 2351, 2351, 2351, 2352, 2352, -       51,  959,   51,   51,   51, 1976,  958, 1976, 1976, 2279, -     2279, 2277, 2277, 2358, 2358, 2359, 2359, 2360, 2360, 2362, -     2362, 2363, 2363, 2364, 2364, 2365, 2365, 2366, 2366, 2367, -     2367, 2368, 2368, 2369, 2369, 2084, 2084, 2371, 2371, 2185, -     2185, 2372, 2372, 2298, 2298, 2373, 2373, 2374, 2374, 2282, -     2282, 2376, 2376, 2377, 2377, 2378, 2378, 2379, 2379, 2289, - -     2289, 2381, 2381, 2382, 2382, 2383, 2383, 2384, 2384, 2385, -     2385, 2387, 2387, 2388, 2388, 2389, 2389, 2390, 2390, 2391, -     2391, 2392, 2392, 2393, 2393, 2321, 2321, 2321, 2395, 2395, -     2395, 2325, 2325, 2325, 2396, 2396, 2396, 2397, 2397, 2397, -     2328, 2328, 2398, 2398, 2398, 2399, 2399, 2399, 2400, 2400, -     2400, 2402, 2402, 2402, 2403, 2403, 2403, 2404, 2404, 2404, -     2406, 2406, 2406, 2407, 2407, 2407, 2408, 2408, 2408, 2409, -     2409, 2410, 2410, 2410, 2411, 2411, 2411, 2412, 2412, 2412, -     2414, 2414, 2414, 2415, 2415, 2415, 2416, 2416, 2416, 2418, -     2418, 2418, 2419, 2419, 2419, 2420, 2420, 2420, 2421, 2421, - -     2422, 2422, 2422, 2423, 2423, 2423, 2424, 2424, 2424,   51, -      957,   51,   51,   51, 1981, 2829, 1981, 1981, 2363, 2363, -     2430, 2430, 2431, 2431, 2366, 2366, 2359, 2359, 2432, 2432, -     2433, 2433, 2434, 2434, 2436, 2436, 2437, 2437, 2438, 2438, -     2439, 2439, 2185, 2185, 2440, 2440, 2279, 2279, 2441, 2441, -     2377, 2377, 2442, 2442, 2443, 2443, 2364, 2364, 2445, 2445, -     2446, 2446, 2447, 2447, 2448, 2448, 2450, 2450, 2451, 2451, -     2452, 2452, 2453, 2453, 2454, 2454, 2455, 2455, 2456, 2456, -     2458, 2458, 2459, 2459, 2460, 2460, 2461, 2461, 2396, 2396, -     2396, 2398, 2398, 2398, 2462, 2462, 2462, 2463, 2463, 2463, - -     2464, 2464, 2464, 2465, 2465, 2465, 2466, 2466, 2467, 2467, -     2467, 2468, 2468, 2468, 2469, 2469, 2469, 2470, 2470, 2470, -     2471, 2471, 2471, 2473, 2473, 2473, 2474, 2474, 2474, 2475, -     2475, 2475, 2476, 2476, 2477, 2477, 2477, 2478, 2478, 2478, -     2479, 2479, 2479, 2480, 2480, 2481, 2481, 2481, 2482, 2482, -     2482, 2483, 2483, 2483, 2485, 2485, 2485, 2486, 2486, 2486, -     2487, 2487, 2487, 2488, 2488,   51,  130,   51,   51,   51, -     1977,  130, 1977, 1977, 2432, 2432, 2492, 2492, 2436, 2436, -     2493, 2493, 2494, 2494, 2439, 2439, 2495, 2495, 2496, 2496, -     2497, 2497, 2279, 2279, 2499, 2499, 2430, 2430, 2500, 2500, - -     2446, 2446, 2501, 2501, 2502, 2502, 2437, 2437, 2504, 2504, -     2505, 2505, 2506, 2506, 2507, 2507, 2508, 2508, 2510, 2510, -     2511, 2511, 2512, 2512, 2513, 2513, 2514, 2514, 2515, 2515, -     2516, 2516, 2464, 2464, 2464, 2462, 2462, 2462, 2518, 2518, -     2518, 2519, 2519, 2519, 2520, 2520, 2520, 2522, 2522, 2522, -     2523, 2523, 2523, 2524, 2524, 2524, 2525, 2525, 2525, 2526, -     2526, 2527, 2527, 2527, 2528, 2528, 2528, 2529, 2529, 2529, -     2531, 2531, 2531, 2532, 2532, 2532, 2533, 2533, 2533, 2535, -     2535, 2535, 2536, 2536, 2536, 2537, 2537, 2537, 2538, 2538, -     2539, 2539, 2539, 2540, 2540, 2540, 2541, 2541, 2541,   51, - -      130,   51,   51,   51, 2084,  923, 2084, 2084, 2493, 2493, -     2495, 2495, 2546, 2546, 2547, 2547, 2548, 2548, 2549, 2549, -     2550, 2550, 2430, 2430, 2551, 2551, 2552, 2552, 2505, 2505, -     2553, 2553, 2554, 2554, 2556, 2556, 2557, 2557, 2558, 2558, -     2559, 2559, 2560, 2560, 2561, 2561, 2563, 2563, 2564, 2564, -     2565, 2565, 2566, 2566, 2523, 2523, 2523, 2567, 2567, 2567, -     2568, 2568, 2568, 2526, 2526, 2519, 2519, 2519, 2569, 2569, -     2569, 2570, 2570, 2570, 2571, 2571, 2571, 2573, 2573, 2573, -     2574, 2574, 2574, 2575, 2575, 2575, 2576, 2576, 2577, 2577, -     2577, 2578, 2578, 2578, 2579, 2579, 2579, 2580, 2580, 2581, - -     2581, 2581, 2582, 2582, 2582, 2583, 2583, 2583, 2585, 2585, -     2585, 2586, 2586, 2586, 2587, 2587, 2587, 2588, 2588,   51, -      915,   51,   51,   51, 2086,  902, 2086, 2086, 2548, 2548, -     2546, 2546, 2592, 2592, 2593, 2593, 2594, 2594, 2493, 2493, -     2596, 2596, 2597, 2597, 2558, 2558, 2598, 2598, 2599, 2599, -     2601, 2601, 2602, 2602, 2603, 2603, 2604, 2604, 2605, 2605, -     2606, 2606, 2607, 2607, 2569, 2569, 2569, 2609, 2609, 2609, -     2573, 2573, 2573, 2610, 2610, 2610, 2611, 2611, 2611, 2576, -     2576, 2612, 2612, 2612, 2613, 2613, 2613, 2614, 2614, 2614, +        4,    5,    6,    7,    5,    4,    8,    9,    9,    4, +       10,   11,   11,   12,   12,   12,   13,   14,   15,   16, +       17,   18,   19,   20,   21,   22,   23,   24,   25,   26, +       27,   28,   29,   23,   30,   31,   32,   33,   23,   23, +       23,   23,    4,   34,   35,   35,   35,   35,   36,   23, +       23,   23,   23,   23,   23,   37,   38,   39,   23,   23, +       23,   23,   23,   23,   23,   23,   23,   40,   41, 2864, +     1329,   41,   44,   44,   44,   44,   44,   46, 2864,   47, +       47,   48,   48,   48,   49,   46, 1450,   48,   48,   48, +       48,   48,   49,   53,   53,   53,   53,   53,   49,   53, + +       53,   54,   53,   53,   53,   41,  361,   53,   41,   60, +       55,   64, 2864,   66, 2864,   65, 2864,  133,  176,  129, +     2864,   53,  692,   51,   61,   53,   53,   56,   57,   53, +       53,   62,  361,  371,  372,   55,   67,   63, 2864, 2864, +       68,   78,   69, 2864,  176, 2864, 2864,   82,  361,   58, +       53,   53,   53,   53,   53,   49,   53,   53,   53,   53, +       53,   53,   70, 2864, 2864, 2864,  176, 2864, 2864,   83, +       76, 2864,  105,   71,  106, 2864, 2864,   84,  813,   79, +       72,   77,   59,   53,   53,   53,   53,   53,   73, 2864, +     2864,  699,  689, 2864, 2864,   74,   80,   71, 2864,   90, + +       87, 1471,   81,   85,   75,  173, 2864, 2864,   86, 2864, +      718,   88, 2864,   91, 2864,   95,   89,   99, 2864, 2864, +       55,  113, 2864,   96, 2864,   90, 2864,  114,  695,   92, +     2864,  218,  107,   93,  116,   53,  108, 2864,   91,  100, +     2864,   95,   99,   99,  117,   55,  109,  110,   96,   94, +       97,  111,  101, 2864,  102,   71,  112,  103, 2864,   58, +       98,  138,   53,  104, 2864, 2864,   90,  115,   99, 2864, +       95,  144,  146,  118, 2864,  119, 2864,  147,   96,   71, +       91, 2864, 2864,  148,  133, 2864,   75,  138,  104,  142, +      226, 2864,   90, 2864,  137,  151,   95,   44,   44,   44, + +       44,   44,  150,   96, 2864,   91,  125,  125,  126,  126, +      126,  138, 2864, 2864,  145,   98,   94,  120,  133,  308, +      137,  104,  121,  133,  316, 2864,  248, 2864,   58,  399, +      122,  123,  732, 2864, 2864,   46,   75,  127,  127,  128, +      128,  128,  129,  120,  138, 2864, 2864,  104,  121, 1479, +      248,  693, 1197,   58,  248,  122,  123, 2864, 2864,   46, +       75,  128,  128,  128,  128,  128,  129,  124,  135,  135, +      135,  135,  135,  129,  135,  135,  135,  135,  135,  135, +     2864, 2864, 2864, 2864, 2864,  156, 2864,  153,  149,  152, +      155, 2864, 2864, 2864,  154, 2864, 2864, 2864, 2864,  166, + +      135,  135,  135,  135,  135,  135, 2864, 2864, 2864, 2864, +      167,  156, 2864, 2864, 2864,  175,  155,  168,  158, 2864, +     2864, 2864,  159,  161, 2864,  160, 2864, 2864,  698, 1450, +      156, 2864, 2864, 2864, 2864,  156,  162, 2864,  163,  165, +      172,  175, 2864, 2864, 2864,  164, 2864,  177,  170, 2864, +      169,  174,  171,  183, 2864,  180,  176, 2864, 2864, 2864, +      182, 2864, 2864,  176, 2864, 2864, 2864, 2864,  179,  186, +     2864,  177, 2864,  178, 2864, 2864, 2864, 2864,  178,  183, +     2864, 2864,  176, 2864,  185, 2864,  182, 2864,  388, 2864, +     2864, 2864, 2864,  186,  198, 1406,  190,  178,  183, 2864, + +     2864,  191,  186,  184,  181,  183,  187, 2864,  185,  192, +     2864,  188, 2864, 2864,  202,  194,  189,  186, 2864,  199, +      195,  200,  193,  206,  196, 2864,  197, 2864,  201,  203, +      208, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  204, +     2864, 2864, 2864,  205,  210,  207,  183, 2864, 2864,  209, +     2864, 2864, 2864, 2864,  178,  475, 2864,  215, 2864,  125, +      125,  126,  126,  126,  133, 2864, 1471,  818,  211, 1076, +      402,  215,  183,  126,  126,  126,  126,  126,  178,  710, +      712, 2864, 2864, 2864, 2864,  178, 2864, 2864, 2864,  212, +       46,  183,  216,  216,  217,  217,  217,  218, 2864,  138, + +      229,  176,  230,   46,  213,  217,  217,  217,  217,  217, +      218,  223,  224,  224,  224,  224,  186, 2864,  178, 2864, +     2864,  243, 2864,  242,  229,  138,  230,  176, 2864, 2864, +      213,  240, 2864,  230,  791,  230,  234, 2864, 2864, 2864, +      186, 2864,  178,  228, 2864, 2864, 2864, 1479,  236,  214, +      227,  227,  227,  227,  227,  218,  227,  227,  227,  227, +      227,  227, 2864, 2864,  239, 2864,  237,  246, 2864,  247, +     2864, 2864,  241, 2864, 2864,  245, 2864, 2864,  244, 2864, +     2864, 2864,  227,  227,  227,  227,  227,  227, 2864, 2864, +     2864, 2864, 2864,  247, 2864, 2864, 2864,  248,  249,  255, + +      256, 2864, 2864,  251, 2864,  252,  250, 2864, 2864,  260, +      264,  254,  258, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +      257,  253,  261,  269, 2864, 2864, 1300, 2864, 2864,  268, +      259, 2864, 2864, 2864,  132,  133, 2864, 2864,  262, 2864, +     2864,  271, 2864,  263, 2864, 2864,  266, 2864,  269,  133, +      133,  265, 2864, 2864,  268, 2864,  272,  270, 2864, 2864, +      269,  267,  277,  269,  273,  271, 2864,  271, 2864,  269, +     2864,  275, 2864, 2864,  271, 2864, 2864,  281,  278, 2864, +      283,  270, 2864, 2864, 2864,  269,  277, 2864, 2864, 2864, +      271,  271,  276, 2864,  277, 2864, 2864, 2864, 2864, 2864, + +      274,  284, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  279, +      286, 2864,  291, 2864, 2864,  289,  276, 2864,  298,  280, +      282,  285, 2864, 2864,  277, 2864, 2864, 2864,  288,  297, +     2864, 2864,  292, 2864, 2864,  290,  287,  295,  294, 2864, +     2864,  300,  296,  428, 2864,  299,  293, 2864, 2864,  248, +     2864,  883, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +      803,  697, 2864,  269, 2864, 2864,  429,  301, 2864, 2864, +      302,  277,  820,  248,  430,  248, 2864,  248,  304,  304, +      305,  305,  305,  223,  224,  224,  224,  224,  269,  224, +      224,  224,  224,  224,  302,  277, 2864, 2864, 2864,  248, + +      691,  133,   46,  303,  306,  306,  307,  307,  307,  308, +       46,  320,  307,  307,  307,  307,  307,  308,  318,  318, +      318,  318,  318,  308,  318,  318,  318,  318,  318,  318, +     2864,  319,  321, 2864,  324, 2864,  320, 2864,  325, 2864, +     2864, 2864, 2864, 2864,  333, 2864, 2864, 2864, 2864,  321, +      318,  318,  318,  318,  318,  318, 2864,  321, 2864, 2864, +     2864,  323, 2864, 2864, 2864, 2864,  326,  133,  133,  882, +      321,  332, 2864,  327,  328,  336, 2864, 2864, 2864, 2864, +     2864, 2864, 2864,  331, 2864, 2864, 2864,  334, 2864,  330, +     2864, 2864, 2864, 2864, 2864,  339, 2864, 2864,  344,  338, + +      335, 2864,  340,  345,  341, 2864,  349, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864,  348,  342,  346, 2864, +      347, 2864, 2864, 2864,  343,  352,  350, 2864, 2864, 2864, +     2864, 2864,  351, 2864, 2864,  356, 2864, 2864,  357, 2864, +     2864, 2864,  357,  353, 2864, 2864, 2864,  355, 2864, 2864, +     2864, 2864, 2864, 1294,  360, 2864, 2864,  133, 2864, 2864, +     2864,  356, 2864, 2864,  357, 2864,  354,  362,  357, 2864, +     2864, 2864, 2864, 2864,  358, 2864, 2864, 2864, 2864,  700, +      360,  365, 2864, 2864,  359,  357,  367, 2864,  357, 2864, +     2864, 2864,  357,  363,  727, 2864,  361, 2864,  364, 2864, + +     2864, 2864, 2864, 2864,  369,  366, 2864,  373,  368, 2864, +      370, 2864, 2864,  375, 2864,  374, 2864,  378,  376, 2864, +     2864,  431, 2864,  379,  380,  357, 2864, 2864, 2864, 2864, +      377, 2864, 2864, 2864, 2864,  357,  450,  321, 2864, 2864, +     2864, 2864,  133,  361,  432,  381,  562,  321,  489, 2864, +      133,  357,  433,  133, 2864, 1526,  492,  382,  133,  492, +      450,  357,  321, 2864,  581, 2864, 1527,  133,  450,  361, +     2864,  404,  321,  584,  385,  383,  304,  304,  305,  305, +      305, 2864, 2864, 2864,  385,  384,  305,  305,  305,  305, +      305,   46,  406,  386,  386,  387,  387,  387,  388,   46, + +     2864,  387,  387,  387,  387,  387,  388,  403,  403,  403, +      403,  403,  388,  403,  403,  403,  403,  403,  403, 2864, +     2864, 2864, 2864, 2864,  408,  405, 2864, 2864, 2864, 2864, +      415, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  403, +      403,  403,  403,  403,  403,  418,  409,  410,  419, 2864, +      411, 2864, 2864, 2864, 1301, 2864, 2864, 2864,  420,  407, +      414, 2864,  425, 2864,  412,  992,  413,  438,  416, 2864, +     2864, 2864, 2864, 2864, 2864,  417, 2864, 2864, 2864, 2864, +      421, 2864, 2864,  423, 2864, 2864, 2864, 2864, 2864, 2864, +      426,  427,  434,  424,  436,  435, 2864,  446,  444, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864,  445, 2864,  439,  440,  442,  443, 2864, +     2864, 2864, 2864,  446,  449, 2864, 2864, 2864, 2864, 2864, +     2864,  454, 2864,  441, 2864, 2864, 2864, 2864, 2864,  445, +      447, 2864,  448, 2864,  452,  446, 2864, 2864,  449,  457, +     2864, 2864, 2864,  451, 2864,  453,  450,  455,  725,  458, +     2864,  446, 2864,  463,  456,  459,  876,  446, 2864, 2864, +      462, 2864, 2864, 2864,  466,  653, 2864, 2864, 2864, 2864, +     2864, 2864,  464,  465,  469, 2864, 2864, 2864, 2864, 2864, +      467,  446, 2864,  446, 2864,  471,  471,  472,  472,  472, + +      896, 2864, 2864, 2864, 2864, 2864,   46,  450,  473,  473, +      474,  474,  474,  475, 2864,  446, 2864,  446, 2864,   46, +     2864,  474,  474,  474,  474,  474,  475, 2864, 2864, 2864, +     2864,  450, 2864,  496,  498, 2864, 2864, 2864, 2864,  470, +      495,  495,  495,  495,  495,  475,  495,  495,  495,  495, +      495,  495, 2864,  500, 2864, 2864,  503,  497,  501,  505, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  507, 2864, +      508,  504,  495,  495,  495,  495,  495,  495, 2864, 2864, +      502,  506,  510, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +      511, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864,  133,  133,  513, 2864,  509,  538,  584,  584, 2864, +     2864, 2864, 2864, 2864, 2864, 2864,  522, 2864,  527,  524, +      523, 2864,  514, 2864,  532,  530,  529,  534,  525, 2864, +      538,  528,  533, 2864, 2864, 2864, 2864,  538,  531, 2864, +      535,  515, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864,  534,  536,  537, 2864, 2864,  533,  539, 2864, +     2864, 2864, 2864,  541, 2864, 2864,  547,  534, 2864, 2864, +     2864,  553,  534, 2864, 2864,  543, 2864,  540,  537, 2864, +     2864,  548, 2864,  554, 2864,  538,  133, 2864, 2864,  546, +     2864,  542,  589,  544,  559,  471,  471,  472,  472,  472, + +     2864,  552,  545,  555,  132,  551,  557, 2864,  133,  534, +     2864, 2864, 1538, 2864,  677, 2864, 2864,  133,  538, 2864, +     2864, 2864,  133,  581, 2864, 2864,  788, 2864,  581,  729, +     2864, 2864, 2864, 2864,  534,  559,  472,  472,  472,  472, +      472,   46,  538,  560,  560,  561,  561,  561,  562,  558, +       46, 2864,  561,  561,  561,  561,  561,  562,  590,  590, +      590,  590,  590,  562,  590,  590,  590,  590,  590,  590, +      593,  591, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864,  599, 2864, 2864, 1538,  600, 2864, +      590,  590,  590,  590,  590,  590, 2864,  598, 2864,  601, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864,  594,  621,  596, +     2864,  595,  602, 2864, 2864, 2864,  603,  132,  597, 2864, +      607,  133,  604, 2864, 2864, 2864, 2864,  581, 2864, 2864, +     2864, 2864, 2864,  606,  616,  620, 2864, 2864,  614, 2864, +     2864,  619,  615,  617,  623, 2864,  624, 2864,  629, 2864, +      628, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  622, +      625, 2864,  630,  626, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864,  627,  629, 2864,  628, 2864, 2864, 2864, +     2864, 2864, 2864,  133, 2864, 2864,  133, 2864,  631,  684, +     2864,  635,  581, 2864,  629,  645,  629,  133, 2864,  636, + +      634,  133, 2864,  684,  632,  133,  633,  766,  629, 2864, +     2864,  769,  642,  643,  648, 1534,  814,  714, 2864, 2864, +     2864,  637, 2864, 2864,  638,  639, 2864,  646, 2864,  644, +     2864, 2864, 2864, 2864,  629, 2864, 2864,  694, 2864,  649, +      649,  650,  650,  650,   46,  701,  651,  651,  652,  652, +      652,  653, 2864,   46,  629,  652,  652,  652,  652,  652, +      653,  688,  688,  688,  688,  688,  653,  688,  688,  688, +      688,  688,  688, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864,  721, 2864, 2864, 2864, 2864, 2864,  649,  649, +      650,  650,  650,  688,  688,  688,  688,  688,  688,  715, + +      696,  720, 2864, 2864, 2864, 2864,  711,  721, 2864, 1538, +      133,  737,  722, 2864,  709,  726,  677,  702, 1545,  721, +      724,  713,  716,  719,  717,  133,  720,  723,  133, 1538, +      730,  677,  782,  728,  773,  731,  734,  897,  721,  650, +      650,  650,  650,  650,   46, 2864,  735,  735,  736,  736, +      736,  737,   46, 2864,  736,  736,  736,  736,  736,  737, +      133,  133,  133,  133,  133, 2864,  677,  773,  769,  773, +      780,  781,  781,  781,  781,  781,  737,  781,  781,  781, +      781,  781,  781, 2864,  785,  784, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864,  786, 2864, 2864, 2864, + +     2864, 2864, 2864,  781,  781,  781,  781,  781,  781, 2864, +     2864,  811, 2864, 2864, 2864, 2864,  793, 2864,  810,  792, +     2864,  823,  133,  802, 1429,  787,  804,  912,  856,  807, +      789,  790,  794,  805,  801,  806, 2864,  874, 1549,  812, +      808,  809,  811,  815,  816,  819,  817,  893,   46,  811, +      821,  821,  822,  822,  822,  823,   46,  877,  822,  822, +      822,  822,  822,  823,  133,  133,  133,  133,  133,  133, +      859,  859,  766,  766,  769,  859,  133,  133,  133,  133, +      133,  875,  769,  868,  859,  769,  868,  873,  873,  873, +      873,  873,  823,  873,  873,  873,  873,  873,  873, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  873, +      873,  873,  873,  873,  873, 2864, 2864, 2864, 2864,  133, +      133,  879,  880,  881, 2864,  950,  953,  894, 1538,  878, +      895,  898, 1429,  885,  903,  892,  899,  884,  905,  904, +      974, 2864,  900, 1004, 1407,  133,  901,  902,  906,  908, +      907,  953,  973, 1549,  132,  980,   46,  909,  910,  910, +      911,  911,  911,  912,   46, 2864,  911,  911,  911,  911, +      911,  912,  133,  133,  133,  133,  133,  133,  953,  958, +      953,  859,  962,  953,  133,  133,  133,  133,  133,  133, + +      859,  962,  953,  958,  962,  970,  971,  971,  971,  971, +      971,  912,  971,  971,  971,  971,  971,  971, 2864, 2864, +     2864, 2864, 2864, 2864, 2864,  972, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864,  971,  971, +      971,  971,  971,  971, 2864,  982, 2864, 2864, 2864, 2864, +     2864,  133,  133,  989, 1001, 1007,  981, 1049,  950,  991, +      977, 1538,  990,  975,  978,  979,  993,  994,  976,  998, +     1545, 1549, 1557,  995,  996,  997, 1000,  999, 1002, 1095, +     1073, 1429, 1549, 2864, 1438,   46, 1003, 1005, 1005, 1006, +     1006, 1006, 1007,   46, 1075, 1006, 1006, 1006, 1006, 1006, + +     1007,  133,  133,  133,  133,  133,  133,  950,  950, 1056, +      950, 1056,  950,  133,  133,  133,  133,  133,  133,  953, +      958,  950, 1056,  958, 1067,  133,  133,  133, 1077, 2864, +     2864, 1056,  958, 1067, 1072, 1072, 1072, 1072, 1072, 1007, +     1072, 1072, 1072, 1072, 1072, 1072, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 1072, 1072, 1072, 1072, +     1072, 1072, 1074, 2864, 2864, 2864, 2864,  133, 1082, 1097, +     1088, 1104, 1100, 1151, 1090, 1078, 1079, 1080, 1091, 1081, +     1087, 1099, 1180, 1096, 1089, 1193, 1092, 1098, 1093, 1561, + +     1201, 1094, 1101,   46, 1179, 1102, 1102, 1103, 1103, 1103, +     1104,   46, 1191, 1103, 1103, 1103, 1103, 1103, 1104,  133, +      133,  133,  133,  133,  133, 1154, 1049, 1049, 1158, 1049, +     1158,  133,  133,  133,  133,  133,  133, 1154, 1158, 1165, +     1049, 1158, 1056,  133,  133,  133,  133,  133,  133, 1169, +     1158, 1056, 1169, 1158, 1165,  133,  133, 2864, 2864, 2864, +     2864, 1169, 1177, 1178, 1178, 1178, 1178, 1178, 1104, 1178, +     1178, 1178, 1178, 1178, 1178, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 1192, 2864, 1182, 1183, 2864, 2864, 2864, +     2864, 2864, 2864, 1184, 2864, 1178, 1178, 1178, 1178, 1178, + +     1178, 1181,   46, 1196, 1206, 1206, 1207, 1207, 1207, 1208, +     2864, 2864, 1199, 1549, 1185, 1186, 1438, 1208, 1314, 1198, +     1203, 1522, 1194, 1195, 1205, 1204, 1561, 1200, 1291, 1292, +      132,   46, 1202, 1207, 1207, 1207, 1207, 1207, 1208,  133, +      133,  133,  133,  133,  133, 1259, 1262, 1262, 1151, 1151, +     1154,  133,  133,  133,  133,  133,  133, 1262, 1154, 1271, +     1262, 1154, 1271,  133,  133,  133,  133,  133,  133, 1154, +     1158, 1165, 1154, 1271, 1165,  133,  133,  133,  133, 2864, +     2864, 1283, 1271, 1165, 1283, 1288, 1288, 1288, 1288, 1288, +     1208, 1288, 1288, 1288, 1288, 1288, 1288, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +      133, 2864, 2864, 2864, 2864, 2864, 1370, 1288, 1288, 1288, +     1288, 1288, 1288, 1290, 1289, 1304,  133, 1295,  133, 1549, +     2864, 1557, 1373, 1303, 1373, 1299, 1302, 1308,  133, 1298, +     1561, 1293,  133, 1306, 1373, 1305, 1311,  133, 1378, 1408, +     1309,  133, 1525, 1373, 1412, 1307, 1405, 1262,   46, 1310, +     1312, 1312, 1313, 1313, 1313, 1314,   46, 1417, 1313, 1313, +     1313, 1313, 1313, 1314,  133,  133,  133,  133,  133,  133, +     1382, 1373, 1262, 1382, 1373, 1378,  133,  133,  133,  133, +      133,  133, 1382, 1390, 1262, 1382, 1271, 1394,  133,  133, + +      133,  133,  133,  133, 1382, 1271, 1394, 1382, 1390, 1394, +      133, 2864, 2864, 2864, 2864, 2864, 1402, 1403, 1403, 1403, +     1403, 1403, 1314, 1403, 1403, 1403, 1403, 1403, 1403, 2864, +     2864, 2864, 2864, 2864, 2864,   46, 2864, 1423, 1423, 1424, +     1424, 1424, 1425, 1425, 1404, 1569, 2864, 1409, 2864, 1403, +     1403, 1403, 1403, 1403, 1403, 1538,  133, 1571,  132, 1414, +     1415, 1418, 1485, 1413, 1420, 1421,  133,  133, 1571,  133, +      133, 1422, 1370, 1370, 1419, 1370, 1492, 1528,   46, 1416, +     1424, 1424, 1424, 1424, 1424, 1425,  133,  133,  133,  133, +      133,  133, 1370, 1492, 1370, 1373, 1378, 1370,  133,  133, + +      133,  133,  133,  133, 1492, 1378, 1503, 1492, 1378, 1503, +      133,  133,  133,  133,  133,  133, 1378, 1382, 1390, 1378, +     1503, 1390,  133,  133,  133,  133, 2864, 2864, 1515, 1503, +     1390, 1515, 1520, 1520, 1520, 1520, 1520, 1425, 1520, 1520, +     1520, 1520, 1520, 1520, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 1575, 1571, 1575, 1523,  132, 1575, 1580, 1575, 1580, +     1521,  132, 1580, 1585, 1520, 1520, 1520, 1520, 1520, 1520, +     1580, 1524, 1585,  132, 1438, 1561, 1585, 1529, 1530, 1531, +     1591, 1561, 1532, 1535,   46, 1585, 1536, 1536, 1537, 1537, +     1537, 1538, 1533,   46, 1591, 1537, 1537, 1537, 1537, 1537, + +     1538,  132, 1561, 1569, 1591, 1599,  133,  133,  133,  133, +      133,  133, 1601,  133, 1604, 1485, 1485, 1608,  133, 1485, +      133,  133,  133,  133, 1608,  133,  133, 1604, 1608, 1615, +      133, 1485, 1608,  133,  133,  133, 1492,  133,  133, 1619, +     1608, 1492,  133, 1619,  133,  133,  133,  133, 1608,  133, +     1615, 1619, 1627, 1492,  133, 1619,  133,  133,  133,  133, +     1503,  133, 1631, 1619, 1503, 1631,  133,  133,  133,  133, +     2864, 2864, 1619, 1627, 1631, 1639, 1640, 1640, 1640, 1640, +     1640, 1538, 1640, 1640, 1640, 1640, 1640, 1640, 2864, 2864, +     2864, 1645, 1646, 2864, 2864, 2864, 2864, 2864, 2864,  132, + +     2864, 2864, 2864, 1538, 1641, 1538, 1659, 1538, 1640, 1640, +     1640, 1640, 1640, 1640, 1649, 1538, 1659, 1642, 1643,  132, +     1538, 1538, 1545, 1650,  132, 1644, 1647, 1648,   46, 1652, +     1653, 1653, 1654, 1654, 1654, 1538,   46, 1538, 1654, 1654, +     1654, 1654, 1654, 1538, 1659, 1545, 1651, 1670, 1659, 1545, +     1670,  132, 1545, 1549, 1557,  132, 1545, 1670, 1557, 1682, +     1670, 1557, 1682,  132, 1688,  132, 1691, 1688, 1691,  132, +     1691, 1696, 1691, 1696,  132, 1696, 1701, 1696, 1701,  132, +     1701, 1706, 1557, 1701, 1706,  132, 1557, 1682, 1706, 1714, +     1682, 1706, 1714,  132,  133,  133,  133,  133,  133,  133, + +     1720,  133, 1723, 1723,  133, 1601,  133, 1601,  133,  133, +     1604,  133,  133,  133, 1723, 1604,  133, 1732, 1723, 1604, +      133,  133, 1732,  133,  133,  133,  133, 1604,  133, 1608, +     1615,  133, 1604,  133, 1732,  133,  133, 1615,  133, 1744, +      133, 1732, 1615,  133, 1744,  133,  133,  133,  133, 1615, +      133, 1619, 1627,  133, 1615,  133, 1744,  133,  133, 1627, +      133, 1756,  133, 1744, 1627, 2864, 1756, 1761, 1761, 1761, +     1761, 1761, 1538, 1761, 1761, 1761, 1761, 1761, 1761, 2864, +     2864, 2864, 1766, 1767, 2864, 2864, 2864, 2864, 2864, 1538, +     2864, 2864, 1659,  132, 1659, 1538, 1762, 1659, 1782, 1761, + +     1761, 1761, 1761, 1761, 1761,   46, 1659, 1774, 1774, 1775, +     1775, 1775, 1538, 1763, 1764, 1768, 1769, 1770, 1659, 1771, +     2864, 2864, 1786, 1659, 1659, 1765, 1772, 1538, 1538, 1786, +      132, 1659, 1782,   46, 1773, 1775, 1775, 1775, 1775, 1775, +     1538, 1786, 1794, 1659, 1786, 1670, 1798, 1786, 1670, 1798, +      132, 1786, 1794, 1798, 1806, 1807,  132, 1810, 1810,  132, +     1810, 1815, 1810, 1815,  132, 1815, 1820, 1815, 1820,  132, +     1820, 1825, 1820, 1825,  132, 1670, 1798, 1825, 1831, 1798, +     1825, 1831,  132, 1798, 1806, 1831, 1839,  133,  133,  133, +      133,  133,  133, 1841,  133, 1841, 1841,  133, 1841,  133, + +     1847,  133,  133, 1841,  133, 1723,  133, 1851, 1841,  133, +     1723,  133, 1851,  133,  133,  133,  133, 1841,  133, 1847, +     1851, 1859, 1723,  133, 1851,  133,  133,  133,  133, 1732, +      133, 1863, 1851, 1732, 1863,  133,  133,  133,  133,  133, +      133, 1851, 1859, 1863, 1871, 1732, 1863,  133,  133,  133, +      133,  133,  133, 1744, 1875, 1863, 1744, 1875,  133,  133, +      133,  133, 2864, 2864, 1863, 1871, 1875, 1883, 1884, 1884, +     1884, 1884, 1884, 1538, 1884, 1884, 1884, 1884, 1884, 1884, +     2864, 2864, 1888, 1889, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 1659, 1659, 1886, 1659, 1659, 1895, 1538, 1782,  132, + +     1884, 1884, 1884, 1884, 1884, 1884, 1885, 1659, 1659, 1782, +      132, 1887, 1659, 1782, 1782, 1908,   46, 1894, 1896, 1896, +     1897, 1897, 1897, 1538, 1893, 1782, 1890, 1891, 1782, 1908, +      132, 1782, 1786,   46, 1892, 1897, 1897, 1897, 1897, 1897, +     1538, 1794,  132, 1782, 1908, 1794, 1920, 1908, 1794, 1920, +      132,  132, 1926, 1926,  132, 1926, 1931, 1926, 1931,  132, +     1931, 1936, 1931, 1936,  132, 1936, 1941, 1936, 1941,  132, +     1941, 1946, 1794, 1941, 1946,  132, 1794, 1920, 1946, 1954, +     1920, 1946, 1954,  132,  133,  133,  133,  133,  133,  133, +     1841,  133, 1841, 1841, 1963, 1841,  133, 1963,  133,  133, + +      133,  133,  133,  133, 1841, 1841, 1847,  133, 1841, 1963, +      133,  133,  133, 1847,  133,  133, 1974, 1963, 1847,  133, +     1974,  133,  133,  133,  133, 1847,  133, 1851, 1859,  133, +     1847,  133, 1974,  133,  133, 1859,  133, 1986,  133, 1974, +     1859,  133, 1986,  133,  133,  133,  133, 1859,  133, 1863, +     1871,  133, 1859,  133, 1986,  133,  133, 1871,  133, 1998, +      133, 1986, 1871, 2864, 1998, 2003, 2003, 2003, 2003, 2003, +     1538, 2003, 2003, 2003, 2003, 2003, 2003, 2864, 2864, 2004, +     2005, 2864, 2864, 2864, 2864, 2864, 2864, 1659, 1659,   46, +     2006, 2009, 2009, 2010, 2010, 2010, 1659, 2003, 2003, 2003, + +     2003, 2003, 2003,   46, 1782, 2010, 2010, 2010, 2010, 2010, +     1659, 1782, 2014, 1782, 1782, 2007, 1782, 1782, 2014,  132, +     1782, 2014, 2014, 2023, 1782, 2014, 1908, 2027, 2008, 2014, +     1908, 2027,  132, 2014, 2023, 2027, 2035, 1926,  132, 1926, +     2039, 1926, 2039,  132, 2039, 2044, 2039, 2044,  132, 2044, +     2049, 2044, 2049,  132, 2049, 2054, 2049, 2054,  132, 1908, +     2027, 2054, 2060, 2027, 2054, 2060,  132, 2027, 2035, 2060, +     2068,  133,  133,  133,  133,  133,  133, 1841, 1841, 1841, +     1963,  133, 1963,  133,  133,  133,  133, 1963,  133, 2075, +     1841, 1963, 1963,  133, 2079,  133,  133,  133,  133, 1963, + +      133, 1963, 2079,  133, 1963,  133, 2075,  133,  133, 2079, +      133, 2087,  133, 1963, 2079,  133, 1974,  133, 2091,  133, +      133, 2079,  133, 1974,  133, 2091,  133,  133, 2079,  133, +     2087,  133, 2091, 2099,  133, 1974,  133, 2091,  133,  133, +     1986,  133, 2103,  133, 2091, 1986,  133, 2103,  133,  133, +      133, 2113, 2091, 2114, 2099, 2103, 2111, 2112, 2112, 2112, +     2112, 2112, 1659, 2112, 2112, 2112, 2112, 2112, 2112, 2864, +     2864,   46, 2864, 2117, 2117, 2118, 2118, 2118, 1659,   46, +     1782, 2118, 2118, 2118, 2118, 2118, 1659, 1782, 2014, 2112, +     2112, 2112, 2112, 2112, 2112,  132, 1782, 1782, 2014, 2014, + +     2124, 2014, 2014, 2124,  132, 2014, 2014, 2023,  132, 2014, +     2124, 2115, 2116, 2023, 2136, 2124, 2023, 2136,  132, 1926, +     1926, 2039,  132, 2039, 2145, 2039, 2145,  132, 2145, 2150, +     2145, 2150,  132, 2150, 2155, 2150, 2155,  132, 2155, 2160, +     2023, 2155, 2160,  132, 2023, 2136, 2160, 2168, 2136, 2160, +     2168,  132,  133,  133,  133,  133,  133,  133, 1841, 1963, +     1963, 1963, 1963, 2075,  133,  133,  133,  133,  133,  133, +      133, 1963, 1963, 2075,  133, 1963, 2075,  133,  133,  133, +     2075,  133,  133, 2183, 2075, 2075,  133, 2183,  133,  133, +      133,  133, 2075,  133, 2079, 2087,  133, 2075,  133, 2183, + +      133,  133, 2087,  133, 2195,  133, 2183, 2087,  133, 2195, +      133,  133,  133,  133, 2087,  133, 2091, 2099,  133, 2087, +      133, 2195,  133,  133, 2099,  133, 2207,  133, 2195, 2099, +     2213, 2207, 2212, 2212, 2212, 2212, 2212, 1659, 2212, 2212, +     2212, 2212, 2212, 2212, 2214, 2864, 2864,   46, 2014, 2217, +     2217, 2218, 2218, 2218, 1659,   46, 2014, 2218, 2218, 2218, +     2218, 2218, 1659, 2014, 2212, 2212, 2212, 2212, 2212, 2212, +     2014, 2124,  132, 2014, 2124, 2124, 2225, 2014, 2124, 2124, +     2229, 2124, 2124, 2229,  132, 2215, 2124, 2225, 2229, 2237, +     1926, 2039, 2039, 2216, 2145,  132, 2145, 2242, 2145, 2242, + +      132, 2242, 2247, 2242, 2247,  132, 2247, 2252, 2247, 2252, +      132, 2124, 2229, 2252, 2258, 2229, 2252, 2258,  132, 2229, +     2237, 2258, 2266,  133,  133,  133,  133,  133,  133, 1963, +     1963, 2075, 2075, 2270, 2075,  133,  133,  133,  133,  133, +      133, 2075, 2075, 2075, 2270,  133, 2075,  133,  133,  133, +      133, 2270,  133, 2270, 2279, 2075, 2270,  133, 2183,  133, +      133,  133,  133, 2283,  133, 2270, 2183, 2283,  133,  133, +     2270,  133,  133,  133, 2279, 2283,  133, 2291, 2183, 2283, +      133,  133, 2195,  133,  133,  133, 2295, 2283,  133, 2195, +     2295,  133,  133,  133, 2283, 2305, 2306, 2291, 2295, 2303, + +     2304, 2304, 2304, 2304, 2304, 1659, 2304, 2304, 2304, 2304, +     2304, 2304, 2864, 2864,   46, 2014, 2310, 2310, 2311, 2311, +     2311, 1659,   46, 2124, 2311, 2311, 2311, 2311, 2311, 1659, +     2124, 2124, 2304, 2304, 2304, 2304, 2304, 2304, 2124, 2225, +      132, 2124, 2124, 2225,  132, 2124, 2225, 2225, 2322, 2225, +     2225, 2322, 2308,  132, 2864, 2145, 2145, 2309, 2242, 2307, +      132, 2039, 2242, 2331, 2242, 2331,  132, 2331, 2336, 2331, +     2336,  132, 2336, 2341, 2225, 2336, 2341,  132, 2225, 2322, +     2341, 2349, 2322, 2341, 2349,  132,  133,  133,  133,  133, +      133,  133, 2075, 2075, 2270,  133, 2075, 2075,  133,  133, + +      133, 2270,  133,  133, 2270, 2359, 2270,  133, 2270, 2359, +      133,  133,  133,  133,  133,  133, 2270, 2270, 2279,  133, +     2270, 2359,  133,  133,  133, 2279,  133,  133, 2371, 2359, +     2279,  133, 2371,  133,  133,  133,  133, 2279,  133, 2283, +     2291,  133, 2279,  133, 2371,  133,  133, 2291,  133, 2383, +      133, 2371, 2291, 2864, 2383, 2388, 2388, 2388, 2388, 2388, +     1659, 2388, 2388, 2388, 2388, 2388, 2388, 2864, 2864,   46, +     2124, 2391, 2391, 2392, 2392, 2392, 1782,   46, 2124, 2392, +     2392, 2392, 2392, 2392, 1782, 2225, 2225, 2388, 2388, 2388, +     2388, 2388, 2388, 2396, 2225, 2225, 2225, 2389, 2225, 2396, + +      132, 2225, 2390, 2396, 2396, 2405, 2145, 2242, 2242, 2331, +      132, 2331, 2410, 2331, 2410,  132, 2410, 2415, 2410, 2415, +      132, 2225, 2396, 2415, 2421, 2396, 2415, 2421,  132, 2396, +     2405, 2421, 2429,  133,  133,  133,  133,  133,  133, 2270, +     2270, 2270, 2270, 2359,  133,  133,  133,  133,  133,  133, +     2270, 2359, 2359, 2436, 2270, 2359,  133,  133,  133,  133, +      133,  133, 2359, 2440, 2359, 2359, 2440,  133,  133,  133, +      133,  133,  133, 2359, 2436, 2440, 2448, 2359, 2440,  133, +      133,  133,  133,  133,  133, 2371, 2452, 2440, 2371, 2452, +      133,  133,  133,  133, 2864, 2864, 2440, 2448, 2452, 2460, + +     2461, 2461, 2461, 2461, 2461, 1782, 2461, 2461, 2461, 2461, +     2461, 2461,   46, 2225, 2463, 2463, 2464, 2464, 2464, 1782, +       46, 2225, 2464, 2464, 2464, 2464, 2464, 1782, 2462, 2396, +      132, 2225, 2461, 2461, 2461, 2461, 2461, 2461, 2225, 2396, +     2396, 2470, 2396, 2396, 2470,  132, 2242, 2331, 2331, 2410, +      132, 2410, 2479, 2410, 2479,  132, 2479, 2484, 2396, 2479, +     2484,  132, 2396, 2470, 2484, 2492, 2470, 2484, 2492,  132, +      133,  133,  133,  133,  133,  133, 2270, 2359, 2359, 2359, +     2359, 2436,  133,  133,  133,  133,  133,  133,  133, 2359, +     2359, 2436,  133, 2359, 2436,  133,  133,  133, 2436,  133, + +      133, 2507, 2436, 2436,  133, 2507,  133,  133,  133,  133, +     2436,  133, 2440, 2448,  133, 2436,  133, 2507,  133,  133, +     2448,  133, 2519,  133, 2507, 2448, 2864, 2519, 2524, 2524, +     2524, 2524, 2524, 1782, 2524, 2524, 2524, 2524, 2524, 2524, +       46, 2396, 2525, 2525, 2526, 2526, 2526, 1782,   46, 2396, +     2526, 2526, 2526, 2526, 2526, 1782, 2396, 2396, 2470,  132, +     2524, 2524, 2524, 2524, 2524, 2524, 2396, 2470, 2470, 2533, +     2331, 2410, 2410, 2479,  132, 2479, 2538, 2479, 2538,  132, +     2396, 2470, 2538, 2544, 2470, 2538, 2544,  132, 2470, 2533, +     2544, 2552,  133,  133,  133,  133,  133,  133, 2359, 2359, + +     2436, 2436, 2556, 2436,  133,  133,  133,  133,  133,  133, +     2436, 2436, 2436, 2556,  133, 2436,  133,  133,  133,  133, +     2556,  133, 2556, 2565, 2436, 2556,  133, 2507,  133,  133, +      133,  133, 2569,  133, 2556, 2507, 2569,  133,  133, 2556, +      133, 2396, 2470, 2565, 2569, 2470, 2577, 2578, 2578, 2578, +     2578, 2578, 1782, 2578, 2578, 2578, 2578, 2578, 2578,   46, +     2470, 2579, 2579, 2580, 2580, 2580, 1782,   46, 2470, 2580, +     2580, 2580, 2580, 2580, 1782, 2533,  132, 2410, 2479, 2578, +     2578, 2578, 2578, 2578, 2578, 2479, 2538,  132, 2538, 2590, +     2470, 2538, 2590,  132, 2470, 2533, 2590, 2597, 2533, 2590, + +     2597,  132,  133,  133,  133,  133,  133,  133, 2436, 2436, +     2556,  133, 2436, 2436,  133,  133,  133, 2556,  133,  133, +     2556, 2607, 2556,  133, 2556, 2607,  133,  133,  133,  133, +      133,  133, 2556, 2556, 2565,  133, 2556, 2607,  133,  133, +      133, 2565,  133,  133, 2619, 2607, 2565, 2470, 2619, 2624, +     2624, 2624, 2624, 2624, 1782, 2624, 2624, 2624, 2624, 2624, +     2624,   46, 2470, 2625, 2625, 2626, 2626, 2626, 2014,   46, +     2533, 2626, 2626, 2626, 2626, 2626, 2014, 2533, 2630, 2479, +     2538, 2624, 2624, 2624, 2624, 2624, 2624, 2538, 2590,  132, +     2533, 2590, 2635, 2533, 2590, 2635,  132, 2533, 2630, 2635, + +     2643,  133,  133,  133,  133,  133,  133, 2556, 2556, 2556, +     2556, 2607,  133,  133,  133,  133,  133,  133, 2556, 2607, +     2607, 2650, 2556, 2607,  133,  133,  133,  133,  133,  133, +     2607, 2654, 2607, 2607, 2654,  133,  133,  133,  133, 2533, +     2533, 2607, 2650, 2654, 2662, 2663, 2663, 2663, 2663, 2663, +     2014, 2663, 2663, 2663, 2663, 2663, 2663,   46, 2630, 2664, +     2664, 2665, 2665, 2665, 2014,   46,  132, 2665, 2665, 2665, +     2665, 2665, 2014, 2538, 2590, 2590, 2635, 2663, 2663, 2663, +     2663, 2663, 2663,  132, 2533, 2630, 2635, 2674, 2630, 2635, +     2674,  132,  133,  133,  133,  133,  133,  133, 2556, 2607, + +     2607, 2607, 2607, 2650,  133,  133,  133,  133,  133,  133, +      133, 2607, 2607, 2650,  133, 2607, 2650,  133,  133,  133, +     2650,  133,  133, 2689, 2650, 2650, 2630, 2689, 2694, 2694, +     2694, 2694, 2694, 2014, 2694, 2694, 2694, 2694, 2694, 2694, +       46, 2630, 2695, 2695, 2696, 2696, 2696, 2014,   46, 2699, +     2696, 2696, 2696, 2696, 2696, 2014, 2590, 2635, 2630, 2635, +     2694, 2694, 2694, 2694, 2694, 2694, 2674,  132, 2630, 2699, +     2674, 2706,  133,  133,  133,  133,  133,  133, 2607, 2607, +     2650, 2650, 2710, 2650,  133,  133,  133,  133,  133,  133, +     2650, 2650, 2650, 2710,  133, 2650,  133,  133, 2630, 2699, + +     2710,  132, 2710, 2719, 2720, 2720, 2720, 2720, 2720, 2014, +     2720, 2720, 2720, 2720, 2720, 2720,   46, 2635, 2721, 2721, +     2722, 2722, 2722, 2014,   46, 2699, 2722, 2722, 2722, 2722, +     2722, 2014, 2674, 2699, 2674, 2706, 2720, 2720, 2720, 2720, +     2720, 2720,  132,  133,  133,  133,  133,  133,  133, 2650, +     2650, 2710,  133, 2650, 2650,  133,  133,  133, 2710,  133, +      133, 2710, 2735, 2710,  133, 2710, 2735, 2740, 2740, 2740, +     2740, 2740, 2699, 2740, 2740, 2740, 2740, 2740, 2740,   46, +     2745, 2741, 2741, 2742, 2742, 2742, 2124,   46, 2674, 2742, +     2742, 2742, 2742, 2742, 2124, 2699, 2745, 2706, 2748, 2740, + +     2740, 2740, 2740, 2740, 2740,  133,  133,  133,  133,  133, +      133, 2710, 2710, 2710, 2710, 2735,  133,  133,  133,  133, +     2699, 2745, 2710, 2735, 2735, 2756, 2757, 2757, 2757, 2757, +     2757, 2124, 2757, 2757, 2757, 2757, 2757, 2757,   46,  132, +     2758, 2758, 2759, 2759, 2759, 2124,   46, 2745, 2759, 2759, +     2759, 2759, 2759, 2124, 2706, 2748,  133, 2745, 2757, 2757, +     2757, 2757, 2757, 2757, 2762, 2763, 2763, 2763, 2763,  133, +      133,  133,  133,  133,  133, 2710, 2735, 2735, 2735, 2735, +     2756, 2769, 2769, 2769, 2769, 2769, 2745, 2769, 2769, 2769, +     2769, 2769, 2769,   46, 2748, 2770, 2770, 2771, 2771, 2771, + +     2124,   46, 2745, 2771, 2771, 2771, 2771, 2771, 2124, 2748, +      132, 1471, 1466, 2769, 2769, 2769, 2769, 2769, 2769, 2762, +     2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763,  133, +      133,  133,  133, 1329, 1471, 2735, 2735, 2756, 2756, 2776, +     2776, 2776, 2776, 2776, 1466, 2776, 2776, 2776, 2776, 2776, +     2776,   46,  132, 2777, 2777, 2778, 2778, 2778, 2124,   46, +     1466, 2778, 2778, 2778, 2778, 2778, 2124, 1461, 1466, 1461, +      132, 2776, 2776, 2776, 2776, 2776, 2776,  133,  133, 1461, +     1456, 1461, 1456, 2756, 2756, 2780, 2780, 2780, 2780, 2780, +      132, 2780, 2780, 2780, 2780, 2780, 2780,   46, 1456, 2781, + +     2781, 2782, 2782, 2782, 2225,   46, 1456, 2782, 2782, 2782, +     2782, 2782, 2225,  132, 1450, 1329, 1438, 2780, 2780, 2780, +     2780, 2780, 2780,  133, 1450, 1329, 1438, 1318,  132, 2756, +     2783, 2783, 2783, 2783, 2783, 2225, 2783, 2783, 2783, 2783, +     2783, 2783,   46, 1329, 2784, 2784, 2785, 2785, 2785, 2225, +       46, 1322, 2785, 2785, 2785, 2785, 2785, 2225, 1318,  132, +     1438, 1318, 2783, 2783, 2783, 2783, 2783, 2783, 2786, 2786, +     2786, 2786, 2786, 1429, 2786, 2786, 2786, 2786, 2786, 2786, +       46, 1438, 2787, 2787, 2788, 2788, 2788, 2225,   46, 1318, +     2788, 2788, 2788, 2788, 2788, 2225, 1429,  132, 1318, 1314, + +     2786, 2786, 2786, 2786, 2786, 2786, 2789, 2789, 2789, 2789, +     2789, 1314, 2789, 2789, 2789, 2789, 2789, 2789,   46,  132, +     2790, 2790, 2791, 2791, 2791, 2225,   46, 1429, 2791, 2791, +     2791, 2791, 2791, 2225, 1429,  132, 2864, 2864, 2789, 2789, +     2789, 2789, 2789, 2789, 2792, 2792, 2792, 2792, 2792, 2864, +     2792, 2792, 2792, 2792, 2792, 2792,   46, 1411, 2793, 2793, +     2794, 2794, 2794, 2396,   46, 1410, 2794, 2794, 2794, 2794, +     2794, 2396, 2864,  133,  133,  133, 2792, 2792, 2792, 2792, +     2792, 2792, 2795, 2795, 2795, 2795, 2795, 2396, 2795, 2795, +     2795, 2795, 2795, 2795,   46,  133, 2796, 2796, 2797, 2797, + +     2797, 2396,   46, 1368, 2797, 2797, 2797, 2797, 2797, 2396, +     1360, 1341, 1333,  132, 2795, 2795, 2795, 2795, 2795, 2795, +     2798, 2798, 2798, 2798, 2798, 1360, 2798, 2798, 2798, 2798, +     2798, 2798,   46, 1354, 2799, 2799, 2800, 2800, 2800, 2396, +       46, 1333, 2800, 2800, 2800, 2800, 2800, 2396, 1360, 1354, +     1333, 1216, 2798, 2798, 2798, 2798, 2798, 2798, 2801, 2801, +     2801, 2801, 2801,  132, 2801, 2801, 2801, 2801, 2801, 2801, +       46, 1354, 2802, 2802, 2803, 2803, 2803, 2396,   46, 1349, +     2803, 2803, 2803, 2803, 2803, 2396, 1354, 1349,  132, 1349, +     2801, 2801, 2801, 2801, 2801, 2801, 2804, 2804, 2804, 2804, + +     2804, 1344, 2804, 2804, 2804, 2804, 2804, 2804,   46, 1349, +     2805, 2805, 2806, 2806, 2806, 2470,   46, 1344, 2806, 2806, +     2806, 2806, 2806, 2470,  132, 1344, 1344,  132, 2804, 2804, +     2804, 2804, 2804, 2804, 2807, 2807, 2807, 2807, 2807, 2470, +     2807, 2807, 2807, 2807, 2807, 2807,   46, 1341, 2808, 2808, +     2809, 2809, 2809, 2470,   46, 1333, 2809, 2809, 2809, 2809, +     2809, 2470, 1329, 1322,  132, 1333, 2807, 2807, 2807, 2807, +     2807, 2807, 2810, 2810, 2810, 2810, 2810, 1216, 2810, 2810, +     2810, 2810, 2810, 2810,   46, 1322, 2811, 2811, 2812, 2812, +     2812, 2470,   46, 1333, 2812, 2812, 2812, 2812, 2812, 2470, + +     1216, 1322, 1208, 1329, 2810, 2810, 2810, 2810, 2810, 2810, +     2813, 2813, 2813, 2813, 2813, 1322, 2813, 2813, 2813, 2813, +     2813, 2813,   46, 1318, 2814, 2814, 2815, 2815, 2815, 2470, +       46,  132, 2815, 2815, 2815, 2815, 2815, 2470, 1322, 1208, +     1322, 1208, 2813, 2813, 2813, 2813, 2813, 2813, 2816, 2816, +     2816, 2816, 2816, 1208, 2816, 2816, 2816, 2816, 2816, 2816, +       46, 1318, 2817, 2817, 2818, 2818, 2818, 2533,   46,  132, +     2818, 2818, 2818, 2818, 2818, 2533, 2864, 1297, 1296, 2864, +     2816, 2816, 2816, 2816, 2816, 2816, 2819, 2819, 2819, 2819, +     2819, 2533, 2819, 2819, 2819, 2819, 2819, 2819,   46,  133, + +     2820, 2820, 2821, 2821, 2821, 2533,   46,  133, 2821, 2821, +     2821, 2821, 2821, 2533,  133,  133,  133,  133, 2819, 2819, +     2819, 2819, 2819, 2819, 2822, 2822, 2822, 2822, 2822,  132, +     2822, 2822, 2822, 2822, 2822, 2822,   46, 1253, 2823, 2823, +     2824, 2824, 2824, 2533,   46, 1245, 2824, 2824, 2824, 2824, +     2824, 2533, 1227, 1253, 1245, 1227, 2822, 2822, 2822, 2822, +     2822, 2822, 2825, 2825, 2825, 2825, 2825, 1113, 2825, 2825, +     2825, 2825, 2825, 2825,   46,  132, 2826, 2826, 2827, 2827, +     2827, 2533,   46, 1245, 2827, 2827, 2827, 2827, 2827, 2533, +     1240, 1113, 1245, 1240, 2825, 2825, 2825, 2825, 2825, 2825, + +     2828, 2828, 2828, 2828, 2828,  132, 2828, 2828, 2828, 2828, +     2828, 2828,   46, 1240, 2829, 2829, 2830, 2830, 2830, 2630, +       46, 1235, 2830, 2830, 2830, 2830, 2830, 2630, 1240, 1235, +      132, 1235, 2828, 2828, 2828, 2828, 2828, 2828, 2831, 2831, +     2831, 2831, 2831, 2630, 2831, 2831, 2831, 2831, 2831, 2831, +       46, 1235, 2832, 2832, 2833, 2833, 2833, 2630,   46,  132, +     2833, 2833, 2833, 2833, 2833, 2630, 1232,  132, 1227, 1113, +     2831, 2831, 2831, 2831, 2831, 2831, 2834, 2834, 2834, 2834, +     2834, 1216, 2834, 2834, 2834, 2834, 2834, 2834,   46, 1227, +     2835, 2835, 2836, 2836, 2836, 2630,   46, 1113, 2836, 2836, + +     2836, 2836, 2836, 2630, 1216, 1104,  132, 1113, 2834, 2834, +     2834, 2834, 2834, 2834, 2837, 2837, 2837, 2837, 2837, 1108, +     2837, 2837, 2837, 2837, 2837, 2837,   46, 1104, 2838, 2838, +     2839, 2839, 2839, 2630,   46,  132, 2839, 2839, 2839, 2839, +     2839, 2630, 1216, 1104, 1216, 1104, 2837, 2837, 2837, 2837, +     2837, 2837, 2840, 2840, 2840, 2840, 2840,  132, 2840, 2840, +     2840, 2840, 2840, 2840,   46, 1104, 2841, 2841, 2842, 2842, +     2842, 2699,   46, 1104, 2842, 2842, 2842, 2842, 2842, 2699, +      132, 1190, 1189, 1188, 2840, 2840, 2840, 2840, 2840, 2840, +     2843, 2843, 2843, 2843, 2843, 2699, 2843, 2843, 2843, 2843, + +     2843, 2843,   46, 1187, 2844, 2844, 2845, 2845, 2845, 2699, +       46, 2864, 2845, 2845, 2845, 2845, 2845, 2699, 2864,  133, +      133,  133, 2843, 2843, 2843, 2843, 2843, 2843, 2846, 2846, +     2846, 2846, 2846, 1149, 2846, 2846, 2846, 2846, 2846, 2846, +       46, 1141, 2847, 2847, 2848, 2848, 2848, 2699,   46, 1125, +     2848, 2848, 2848, 2848, 2848, 2699, 1117,  132, 1141, 1135, +     2846, 2846, 2846, 2846, 2846, 2846, 2849, 2849, 2849, 2849, +     2849, 1117, 2849, 2849, 2849, 2849, 2849, 2849,   46, 1141, +     2850, 2850, 2851, 2851, 2851, 2699,   46, 1135, 2851, 2851, +     2851, 2851, 2851, 2699, 1117, 1011,  132, 1135, 2849, 2849, + +     2849, 2849, 2849, 2849, 2852, 2852, 2852, 2852, 2852, 1130, +     2852, 2852, 2852, 2852, 2852, 2852,   46, 1135, 2853, 2853, +     2854, 2854, 2854, 2745,   46, 1130, 2854, 2854, 2854, 2854, +     2854, 2745,  132, 1130, 1127, 1130, 2852, 2852, 2852, 2852, +     2852, 2852, 2855, 2855, 2855, 2855, 2855, 2745, 2855, 2855, +     2855, 2855, 2855, 2855,   46,  132, 2856, 2856, 2857, 2857, +     2857, 2745,   46, 1127, 2857, 2857, 2857, 2857, 2857, 2745, +     1125, 1117, 1113, 1108, 2855, 2855, 2855, 2855, 2855, 2855, +     2858, 2858, 2858, 2858, 2858,  132, 2858, 2858, 2858, 2858, +     2858, 2858,   46, 1117, 2859, 2859, 2860, 2860, 2860, 2745, + +       46, 1011, 2860, 2860, 2860, 2860, 2860, 2745, 1108, 1117, +     1011, 1108, 2858, 2858, 2858, 2858, 2858, 2858, 2861, 2861, +     2861, 2861, 2861, 1113, 2861, 2861, 2861, 2861, 2861, 2861, +       46, 1108, 2862, 2862, 2863, 2863, 2863, 2745,   46,  132, +     2863, 2863, 2863, 2863, 2863, 2745, 1108, 1108,  132, 2864, +     2861, 2861, 2861, 2861, 2861, 2861,   52,   52,   52,   52, +       52, 1086,   52,   52,   52,   52,   52,   52,   46, 1085, +     2862, 2862, 2863, 2863, 2863,   46, 1084, 2863, 2863, 2863, +     2863, 2863, 1083, 2864,  133,  133,  133,  133,   52,   52, +       52,   52,   52,   52,   42,   42,   42,   42,   42,   42, + +       42,   42,   45,  133,   45,   45,   45,   45,   45,   45, +       50,  132,   50,   50,   52,   52, 1043,   52,   52,   52, +      130, 1035,  130,  130,  131,  131,  134,  134,  219, 1020, +      219,  219,  220,  220,  221,  221,  225,  225,  225,  309, +     1043,  309,  309,  310,  310,  311,  311,  313,  313,  314, +      314,  315,  315,  315,  317,  317,  389, 1035,  389,  389, +      390,  390,  391,  391,  393,  393,  394,  394,  395,  395, +      396,  396,  398,  398,  398,  400,  400,  401,  401,  401, +      476, 1020,  476,  476,  477,  477,  478,  478,  480,  480, +      481,  481,  482,  482,  483,  483,  485,  485,  486,  486, + +      487,  487,  488,  488,  488,  490,  490,  491,  491,  491, +      493,  493,  493,  494,  494,  563,  916,  563,  563,  564, +      564,  565,  565,  567,  567,  569,  569,  570,  570,  571, +      571,  573,  573,  574,  574,  575,  575,  576,  576,  577, +      577,  578,  578,  580,  580,  580,  582,  582,  583,  583, +      583,  585,  585,  585,  586,  586,  587,  587,  587,  588, +      588,  588,  654,  132,  654,  654,  655,  655,  656,  656, +      658,  658,  659,  659,  660,  660,  662,  662,  663,  663, +      665,  665,  666,  666,  667,  667,  668,  668,  669,  669, +      670,  670,  672,  672,  673,  673,  674,  674,  675,  675, + +      676,  676,  676,  678,  678,  679,  679,  679,  680,  680, +      680,  681,  681,  682,  682,  682,  683,  683,  683,  685, +      685,  685,  686,  686,  686,  687,  687,   52,   52, 1035, +       52,   52,  738, 1030,  738,  738,  739,  739,  740,  740, +      742,  742,  743,  743,  744,  744,  745,  745,  654,  654, +      748,  748,  749,  749,  751,  751,  752,  752,  753,  753, +      754,  754,  755,  755,  757,  757,  758,  758,  759,  759, +      760,  760,  761,  761,  762,  762,  763,  763,  765,  765, +      765,  767,  767,  768,  768,  768,  770,  770,  770,  771, +      771,  771,  772,  772,  772,  774,  774,  774,  775,  775, + +      775,  776,  776,  777,  777,  777,  778,  778,  778,  779, +      779,  779,   52,   52,  916,   52,   52,  824, 1035,  824, +      824,  825,  825,  826,  826,  827,  827,  828,  828,  829, +      829,  830,  830,  832,  832,  833,  833,  834,  834,  835, +      835,  836,  836,  838,  838,  839,  839,  840,  840,  841, +      841,  843,  843,  844,  844,  845,  845,  846,  846,  847, +      847,  848,  848,  849,  849,  851,  851,  852,  852,  853, +      853,  854,  854,  855,  855,  855,  857,  857,  858,  858, +      858,  860,  860,  860,  861,  861,  765,  765,  765,  862, +      862,  862,  863,  863,  863,  864,  864,  865,  865,  865, + +      866,  866,  866,  867,  867,  867,  869,  869,  869,  870, +      870,  870,  871,  871,  871,  872,  872,   52,   52, 1030, +       52,   52,  913,  132,  913,  913,  914,  914,  915,  915, +      917,  917,  918,  918,  919,  919,  921,  921,  922,  922, +      923,  923,  924,  924,  925,  925,  926,  926,  928,  928, +      930,  930,  931,  931,  932,  932,  933,  933,  832,  832, +      935,  935,  936,  936,  937,  937,  938,  938,  939,  939, +      941,  941,  942,  942,  943,  943,  944,  944,  945,  945, +      946,  946,  947,  947,  949,  949,  949,  951,  951,  952, +      952,  952,  954,  954,  954,  955,  955,  956,  956,  956, + +      957,  957,  957,  959,  959,  959,  960,  960,  960,  961, +      961,  961,  963,  963,  963,  964,  964,  964,  965,  965, +      965,  966,  966,  967,  967,  967,  968,  968,  968,  969, +      969,  969,   52,   52, 1030,   52,   52, 1008, 1026, 1008, +     1008, 1009, 1009, 1010, 1010, 1012, 1012, 1013, 1013,  913, +      913, 1014, 1014, 1015, 1015, 1016, 1016, 1017, 1017, 1018, +     1018, 1019, 1019, 1021, 1021, 1022, 1022, 1023, 1023, 1024, +     1024, 1025, 1025, 1027, 1027, 1028, 1028, 1029, 1029,  921, +      921, 1031, 1031, 1032, 1032, 1033, 1033, 1034, 1034, 1036, +     1036, 1037, 1037, 1038, 1038, 1039, 1039, 1040, 1040, 1041, + +     1041, 1042, 1042, 1044, 1044, 1045, 1045, 1046, 1046, 1047, +     1047, 1048, 1048, 1048, 1050, 1050, 1051, 1051, 1051, 1052, +     1052, 1052, 1053, 1053, 1054, 1054, 1054, 1055, 1055, 1055, +     1057, 1057, 1057, 1058, 1058, 1058, 1059, 1059, 1060, 1060, +     1060, 1061, 1061, 1061, 1062, 1062, 1062, 1063, 1063, 1064, +     1064, 1064, 1065, 1065, 1065, 1066, 1066, 1066, 1068, 1068, +     1068, 1069, 1069, 1069, 1070, 1070, 1070, 1071, 1071,   52, +       52, 1030,   52,   52, 1105, 1026, 1105, 1105, 1106, 1106, +     1107, 1107, 1109, 1109, 1110, 1110, 1111, 1111, 1112, 1112, +     1114, 1114, 1115, 1115, 1116, 1116, 1118, 1118, 1119, 1119, + +     1120, 1120, 1121, 1121, 1122, 1122, 1123, 1123, 1124, 1124, +     1126, 1126, 1128, 1128, 1129, 1129, 1014, 1014, 1131, 1131, +     1132, 1132, 1133, 1133, 1134, 1134, 1022, 1022, 1136, 1136, +     1137, 1137, 1138, 1138, 1139, 1139, 1140, 1140, 1142, 1142, +     1143, 1143, 1144, 1144, 1145, 1145, 1146, 1146, 1147, 1147, +     1148, 1148, 1150, 1150, 1150, 1152, 1152, 1153, 1153, 1153, +     1155, 1155, 1155, 1156, 1156, 1156, 1157, 1157, 1157, 1159, +     1159, 1159, 1160, 1160, 1160, 1161, 1161, 1162, 1162, 1162, +     1163, 1163, 1163, 1164, 1164, 1164, 1166, 1166, 1166, 1167, +     1167, 1167, 1168, 1168, 1168, 1170, 1170, 1170, 1171, 1171, + +     1171, 1172, 1172, 1172, 1173, 1173, 1174, 1174, 1174, 1175, +     1175, 1175, 1176, 1176, 1176,   52,   52,  132,   52,   52, +     1209, 1026, 1209, 1209, 1210, 1210, 1211, 1211, 1212, 1212, +     1213, 1213, 1214, 1214, 1215, 1215, 1217, 1217, 1218, 1218, +     1219, 1219, 1220, 1220, 1221, 1221, 1222, 1222, 1223, 1223, +     1224, 1224, 1225, 1225, 1226, 1226, 1228, 1228, 1229, 1229, +     1230, 1230, 1231, 1231, 1008, 1008, 1233, 1233, 1234, 1234, +     1236, 1236, 1237, 1237, 1238, 1238, 1239, 1239, 1119, 1119, +     1241, 1241, 1242, 1242, 1243, 1243, 1244, 1244, 1246, 1246, +     1247, 1247, 1248, 1248, 1249, 1249, 1250, 1250, 1251, 1251, + +     1252, 1252, 1254, 1254, 1255, 1255, 1256, 1256, 1257, 1257, +     1258, 1258, 1258, 1260, 1260, 1261, 1261, 1261, 1263, 1263, +     1263, 1264, 1264, 1150, 1150, 1150, 1265, 1265, 1265, 1266, +     1266, 1266, 1267, 1267, 1268, 1268, 1268, 1269, 1269, 1269, +     1270, 1270, 1270, 1272, 1272, 1272, 1273, 1273, 1273, 1274, +     1274, 1274, 1275, 1275, 1276, 1276, 1276, 1277, 1277, 1277, +     1278, 1278, 1278, 1279, 1279, 1280, 1280, 1280, 1281, 1281, +     1281, 1282, 1282, 1282, 1284, 1284, 1284, 1285, 1285, 1285, +     1286, 1286, 1286, 1287, 1287,   52,   52,  132,   52,   52, +     1315, 1020, 1315, 1315, 1316, 1316, 1317, 1317, 1319, 1319, + +     1320, 1320, 1321, 1321, 1323, 1323, 1324, 1324, 1325, 1325, +     1326, 1326, 1327, 1327, 1328, 1328, 1330, 1330, 1331, 1331, +     1332, 1332, 1334, 1334, 1335, 1335, 1336, 1336, 1337, 1337, +     1338, 1338, 1339, 1339, 1340, 1340, 1342, 1342, 1343, 1343, +     1345, 1345, 1346, 1346, 1347, 1347, 1348, 1348, 1221, 1221, +     1350, 1350, 1351, 1351, 1352, 1352, 1353, 1353, 1229, 1229, +     1355, 1355, 1356, 1356, 1357, 1357, 1358, 1358, 1359, 1359, +     1361, 1361, 1362, 1362, 1363, 1363, 1364, 1364, 1365, 1365, +     1366, 1366, 1367, 1367, 1369, 1369, 1369, 1371, 1371, 1372, +     1372, 1372, 1374, 1374, 1374, 1375, 1375, 1376, 1376, 1376, + +     1377, 1377, 1377, 1379, 1379, 1379, 1380, 1380, 1380, 1381, +     1381, 1381, 1383, 1383, 1383, 1384, 1384, 1384, 1385, 1385, +     1385, 1386, 1386, 1387, 1387, 1387, 1388, 1388, 1388, 1389, +     1389, 1389, 1391, 1391, 1391, 1392, 1392, 1392, 1393, 1393, +     1393, 1395, 1395, 1395, 1396, 1396, 1396, 1397, 1397, 1397, +     1398, 1398, 1399, 1399, 1399, 1400, 1400, 1400, 1401, 1401, +     1401,   52,   52,  916,   52,   52, 1426, 1011, 1426, 1426, +     1427, 1427, 1428, 1428, 1430, 1430, 1431, 1431, 1315, 1315, +     1432, 1432, 1433, 1433, 1434, 1434, 1435, 1435, 1436, 1436, +     1437, 1437, 1439, 1439, 1440, 1440, 1441, 1441, 1442, 1442, + +     1443, 1443, 1444, 1444, 1445, 1445, 1446, 1446, 1447, 1447, +     1448, 1448, 1449, 1449, 1451, 1451, 1452, 1452, 1453, 1453, +     1454, 1454, 1455, 1455, 1457, 1457, 1458, 1458, 1459, 1459, +     1460, 1460, 1217, 1217, 1462, 1462, 1463, 1463, 1464, 1464, +     1465, 1465, 1335, 1335, 1467, 1467, 1468, 1468, 1469, 1469, +     1470, 1470, 1472, 1472, 1473, 1473, 1474, 1474, 1475, 1475, +     1476, 1476, 1477, 1477, 1478, 1478, 1480, 1480, 1481, 1481, +     1482, 1482, 1483, 1483, 1484, 1484, 1484, 1486, 1486, 1487, +     1487, 1487, 1488, 1488, 1488, 1489, 1489, 1490, 1490, 1490, +     1491, 1491, 1491, 1493, 1493, 1493, 1494, 1494, 1494, 1495, + +     1495, 1496, 1496, 1496, 1497, 1497, 1497, 1498, 1498, 1498, +     1499, 1499, 1500, 1500, 1500, 1501, 1501, 1501, 1502, 1502, +     1502, 1504, 1504, 1504, 1505, 1505, 1505, 1506, 1506, 1506, +     1507, 1507, 1508, 1508, 1508, 1509, 1509, 1509, 1510, 1510, +     1510, 1511, 1511, 1512, 1512, 1512, 1513, 1513, 1513, 1514, +     1514, 1514, 1516, 1516, 1516, 1517, 1517, 1517, 1518, 1518, +     1518, 1519, 1519,   52,   52, 1020,   52,   52, 1539,  916, +     1539, 1539, 1427, 1427, 1540, 1540, 1541, 1541, 1542, 1542, +     1543, 1543, 1544, 1544, 1546, 1546, 1547, 1547, 1548, 1548, +     1550, 1550, 1551, 1551, 1552, 1552, 1553, 1553, 1554, 1554, + +     1555, 1555, 1556, 1556, 1558, 1558, 1559, 1559, 1560, 1560, +     1562, 1562, 1563, 1563, 1564, 1564, 1565, 1565, 1566, 1566, +     1567, 1567, 1568, 1568, 1570, 1570, 1572, 1572, 1573, 1573, +     1574, 1574, 1323, 1323, 1576, 1576, 1577, 1577, 1578, 1578, +     1579, 1579, 1444, 1444, 1581, 1581, 1582, 1582, 1583, 1583, +     1584, 1584, 1452, 1452, 1586, 1586, 1587, 1587, 1588, 1588, +     1589, 1589, 1590, 1590, 1592, 1592, 1593, 1593, 1594, 1594, +     1595, 1595, 1596, 1596, 1597, 1597, 1598, 1598, 1600, 1600, +     1600, 1602, 1602, 1603, 1603, 1603, 1605, 1605, 1605, 1606, +     1606, 1606, 1607, 1607, 1607, 1609, 1609, 1609, 1610, 1610, + +     1610, 1611, 1611, 1612, 1612, 1612, 1613, 1613, 1613, 1614, +     1614, 1614, 1616, 1616, 1616, 1617, 1617, 1617, 1618, 1618, +     1618, 1620, 1620, 1620, 1621, 1621, 1621, 1622, 1622, 1622, +     1623, 1623, 1624, 1624, 1624, 1625, 1625, 1625, 1626, 1626, +     1626, 1628, 1628, 1628, 1629, 1629, 1629, 1630, 1630, 1630, +     1632, 1632, 1632, 1633, 1633, 1633, 1634, 1634, 1634, 1635, +     1635, 1636, 1636, 1636, 1637, 1637, 1637, 1638, 1638, 1638, +       52,   52, 1011,   52,   52, 1655,  132, 1655, 1655, 1542, +     1542, 1656, 1656, 1657, 1657, 1658, 1658, 1660, 1660, 1661, +     1661, 1662, 1662, 1663, 1663, 1664, 1664, 1665, 1665, 1666, + +     1666, 1667, 1667, 1668, 1668, 1669, 1669, 1671, 1671, 1672, +     1672, 1673, 1673, 1674, 1674, 1675, 1675, 1676, 1676, 1677, +     1677, 1678, 1678, 1679, 1679, 1680, 1680, 1681, 1681, 1683, +     1683, 1684, 1684, 1685, 1685, 1686, 1686, 1687, 1687, 1689, +     1689, 1690, 1690, 1432, 1432, 1692, 1692, 1693, 1693, 1694, +     1694, 1695, 1695, 1440, 1440, 1697, 1697, 1698, 1698, 1699, +     1699, 1700, 1700, 1563, 1563, 1702, 1702, 1703, 1703, 1704, +     1704, 1705, 1705, 1707, 1707, 1708, 1708, 1709, 1709, 1710, +     1710, 1711, 1711, 1712, 1712, 1713, 1713, 1715, 1715, 1716, +     1716, 1717, 1717, 1718, 1718, 1719, 1719, 1719, 1721, 1721, + +     1722, 1722, 1722, 1724, 1724, 1724, 1725, 1725, 1600, 1600, +     1600, 1726, 1726, 1726, 1727, 1727, 1727, 1728, 1728, 1729, +     1729, 1729, 1730, 1730, 1730, 1731, 1731, 1731, 1733, 1733, +     1733, 1734, 1734, 1734, 1735, 1735, 1735, 1736, 1736, 1737, +     1737, 1737, 1738, 1738, 1738, 1739, 1739, 1739, 1740, 1740, +     1741, 1741, 1741, 1742, 1742, 1742, 1743, 1743, 1743, 1745, +     1745, 1745, 1746, 1746, 1746, 1747, 1747, 1747, 1748, 1748, +     1749, 1749, 1749, 1750, 1750, 1750, 1751, 1751, 1751, 1752, +     1752, 1753, 1753, 1753, 1754, 1754, 1754, 1755, 1755, 1755, +     1757, 1757, 1757, 1758, 1758, 1758, 1759, 1759, 1759, 1760, + +     1760,   52,   52,  916,   52,   52, 1776,  912, 1776, 1776, +     1777, 1777, 1778, 1778, 1662, 1662, 1779, 1779, 1780, 1780, +     1781, 1781, 1783, 1783, 1784, 1784, 1785, 1785, 1787, 1787, +     1788, 1788, 1789, 1789, 1790, 1790, 1791, 1791, 1792, 1792, +     1793, 1793, 1795, 1795, 1796, 1796, 1797, 1797, 1799, 1799, +     1800, 1800, 1801, 1801, 1802, 1802, 1803, 1803, 1804, 1804, +     1805, 1805, 1426, 1426, 1808, 1808, 1809, 1809, 1811, 1811, +     1812, 1812, 1813, 1813, 1814, 1814, 1551, 1551, 1816, 1816, +     1817, 1817, 1818, 1818, 1819, 1819, 1676, 1676, 1821, 1821, +     1822, 1822, 1823, 1823, 1824, 1824, 1684, 1684, 1826, 1826, + +     1827, 1827, 1796, 1796, 1828, 1828, 1829, 1829, 1830, 1830, +     1832, 1832, 1833, 1833, 1834, 1834, 1835, 1835, 1804, 1804, +     1836, 1836, 1837, 1837, 1838, 1838, 1840, 1840, 1840, 1721, +     1721, 1842, 1842, 1842, 1843, 1843, 1843, 1844, 1844, 1845, +     1845, 1845, 1846, 1846, 1846, 1848, 1848, 1848, 1849, 1849, +     1849, 1850, 1850, 1850, 1852, 1852, 1852, 1853, 1853, 1853, +     1854, 1854, 1854, 1855, 1855, 1856, 1856, 1856, 1857, 1857, +     1857, 1858, 1858, 1858, 1860, 1860, 1860, 1861, 1861, 1861, +     1862, 1862, 1862, 1864, 1864, 1864, 1865, 1865, 1865, 1866, +     1866, 1866, 1867, 1867, 1868, 1868, 1868, 1869, 1869, 1869, + +     1870, 1870, 1870, 1872, 1872, 1872, 1873, 1873, 1873, 1874, +     1874, 1874, 1876, 1876, 1876, 1877, 1877, 1877, 1878, 1878, +     1878, 1879, 1879, 1880, 1880, 1880, 1881, 1881, 1881, 1882, +     1882, 1882,   52,   52,  912,   52,   52, 1777,  132, 1777, +     1777, 1779, 1779, 1898, 1898, 1899, 1899, 1900, 1900, 1901, +     1901, 1902, 1902, 1903, 1903, 1904, 1904, 1905, 1905, 1906, +     1906, 1907, 1907, 1909, 1909, 1910, 1910, 1911, 1911, 1912, +     1912, 1913, 1913, 1914, 1914, 1915, 1915, 1916, 1916, 1917, +     1917, 1918, 1918, 1919, 1919, 1921, 1921, 1922, 1922, 1923, +     1923, 1924, 1924, 1808, 1808, 1925, 1925, 1927, 1927, 1928, + +     1928, 1929, 1929, 1930, 1930, 1664, 1664, 1932, 1932, 1933, +     1933, 1934, 1934, 1935, 1935, 1672, 1672, 1937, 1937, 1938, +     1938, 1939, 1939, 1940, 1940, 1800, 1800, 1942, 1942, 1943, +     1943, 1944, 1944, 1945, 1945, 1947, 1947, 1948, 1948, 1949, +     1949, 1950, 1950, 1918, 1918, 1951, 1951, 1952, 1952, 1953, +     1953, 1955, 1955, 1956, 1956, 1957, 1957, 1958, 1958, 1959, +     1959, 1959, 1844, 1844, 1960, 1960, 1960, 1961, 1961, 1961, +     1962, 1962, 1962, 1964, 1964, 1964, 1965, 1965, 1965, 1966, +     1966, 1967, 1967, 1967, 1968, 1968, 1968, 1969, 1969, 1969, +     1970, 1970, 1971, 1971, 1971, 1972, 1972, 1972, 1973, 1973, + +     1973, 1975, 1975, 1975, 1976, 1976, 1976, 1977, 1977, 1977, +     1978, 1978, 1979, 1979, 1979, 1980, 1980, 1980, 1981, 1981, +     1981, 1982, 1982, 1983, 1983, 1983, 1984, 1984, 1984, 1985, +     1985, 1985, 1987, 1987, 1987, 1988, 1988, 1988, 1989, 1989, +     1989, 1990, 1990, 1991, 1991, 1991, 1992, 1992, 1992, 1993, +     1993, 1993, 1994, 1994, 1995, 1995, 1995, 1996, 1996, 1996, +     1997, 1997, 1997, 1999, 1999, 1999, 2000, 2000, 2000, 2001, +     2001, 2001, 2002, 2002,   52,   52, 1011,   52,   52, 1779, +     1011, 1779, 1779, 1900, 1900, 1898, 1898, 2011, 2011, 2012, +     2012, 2013, 2013, 2015, 2015, 2016, 2016, 2017, 2017, 2018, + +     2018, 2019, 2019, 2020, 2020, 2021, 2021, 2022, 2022, 2024, +     2024, 2025, 2025, 2026, 2026, 2028, 2028, 2029, 2029, 2030, +     2030, 2031, 2031, 2032, 2032, 2033, 2033, 2034, 2034, 2036, +     2036, 1928, 1928, 2037, 2037, 2038, 2038, 1660, 1660, 2040, +     2040, 2041, 2041, 2042, 2042, 2043, 2043, 1788, 1788, 2045, +     2045, 2046, 2046, 2047, 2047, 2048, 2048, 1914, 1914, 2050, +     2050, 2051, 2051, 2052, 2052, 2053, 2053, 1922, 1922, 2055, +     2055, 2056, 2056, 2025, 2025, 2057, 2057, 2058, 2058, 2059, +     2059, 2061, 2061, 2062, 2062, 2063, 2063, 2064, 2064, 2033, +     2033, 2065, 2065, 2066, 2066, 2067, 2067, 2069, 2069, 2069, + +     2070, 2070, 2070, 2071, 2071, 2071, 1966, 1966, 2072, 2072, +     2072, 2073, 2073, 2073, 2074, 2074, 2074, 2076, 2076, 2076, +     2077, 2077, 2077, 2078, 2078, 2078, 2080, 2080, 2080, 2081, +     2081, 2081, 2082, 2082, 2082, 2083, 2083, 2084, 2084, 2084, +     2085, 2085, 2085, 2086, 2086, 2086, 2088, 2088, 2088, 2089, +     2089, 2089, 2090, 2090, 2090, 2092, 2092, 2092, 2093, 2093, +     2093, 2094, 2094, 2094, 2095, 2095, 2096, 2096, 2096, 2097, +     2097, 2097, 2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, +     2101, 2102, 2102, 2102, 2104, 2104, 2104, 2105, 2105, 2105, +     2106, 2106, 2106, 2107, 2107, 2108, 2108, 2108, 2109, 2109, + +     2109, 2110, 2110, 2110,   52,   52,  132,   52,   52, 1899, +     2864, 1899, 1899, 2016, 2016, 2119, 2119, 2120, 2120, 2019, +     2019, 2012, 2012, 2121, 2121, 2122, 2122, 2123, 2123, 2125, +     2125, 2126, 2126, 2127, 2127, 2128, 2128, 2129, 2129, 2130, +     2130, 2131, 2131, 2132, 2132, 2133, 2133, 2134, 2134, 2135, +     2135, 2137, 2137, 2138, 2138, 2139, 2139, 2140, 2140, 2141, +     2141, 1777, 1777, 2142, 2142, 2041, 2041, 2143, 2143, 2144, +     2144, 1903, 1903, 2146, 2146, 2147, 2147, 2148, 2148, 2149, +     2149, 1910, 1910, 2151, 2151, 2152, 2152, 2153, 2153, 2154, +     2154, 2029, 2029, 2156, 2156, 2157, 2157, 2158, 2158, 2159, + +     2159, 2161, 2161, 2162, 2162, 2163, 2163, 2164, 2164, 2134, +     2134, 2165, 2165, 2166, 2166, 2167, 2167, 2169, 2169, 2170, +     2170, 2171, 2171, 2172, 2172, 2070, 2070, 2070, 2072, 2072, +     2072, 2173, 2173, 2173, 2174, 2174, 2174, 2175, 2175, 2175, +     2176, 2176, 2176, 2177, 2177, 2178, 2178, 2178, 2179, 2179, +     2179, 2180, 2180, 2180, 2181, 2181, 2181, 2182, 2182, 2182, +     2184, 2184, 2184, 2185, 2185, 2185, 2186, 2186, 2186, 2187, +     2187, 2188, 2188, 2188, 2189, 2189, 2189, 2190, 2190, 2190, +     2191, 2191, 2192, 2192, 2192, 2193, 2193, 2193, 2194, 2194, +     2194, 2196, 2196, 2196, 2197, 2197, 2197, 2198, 2198, 2198, + +     2199, 2199, 2200, 2200, 2200, 2201, 2201, 2201, 2202, 2202, +     2202, 2203, 2203, 2204, 2204, 2204, 2205, 2205, 2205, 2206, +     2206, 2206, 2208, 2208, 2208, 2209, 2209, 2209, 2210, 2210, +     2210, 2211, 2211,   52,   52, 2864,   52,   52, 1898,  988, +     1898, 1898, 2121, 2121, 2219, 2219, 2125, 2125, 2220, 2220, +     2221, 2221, 2128, 2128, 2222, 2222, 2223, 2223, 2224, 2224, +     2226, 2226, 2227, 2227, 2228, 2228, 2230, 2230, 2231, 2231, +     2232, 2232, 2233, 2233, 2234, 2234, 2235, 2235, 2236, 2236, +     1777, 1777, 2238, 2238, 1900, 1900, 2239, 2239, 2147, 2147, +     2240, 2240, 2241, 2241, 2017, 2017, 2243, 2243, 2244, 2244, + +     2245, 2245, 2246, 2246, 2130, 2130, 2248, 2248, 2249, 2249, +     2250, 2250, 2251, 2251, 2138, 2138, 2253, 2253, 2254, 2254, +     2227, 2227, 2255, 2255, 2256, 2256, 2257, 2257, 2259, 2259, +     2260, 2260, 2261, 2261, 2262, 2262, 2235, 2235, 2263, 2263, +     2264, 2264, 2265, 2265, 2175, 2175, 2175, 2173, 2173, 2173, +     2267, 2267, 2267, 2268, 2268, 2268, 2269, 2269, 2269, 2271, +     2271, 2271, 2272, 2272, 2272, 2273, 2273, 2273, 2274, 2274, +     2274, 2275, 2275, 2276, 2276, 2276, 2277, 2277, 2277, 2278, +     2278, 2278, 2280, 2280, 2280, 2281, 2281, 2281, 2282, 2282, +     2282, 2284, 2284, 2284, 2285, 2285, 2285, 2286, 2286, 2286, + +     2287, 2287, 2288, 2288, 2288, 2289, 2289, 2289, 2290, 2290, +     2290, 2292, 2292, 2292, 2293, 2293, 2293, 2294, 2294, 2294, +     2296, 2296, 2296, 2297, 2297, 2297, 2298, 2298, 2298, 2299, +     2299, 2300, 2300, 2300, 2301, 2301, 2301, 2302, 2302, 2302, +       52,   52,  987,   52,   52, 1900,  986, 1900, 1900, 2220, +     2220, 2222, 2222, 2312, 2312, 2313, 2313, 2314, 2314, 2315, +     2315, 2316, 2316, 2317, 2317, 2318, 2318, 2319, 2319, 2320, +     2320, 2321, 2321, 2323, 2323, 2324, 2324, 2325, 2325, 2326, +     2326, 2327, 2327, 2119, 2119, 2328, 2328, 2244, 2244, 2329, +     2329, 2330, 2330, 2126, 2126, 2332, 2332, 2333, 2333, 2334, + +     2334, 2335, 2335, 2231, 2231, 2337, 2337, 2338, 2338, 2339, +     2339, 2340, 2340, 2342, 2342, 2343, 2343, 2344, 2344, 2345, +     2345, 2346, 2346, 2347, 2347, 2348, 2348, 2350, 2350, 2351, +     2351, 2352, 2352, 2353, 2353, 2272, 2272, 2272, 2354, 2354, +     2354, 2355, 2355, 2355, 2275, 2275, 2268, 2268, 2268, 2356, +     2356, 2356, 2357, 2357, 2357, 2358, 2358, 2358, 2360, 2360, +     2360, 2361, 2361, 2361, 2362, 2362, 2362, 2363, 2363, 2364, +     2364, 2364, 2365, 2365, 2365, 2366, 2366, 2366, 2367, 2367, +     2368, 2368, 2368, 2369, 2369, 2369, 2370, 2370, 2370, 2372, +     2372, 2372, 2373, 2373, 2373, 2374, 2374, 2374, 2375, 2375, + +     2376, 2376, 2376, 2377, 2377, 2377, 2378, 2378, 2378, 2379, +     2379, 2380, 2380, 2380, 2381, 2381, 2381, 2382, 2382, 2382, +     2384, 2384, 2384, 2385, 2385, 2385, 2386, 2386, 2386, 2387, +     2387,   52,   52,  985,   52,   52, 2011,  984, 2011, 2011, +     2314, 2314, 2312, 2312, 2393, 2393, 2394, 2394, 2395, 2395, +     2397, 2397, 2398, 2398, 2399, 2399, 2400, 2400, 2401, 2401, +     2402, 2402, 2403, 2403, 2404, 2404, 2119, 2119, 2406, 2406, +     2220, 2220, 2407, 2407, 2333, 2333, 2408, 2408, 2409, 2409, +     2317, 2317, 2411, 2411, 2412, 2412, 2413, 2413, 2414, 2414, +     2324, 2324, 2416, 2416, 2417, 2417, 2418, 2418, 2419, 2419, + +     2420, 2420, 2422, 2422, 2423, 2423, 2424, 2424, 2425, 2425, +     2426, 2426, 2427, 2427, 2428, 2428, 2356, 2356, 2356, 2430, +     2430, 2430, 2360, 2360, 2360, 2431, 2431, 2431, 2432, 2432, +     2432, 2363, 2363, 2433, 2433, 2433, 2434, 2434, 2434, 2435, +     2435, 2435, 2437, 2437, 2437, 2438, 2438, 2438, 2439, 2439, +     2439, 2441, 2441, 2441, 2442, 2442, 2442, 2443, 2443, 2443, +     2444, 2444, 2445, 2445, 2445, 2446, 2446, 2446, 2447, 2447, +     2447, 2449, 2449, 2449, 2450, 2450, 2450, 2451, 2451, 2451, +     2453, 2453, 2453, 2454, 2454, 2454, 2455, 2455, 2455, 2456, +     2456, 2457, 2457, 2457, 2458, 2458, 2458, 2459, 2459, 2459, + +       52,   52,  983,   52,   52, 2016, 2864, 2016, 2016, 2398, +     2398, 2465, 2465, 2466, 2466, 2401, 2401, 2394, 2394, 2467, +     2467, 2468, 2468, 2469, 2469, 2471, 2471, 2472, 2472, 2473, +     2473, 2474, 2474, 2220, 2220, 2475, 2475, 2314, 2314, 2476, +     2476, 2412, 2412, 2477, 2477, 2478, 2478, 2399, 2399, 2480, +     2480, 2481, 2481, 2482, 2482, 2483, 2483, 2485, 2485, 2486, +     2486, 2487, 2487, 2488, 2488, 2489, 2489, 2490, 2490, 2491, +     2491, 2493, 2493, 2494, 2494, 2495, 2495, 2496, 2496, 2431, +     2431, 2431, 2433, 2433, 2433, 2497, 2497, 2497, 2498, 2498, +     2498, 2499, 2499, 2499, 2500, 2500, 2500, 2501, 2501, 2502, + +     2502, 2502, 2503, 2503, 2503, 2504, 2504, 2504, 2505, 2505, +     2505, 2506, 2506, 2506, 2508, 2508, 2508, 2509, 2509, 2509, +     2510, 2510, 2510, 2511, 2511, 2512, 2512, 2512, 2513, 2513, +     2513, 2514, 2514, 2514, 2515, 2515, 2516, 2516, 2516, 2517, +     2517, 2517, 2518, 2518, 2518, 2520, 2520, 2520, 2521, 2521, +     2521, 2522, 2522, 2522, 2523, 2523,   52,   52,  133,   52, +       52, 2012,  133, 2012, 2012, 2467, 2467, 2527, 2527, 2471, +     2471, 2528, 2528, 2529, 2529, 2474, 2474, 2530, 2530, 2531, +     2531, 2532, 2532, 2314, 2314, 2534, 2534, 2465, 2465, 2535, +     2535, 2481, 2481, 2536, 2536, 2537, 2537, 2472, 2472, 2539, + +     2539, 2540, 2540, 2541, 2541, 2542, 2542, 2543, 2543, 2545, +     2545, 2546, 2546, 2547, 2547, 2548, 2548, 2549, 2549, 2550, +     2550, 2551, 2551, 2499, 2499, 2499, 2497, 2497, 2497, 2553, +     2553, 2553, 2554, 2554, 2554, 2555, 2555, 2555, 2557, 2557, +     2557, 2558, 2558, 2558, 2559, 2559, 2559, 2560, 2560, 2560, +     2561, 2561, 2562, 2562, 2562, 2563, 2563, 2563, 2564, 2564, +     2564, 2566, 2566, 2566, 2567, 2567, 2567, 2568, 2568, 2568, +     2570, 2570, 2570, 2571, 2571, 2571, 2572, 2572, 2572, 2573, +     2573, 2574, 2574, 2574, 2575, 2575, 2575, 2576, 2576, 2576, +       52,   52,  133,   52,   52, 2119,  948, 2119, 2119, 2528, + +     2528, 2530, 2530, 2581, 2581, 2582, 2582, 2583, 2583, 2584, +     2584, 2585, 2585, 2465, 2465, 2586, 2586, 2587, 2587, 2540, +     2540, 2588, 2588, 2589, 2589, 2591, 2591, 2592, 2592, 2593, +     2593, 2594, 2594, 2595, 2595, 2596, 2596, 2598, 2598, 2599, +     2599, 2600, 2600, 2601, 2601, 2558, 2558, 2558, 2602, 2602, +     2602, 2603, 2603, 2603, 2561, 2561, 2554, 2554, 2554, 2604, +     2604, 2604, 2605, 2605, 2605, 2606, 2606, 2606, 2608, 2608, +     2608, 2609, 2609, 2609, 2610, 2610, 2610, 2611, 2611, 2612, +     2612, 2612, 2613, 2613, 2613, 2614, 2614, 2614, 2615, 2615,       2616, 2616, 2616, 2617, 2617, 2617, 2618, 2618, 2618, 2620,       2620, 2620, 2621, 2621, 2621, 2622, 2622, 2622, 2623, 2623, -     2624, 2624, 2624, 2625, 2625, 2625, 2626, 2626, 2626,   51, -      895,   51,   51,   51, 2090,  129, 2090, 2090, 2601, 2601, -     2631, 2631, 2632, 2632, 2633, 2633, 2548, 2548, 2634, 2634, -     2635, 2635, 2604, 2604, 2593, 2593, 2636, 2636, 2637, 2637, -     2638, 2638, 2640, 2640, 2641, 2641, 2642, 2642, 2643, 2643, -     2610, 2610, 2610, 2612, 2612, 2612, 2644, 2644, 2644, 2645, -     2645, 2645, 2646, 2646, 2646, 2647, 2647, 2647, 2648, 2648, -     2649, 2649, 2649, 2650, 2650, 2650, 2651, 2651, 2651, 2652, -     2652, 2652, 2653, 2653, 2653, 2655, 2655, 2655, 2656, 2656, - -     2656, 2657, 2657, 2657, 2658, 2658,   51,  915,   51,   51, -       51, 2184,  909, 2184, 2184, 2662, 2662, 2663, 2663, 2631, -     2631, 2665, 2665, 2666, 2666, 2667, 2667, 2668, 2668, 2669, -     2669, 2670, 2670, 2672, 2672, 2672, 2673, 2673, 2673, 2674, -     2674, 2674, 2676, 2676, 2676, 2677, 2677, 2677, 2678, 2678, -     2678, 2679, 2679, 2679, 2680, 2680, 2681, 2681, 2681, 2682, -     2682, 2682, 2683, 2683, 2683, 2185,  895, 2185, 2185, 2688, -     2688, 2689, 2689, 2690, 2690, 2691, 2691, 2692, 2692, 2693, -     2693, 2694, 2694, 2695, 2695, 2695, 2696, 2696, 2696, 2697, -     2697, 2697, 2698, 2698, 2698, 2699, 2699, 2699, 2701, 2701, - -     2701, 2702, 2702, 2702, 2703, 2703, 2703, 2704, 2704, 2187, -      915, 2187, 2187, 2708, 2708, 2709, 2709, 2711, 2711, 2712, -     2712, 2714, 2714, 2715, 2715, 2715, 2716, 2716, 2716, 2717, -     2717, 2717, 2718, 2718, 2718, 2719, 2719, 2719, 2720, 2720, -     2720, 2278,  909, 2278, 2278, 2725, 2725, 2726, 2726, 2729, -     2729, 2730, 2730, 2730, 2731, 2731, 2731, 2732, 2732, 2732, -     2733, 2733, 2733, 2277,  895, 2277, 2277, 2737, 2737, 2738, -     2738, 2739, 2739, 2739, 2740, 2740, 2740, 2279,  800, 2279, -     2279, 2744, 2744, 2744, 2358,  129, 2358, 2358, 2363,  909, -     2363, 2363, 2359,  904, 2359, 2359, 2430,  909, 2430, 2430, - -     2432,  904, 2432, 2432, 2436,  129, 2436, 2436, 2492,  904, -     2492, 2492, 2493,  904, 2493, 2493, 2495,  902, 2495, 2495, -     2547,  895, 2547, 2547, 2546,  891, 2546, 2546, 2548,  129, -     2548, 2548, 2592,  895, 2592, 2592, 2601,  800, 2601, 2601, -     2593,  895, 2593, 2593, 2631,  800, 2631, 2631, 2636,  800, -     2636, 2636, 2640,  891, 2640, 2640, 2662,  129, 2662, 2662, -     2666, 2829, 2666, 2666, 2668,  867, 2668, 2668, 2691,  866, -     2691, 2691, 2708,  865, 2708, 2708, 2692,  864, 2692, 2692, -     2711,  863, 2711, 2711, 2726,  862, 2726, 2726, 2737,  130, -     2737, 2737,  130,  130,  130,  129,  827,  819,  808,  827, - -      819,  808,  716,  129,  819,  814,  716,  819,  814,  129, -      814,  814,  129,  129,  808,  716,  808,  716,  129,  716, -      716,  129, 2829, 2829, 2829, 2829, 2829,  778,  777,  776, -      775,  774,  773, 2829,  762,  130,  130,  743,  735,  725, -      720,  129,  735,  729,  720,  735,  729,  720,  129,  729, -      729,  129,  726,  725,  720,  129,  720,  720,  129,  712, -     2829, 2829, 2829, 2829, 2829, 2829,  688,  687,  686,  685, -      684,  683, 2829, 2829,  671,  130,  130,  130,  129,  652, -      645,  638,  652,  645,  638,  129,  645,  642,  645,  129, -      642,  129,  638,  638,  129,  628,  623,  622,  600,  595, - -      594,  593,  592,  591,  590,  587,  575,  130,  130,  562, -      555,  549,  129,  555,  551,  555,  551,  129,  551,  549, -      129,  539,  534,  533,  511,  506,  505,  504,  503,  502, -      501,  497,  485,  130,  130,  129,  470,  465,  470,  465, -      129,  465,  465,  129,  454,  448,  447,  425,  410,  130, -      386,  381,  129,  381,  381,  129,  328,  321,  314,  130, -      129,  304,  304,  129,  233,  230,  228,  227,  226,  217, -      129,  153,  140,  138,  137,  136,  133,  130,  129,   42, -       52,   50,   42, 2829,    3, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829 +       52,   52,  940,   52,   52, 2121,  927, 2121, 2121, 2583, +     2583, 2581, 2581, 2627, 2627, 2628, 2628, 2629, 2629, 2528, +     2528, 2631, 2631, 2632, 2632, 2593, 2593, 2633, 2633, 2634, +     2634, 2636, 2636, 2637, 2637, 2638, 2638, 2639, 2639, 2640, +     2640, 2641, 2641, 2642, 2642, 2604, 2604, 2604, 2644, 2644, +     2644, 2608, 2608, 2608, 2645, 2645, 2645, 2646, 2646, 2646, +     2611, 2611, 2647, 2647, 2647, 2648, 2648, 2648, 2649, 2649, +     2649, 2651, 2651, 2651, 2652, 2652, 2652, 2653, 2653, 2653, +     2655, 2655, 2655, 2656, 2656, 2656, 2657, 2657, 2657, 2658, + +     2658, 2659, 2659, 2659, 2660, 2660, 2660, 2661, 2661, 2661, +       52,   52,  920,   52,   52, 2125,  132, 2125, 2125, 2636, +     2636, 2666, 2666, 2667, 2667, 2668, 2668, 2583, 2583, 2669, +     2669, 2670, 2670, 2639, 2639, 2628, 2628, 2671, 2671, 2672, +     2672, 2673, 2673, 2675, 2675, 2676, 2676, 2677, 2677, 2678, +     2678, 2645, 2645, 2645, 2647, 2647, 2647, 2679, 2679, 2679, +     2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682, 2683, +     2683, 2684, 2684, 2684, 2685, 2685, 2685, 2686, 2686, 2686, +     2687, 2687, 2687, 2688, 2688, 2688, 2690, 2690, 2690, 2691, +     2691, 2691, 2692, 2692, 2692, 2693, 2693,   52,   52,  940, + +       52,   52, 2219,  934, 2219, 2219, 2697, 2697, 2698, 2698, +     2666, 2666, 2700, 2700, 2701, 2701, 2702, 2702, 2703, 2703, +     2704, 2704, 2705, 2705, 2707, 2707, 2707, 2708, 2708, 2708, +     2709, 2709, 2709, 2711, 2711, 2711, 2712, 2712, 2712, 2713, +     2713, 2713, 2714, 2714, 2714, 2715, 2715, 2716, 2716, 2716, +     2717, 2717, 2717, 2718, 2718, 2718, 2220,  920, 2220, 2220, +     2723, 2723, 2724, 2724, 2725, 2725, 2726, 2726, 2727, 2727, +     2728, 2728, 2729, 2729, 2730, 2730, 2730, 2731, 2731, 2731, +     2732, 2732, 2732, 2733, 2733, 2733, 2734, 2734, 2734, 2736, +     2736, 2736, 2737, 2737, 2737, 2738, 2738, 2738, 2739, 2739, + +     2222,  940, 2222, 2222, 2743, 2743, 2744, 2744, 2746, 2746, +     2747, 2747, 2749, 2749, 2750, 2750, 2750, 2751, 2751, 2751, +     2752, 2752, 2752, 2753, 2753, 2753, 2754, 2754, 2754, 2755, +     2755, 2755, 2313,  934, 2313, 2313, 2760, 2760, 2761, 2761, +     2764, 2764, 2765, 2765, 2765, 2766, 2766, 2766, 2767, 2767, +     2767, 2768, 2768, 2768, 2312,  920, 2312, 2312, 2772, 2772, +     2773, 2773, 2774, 2774, 2774, 2775, 2775, 2775, 2314,  823, +     2314, 2314, 2779, 2779, 2779, 2393,  132, 2393, 2393, 2398, +      934, 2398, 2398, 2394,  929, 2394, 2394, 2465,  934, 2465, +     2465, 2467,  929, 2467, 2467, 2471,  132, 2471, 2471, 2527, + +      929, 2527, 2527, 2528,  929, 2528, 2528, 2530,  927, 2530, +     2530, 2582,  920, 2582, 2582, 2581,  916, 2581, 2581, 2583, +      132, 2583, 2583, 2627,  920, 2627, 2627, 2636,  823, 2636, +     2636, 2628,  920, 2628, 2628, 2666,  823, 2666, 2666, 2671, +      823, 2671, 2671, 2675,  916, 2675, 2675, 2697,  132, 2697, +     2697, 2701, 2864, 2701, 2701, 2703,  891, 2703, 2703, 2726, +      890, 2726, 2726, 2743,  889, 2743, 2743, 2727,  888, 2727, +     2727, 2746,  887, 2746, 2746, 2761,  886, 2761, 2761, 2772, +      133, 2772, 2772,  133,  133,  133,  132,  850,  842,  831, +      850,  842,  831,  737,  132,  842,  837,  737,  842,  837, + +      132,  837,  837,  132,  132,  831,  737,  831,  737,  132, +      737,  737,  132, 2864, 2864, 2864, 2864, 2864,  800,  799, +      798,  797,  796,  795, 2864,  783,  133,  133,  764,  756, +      746,  741,  132,  756,  750,  741,  756,  750,  741,  132, +      750,  750,  132,  747,  746,  741,  132,  741,  741,  132, +      733, 2864, 2864, 2864, 2864, 2864, 2864,  708,  707,  706, +      705,  704,  703, 2864, 2864,  690,  133,  133,  133,  132, +      671,  664,  657,  671,  664,  657,  132,  664,  661,  664, +      132,  661,  132,  657,  657,  132,  647,  641,  640,  618, +      613,  612,  611,  610,  609,  608,  605,  592,  133,  133, + +      579,  572,  566,  132,  572,  568,  572,  568,  132,  568, +      566,  132,  556,  550,  549,  526,  521,  520,  519,  518, +      517,  516,  512,  499,  133,  133,  132,  484,  479,  484, +      479,  132,  479,  479,  132,  468,  461,  460,  437,  422, +      133,  397,  392,  132,  392,  392,  132,  337,  329,  322, +      133,  132,  312,  312,  132,  238,  235,  233,  232,  231, +      222,  132,  157,  143,  141,  140,  139,  136,  133,  132, +       43,   53,   51,   43, 2864,    3, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864      } ; -static yyconst flex_int16_t yy_chk[10753] = +static yyconst flex_int16_t yy_chk[10845] =      {   0,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1, @@ -2949,1194 +2971,1204 @@ static yyconst flex_int16_t yy_chk[10753] =          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1, -        1,    1,    1,    1,    1,    1,    1,    5,   23, 1329, -        5,    9,    9,    9,    9,    9,   11,  577,   11,   11, -       11,   11,   11,   11,   12, 1330,   12,   12,   12,   12, -       12,   12,   14,   14,   14,   14,   14,   14,   14,   14, - -       14,   14,   14,   14,   40,  270,   17,   40,   16,   14, -       17,   49,   18,   21,   17,   24,  129,  117,   49,   23, -       18,  577,  129,   16,   14,   14,   14,   14,   14,   14, -       16,  270,  282,  282,   14,   18,   16,   51,   20,   18, -       21,   94,   30,  117,  576,  620,   24,  270,   14,   15, +        1,    1,    1,    1,    1,    1,    1,    1,    5,   23, +     1361,    5,    9,    9,    9,    9,    9,   11,  594,   11, +       11,   11,   11,   11,   11,   12, 1362,   12,   12,   12, +       12,   12,   12,   14,   14,   14,   14,   14,   14,   14, + +       14,   14,   14,   14,   14,   41,  277,   17,   41,   16, +       14,   17,   50,   18,   21,   17,   24,  132,  120,   50, +       23,   18,  594,  132,   16,   14,   14,   14,   14,   14, +       14,   16,  277,  289,  289,   14,   18,   16,   52,   20, +       18,   21,   18,   30,  120,  591,  602,   24,  277,   14,         15,   15,   15,   15,   15,   15,   15,   15,   15,   15, -       15,   19,   22,  582,   21,  117,   24,   25,   25,   20, -       26,   30,   19,   30, 1331,  576,   25,  620,   22,   19, -       20,   15,   15,   15,   15,   15,   15,   19,   51,   20, -       74,   34,   94,   30,   19,   22,   19,   27,   27,   26, - -       62,   22,   25,   19,   29,   15,   34,   25,   28,   29, -       26,  582,   27,   22,   28,   26,   34,   32,   25,   33, -       32,   26,   28,   33,   27,   31,   32,   57,   27,   74, -       34,   29,   27,   33,   63,   29,   36,   27,   62,   63, -       28,   74,   81,   36,   29,   63,   29,   28,   27,   29, -       31,   62, 1332,   57,   31,   29,   36,   37,   37,   28, -       36,   81,   33,  584,   31,   31,   32,   36,   32,   31, -       33,  584,   37,   38,   31,   64,   31,   57,   38,   43, -       43,   43,   43,   43,   37,   45,   45,   45,   45,   45, -       54,   54,   61,   81,   71,   65,   46,   37,   46,   46, - -       46,   46,   46,   46,   38,  597,   59,   47,   37,   47, -       47,   47,   47,   47,   47,   65,   66,   54,   64,   67, -       68,   59,   69,   61,   38,   39,   64,   73,   69,   39, -       39,   71,  597,  127,   68,  214,   39, 1333,   39,   39, -      127,   54,  214,   61,   39,   71,   65,   76,   72,   75, -       67,   39,   78,   73,   69,   39,   39,   59,   66, 1334, -      703,   39,  703,   39,   39,   80,   86,   66,   39,   77, -       67,   68,   73,   69,   79,   39,   52,   52,   52,   52, -       52,   52,   52,   52,   52,   52,   52,   52,   72,   75, -       76,   78,   83,   84,   85,   82,   86,   87,   76,   72, - -       75,   88,   91,   78,   88,   90,   92,   80,   52,   52, -       52,   52,   52,   52,   82,   77,   80,   86,   79,   89, -       77,   85,   84,   92,   95,   79,   84,   93,  853,   97, -       88,   91,   92,   93,   87,   83,   99,   96,  102,   89, -       98,  100,  101,   83,   84,   85,   82,   92,   87,   90, -       95,  104,   88,   91,   92,   96,   90,  107,  103,   93, -      105, 1335,  853,   89,  109,  104,  101,  106,  111,   95, -       89,   99,  112,   97,  574,  101,   99,   98,   93,   96, -       97,  111,   98,  100,  102,  108,  107,   99,   96,  102, -      103,   98,  100,  115,  105,  103,  114,  106,  110,  103, - -      113,  103,  104,  109,  116,  114,  120,  109,  107,  103, -      134,  105,  108,  112,  110,  109,  113,  118,  106,  111, -      131,  574, 1337,  112,  115,  133,  131,  108,  134,  122, -      120,  122,  122,  122,  122,  122,  108,  120,  130,  130, -      130,  130,  130,  118,  115,  139,  116,  114,  133,  110, -      141,  113,  134,  580,  123,  116,  123,  123,  123,  123, -      123,  134,  118,  121,  139,  121,  135,  124,  121,  124, -      124,  124,  124,  124,  124,  144,  133, 1340,  146,  141, -      121,  125,  121,  125,  125,  125,  125,  125,  125,  121, -      135,  121,  142,  145,  121,  679,  139,  580,  951,  135, - -      679,  141,  144,  149,  121,  146,  121,  147,  147,  150, -      151,  951,  148,  121,  132,  132,  132,  132,  132,  132, -      132,  132,  132,  132,  132,  132,  144,  153,  154,  146, -      142,  152,  155,  151,  156,  150,  157,  145,  161,  158, -      160,  166,  149,  142,  145,  162,  132,  132,  132,  132, -      132,  132,  148,  165,  149,  152,  163,  151,  147,  152, -      150,  151,  153,  148,  169,  156,  159,  159,  159,  161, -      155,  168,  154,  158,  164,  173,  163,  166,  153,  154, -      160,  157,  167,  155,  162,  156,  170,  157,  167,  161, -      158,  160,  166,  173,  164,  169,  162,  165,  171,  172, - -      176,  175,  178,  174,  165, 1345,  184,  163,  182,  171, -      186,  181,  187, 1349,  168,  169,  177,  173,  183,  159, -      185,  180,  168,  177,  172,  164,  173,  174,  189,  188, -      170,  176,  196,  167,  171,  181,  174,  170,  175,  172, -      180,  177,  182,  181,  191,  187,  190,  177,  188,  171, -      184,  176,  175,  178,  186,  183,  177,  184,  192,  182, -      185,  186,  193,  187,  180,  194,  195,  197,  196,  183, -      189,  185,  180,  190,  199,  198,  201,  200,  204,  189, -      188,  191,  202,  196,  203,  195,  207,  202,  193,  192, -      206,  236,  588,  220,  301,  191,  194,  190,  205,  220, - -      378,  301,  307,  199,  231,  462,  208,  378,  307,  192, -      198,  197,  462,  193,  200,  203,  194,  195,  197,  236, -      770, 1357,  205,  585,  770,  199,  198,  201,  200,  204, -      208,  209,  206,  202,  208,  203,  588,  207,  209,  209, -      231,  206,  236,  209,  210,  210,  210,  210,  210,  205, -      218,  218,  218,  218,  218,  231,  209,  219,  219,  219, -      219,  219,  209,  209,  223,  228,  224,  209,  585,  579, -      211,  209,  211,  211,  211,  211,  211,  211,  212,  224, -      212,  212,  212,  212,  212,  212,  222,  222,  222,  222, -      222,  222,  222,  222,  222,  222,  222,  222,  227,  223, - -      225,  229,  228,  230,  224,  232,  229,  579,  234,  235, -      237,  238,  237,  241,  239,  223,  228,  224,  222,  222, -      222,  222,  222,  222,  244,  225,  243,  245,  246,  227, -      247,  248,  251,  257,  230, 1361,  260,  262,  225,  257, -      232,  249,  250,  248,  252,  253,  254,  259, 1369,  227, -      248,  235,  229,  238,  230,  244,  232,  234,  239,  234, -      235,  237,  238,  243,  241,  239,  258,  249,  250,  256, -      246,  247,  254,  261,  251,  244,  253,  243,  245,  246, -      255,  247,  248,  251,  257,  255,  252,  260,  262,  264, -      264,  259,  249,  250,  266,  252,  253,  254,  259,  265, - -      256,  258,  267,  581,  268,  271,  269,  272,  261,  273, -      274,  275,  276,  278,  546,  269,  264,  258,  279,  277, -      256,  546, 1375,  288,  261,  265,  272,  291,  284,  266, -      268,  255,  280,  281,  287,  283,  289,  292,  581,  293, -      264,  269,  285,  276,  278,  266,  286,  312,  332,  265, -     1377,  275,  274,  267,  268,  290,  271,  269,  272,  277, -      273,  274,  275,  276,  278,  283,  279,  280,  284,  279, -      277,  335,  281,  285,  288,  287,  289,  286,  291,  284, -     1053,  290,  293,  280,  281,  287,  283,  289,  292,  286, -      293,  294,  295,  285,  335,  309,  604,  286,  312,  332, - -      295,  309,  335,  294,  295,  296,  290,  296,  296,  296, -      296,  296,  317, 1053, 1378,  604,  317,  294,  295,  297, -      314,  297,  297,  297,  297,  297,  295,  311,  294,  295, -      298,  315,  298,  298,  298,  298,  298,  298,  317,  316, -      321,  294,  295,  299,  324,  299,  299,  299,  299,  299, -      299,  310,  310,  310,  310,  310,  310,  310,  310,  310, -      310,  310,  310,  317,  314,  319,  311,  320,  322,  318, -      323,  314,  322,  329,  315,  330,  583,  321,  311,  316, -      326,  324,  315,  310,  310,  310,  310,  310,  310,  318, -      316,  321,  318,  325,  327,  324,  331,  326,  333,  334, - -      339,  337,  342,  327,  336,  325,  338,  343,  319,  344, -      323,  320, 1379,  348,  341,  583,  319,  330,  320,  322, -      318,  323,  329,  331,  329,  349,  330,  336,  341,  350, -      346,  326,  337,  333,  334,  336,  345,  339,  338,  348, -      347,  342,  343,  347,  325,  327,  344,  331,  350,  333, -      334,  339,  337,  342,  345,  345,  354,  338,  343,  346, -      344,  348,  351,  353,  349,  341,  352,  356,  355,  347, -      357,  359,  350,  358,  360,  363,  349,  364,  366,  365, -      350,  346,  367,  369,  372,  354,  351,  345,  355,  368, -      371,  347, 1386,  358,  351,  387,  356,  352,  353,  389, - -      359,  387,  390,  368,  360,  389,  364,  354,  390,  474, -      372,  373,  617,  357,  353,  474,  369,  352,  356,  355, -      363,  357,  359,  365,  358,  360,  363,  373,  364,  366, -      365,  371,  372,  367,  369,  394,  395,  373,  397,  401, -      368,  371,  374,  374,  374,  374,  374,  617, 1387, 1391, -      375,  373,  375,  375,  375,  375,  375,  375,  376,  373, -      376,  376,  376,  376,  376,  376,  392,  392,  392,  392, -      392,  392,  392,  392,  392,  392,  392,  392,  393,  395, -      396,  399,  400,  403,  401,  402,  394,  395,  404,  397, -      401,  405,  406,  408,  411,  407,  412,  409,  392,  392, - -      392,  392,  392,  392,  407,  402,  415,  424,  393,  426, -      422,  635,  413,  396,  414,  427,  399,  428,  635,  404, -      429, 1393, 1394,  406,  400,  431,  422,  403,  423,  393, -      422,  396,  399,  400,  403,  427,  402,  439,  408,  404, -      405,  409,  405,  406,  408,  411,  407,  412,  409,  413, -      424,  429,  414,  430,  428,  423,  415,  415,  424,  432, -      426,  422,  433,  413,  431,  414,  427,  434,  428,  435, -      436,  429,  437,  433,  441,  440,  431,  438,  443,  423, -      442,  439,  430,  450,  445,  444,  432,  449,  439,  453, -      436,  446,  434,  446, 1395,  451,  437,  451,  433,  452, - -      452,  483,  484,  437,  430,  435,  438,  434,  446,  441, -      432,  445,  443,  433,  436,  440,  442,  455, 1396,  450, -      435,  436,  626,  456,  449,  441,  440,  444,  438,  443, -      608,  442,  456,  476,  450,  445,  444,  477,  449,  476, -      453,  479,  446,  477,  455,  480,  451,  479,  456,  563, -      452,  480,  483,  484,  626,  563,  456,  457,  457,  457, -      457,  457,  457,  456,  482,  486,  490,  488,  455,  458, -      458,  458,  458,  458,  458,  459,  608,  459,  459,  459, -      459,  459,  459,  460,  487,  460,  460,  460,  460,  460, -      460,  481,  481,  481,  481,  481,  481,  481,  481,  481, - -      481,  481,  481,  486,  482,  488,  489,  491,  495,  492, -      498,  494,  496,  499,  500,  482,  486,  490,  488,  487, -      509,  513,  515,  481,  481,  481,  481,  481,  481,  492, -      494,  493,  507,  508,  518,  487,  493,  510,  517,  495, -      493,  489,  514,  496,  514,  500,  512,  516,  499,  509, -      491,  520,  513,  520,  522,  524,  520,  489,  491,  495, -      492,  498,  494,  496,  499,  500,  520, 1397,  515,  523, -      525,  509,  513,  515,  507,  508,  526,  516,  510,  527, -      522,  517,  493,  507,  508,  518,  512,  521,  510,  517, -      529,  528,  521,  514,  535,  530,  538,  512,  516,  531, - -      522,  536,  520,  532,  524,  540,  524,  525,  537,  541, -      527,  528,  523,  565,  526, 1398,  538,  529,  521,  565, -      523,  525,  566,  568,  586,  535,  717,  526,  566,  568, -      527,  569,  536,  717,  540,  541, 1399,  569,  521,  530, -     1400,  529,  528,  570,  531,  535,  530,  538,  532,  570, -      531,  571,  536,  537,  532,  541,  540,  571,  596,  537, -      542,  542,  542,  542,  542,  543,  586,  543,  543,  543, -      543,  543,  543,  544,  598,  544,  544,  544,  544,  544, -      544,  573,  573,  573,  573,  573,  573,  573,  573,  573, -      573,  573,  573,  599,  603,  609,  606,  607,  596,  611, - -      605,  615,  619,  616,  618,  598,  621,  610,  624,  625, -      676,  670,  672,  573,  573,  573,  573,  573,  573,  605, -      599,  610,  761,  629,  611,  630,  630,  630,  630,  630, -      670,  675,  615,  619,  673, 1401,  611,  621,  657,  603, -      606,  609,  607,  618,  657,  659,  610,  616,  676,  660, -      624,  659,  672,  625,  629,  660, 1402,  761,  610,  631, -      631,  631,  631,  631,  632,  673,  632,  632,  632,  632, -      632,  632,  633,  675,  633,  633,  633,  633,  633,  633, -      661,  662,  663,  664,  666,  667,  661,  662,  663,  664, -      666,  667,  668,  674,  677,  678,  680,  689,  668,  669, - -      669,  669,  669,  669,  669,  669,  669,  669,  669,  669, -      669,  690,  694,  681,  693,  692,  695,  697,  702,  698, -      699,  704,  700,  701,  674,  705,  708,  680,  707,  711, -      780,  669,  669,  669,  669,  669,  669,  782,  677,  678, -      681,  689,  700,  690,  692,  710,  693,  710, 1065,  697, -      698,  699,  694, 1403,  701,  771,  695,  744,  702,  704, -      707,  711,  780,  744,  746,  765, 1065,  771,  705,  782, -      746,  708,  714,  700,  714,  714,  714,  714,  714,  714, -      715,  763,  715,  715,  715,  715,  715,  715,  747,  749, -      750,  751,  753,  754,  747,  749,  750,  751,  753,  754, - -      755,  756,  757,  758,  764,  765,  755,  756,  757,  758, -      760,  760,  760,  760,  760,  760,  760,  760,  760,  760, -      760,  760,  766,  767,  764,  768,  763,  769,  772,  779, -      781,  783,  785,  787,  784,  786,  790,  791,  793,  792, -      794,  796,  760,  760,  760,  760,  760,  760,  795,  797, -      801, 1404, 1388,  832,  767, 1156,  768,  801,  769,  832, -      783,  781,  766,  784,  785, 1388, 1164, 1156, 1164,  779, -      792,  794,  772,  793,  786,  787, 1405,  834,  835,  795, -      797,  790,  791,  834,  835,  798,  796,  798,  798,  798, -      798,  798,  798,  799,  851,  799,  799,  799,  799,  799, - -      799,  837,  838,  839,  840,  841,  842,  837,  838,  839, -      840,  841,  842,  843,  844,  846,  847,  848,  849,  843, -      844,  846,  847,  848,  849,  850,  850,  850,  850,  850, -      850,  850,  850,  850,  850,  850,  850,  852,  854,  855, -      856,  860,  857,  858,  851,  868,  871,  861,  874,  875, -      876,  869,  877,  872,  873,  878,  880,  850,  850,  850, -      850,  850,  850,  881,  884,  883,  888, 1165,  947, 1165, -      924,  952,  860,  888,  868,  882,  924,  871, 1406,  874, -      856,  852,  861,  854,  857,  858,  869,  878,  855,  872, -      873, 1407,  876,  875,  882,  926,  877,  883,  927,  947, - -      880,  926,  929, 1408,  927,  881,  884,  885,  929,  885, -      885,  885,  885,  885,  885,  886,  952,  886,  886,  886, -      886,  886,  886,  930,  931,  932,  934,  935,  936,  930, -      931,  932,  934,  935,  936,  938,  939,  940,  941,  942, -      943,  938,  939,  940,  941,  942,  943,  944,  964,  950, -      949,  966,  965,  944,  946,  946,  946,  946,  946,  946, -      946,  946,  946,  946,  946,  946,  953,  954,  955,  956, -      963,  967,  968,  969,  970, 1059,  972,  964,  973,  974, -      975,  977,  966, 1050, 1051,  976,  946,  946,  946,  946, -      946,  946,  949,  950,  965, 1021,  981, 1076,  974, 1409, - -      977, 1021,  967,  981, 1076,  953,  954,  955,  972,  956, -      963, 1051, 1059,  973,  968,  975,  969,  976,  978,  970, -      978,  978,  978,  978,  978,  978,  979, 1050,  979,  979, -      979,  979,  979,  979, 1023, 1024, 1025, 1026, 1027, 1028, -     1023, 1024, 1025, 1026, 1027, 1028, 1030, 1031, 1032, 1033, -     1034, 1035, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, -     1038, 1039, 1041, 1042, 1036, 1037, 1038, 1039, 1041, 1042, -     1043, 1044, 1049, 1052, 1061, 1062, 1043, 1044, 1045, 1045, -     1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, -     1047, 1060, 1054, 1061, 1063, 1066, 1067, 1060, 1064, 1068, - -     1052, 1069, 1070, 1049, 1071, 1072, 1167, 1163, 1410, 1178, -     1045, 1045, 1045, 1045, 1045, 1045, 1178, 1064, 1073, 1062, -     1073, 1073, 1073, 1073, 1073, 1073, 1121, 1067, 1411, 1412, -     1047, 1054, 1121, 1413, 1066, 1071, 1069, 1167, 1063, 1068, -     1072, 1074, 1163, 1074, 1074, 1074, 1074, 1074, 1074, 1123, -     1124, 1126, 1070, 1127, 1128, 1123, 1124, 1126, 1130, 1127, -     1128, 1131, 1132, 1133, 1130, 1134, 1135, 1131, 1132, 1133, -     1137, 1134, 1135, 1138, 1139, 1141, 1137, 1142, 1143, 1138, -     1139, 1141, 1144, 1142, 1143, 1145, 1146, 1147, 1144, 1150, -     1151, 1145, 1146, 1147, 1149, 1149, 1149, 1149, 1149, 1149, - -     1149, 1149, 1149, 1149, 1149, 1149, 1153, 1154, 1155, 1162, -     1166, 1169, 1170, 1171, 1168, 1172, 1173, 1174, 1175, 1376, -     1175, 1175, 1175, 1175, 1175, 1175, 1149, 1149, 1149, 1149, -     1149, 1149, 1168, 1151, 1150, 1176, 1414, 1176, 1176, 1176, -     1176, 1176, 1176, 1153, 1154, 1166, 1172, 1415, 1227, 1162, -     1229, 1170, 1155, 1169, 1227, 1230, 1229, 1376, 1173, 1232, -     1233, 1230, 1234, 1171, 1235, 1232, 1233, 1174, 1234, 1236, -     1235, 1237, 1238, 1239, 1241, 1236, 1242, 1237, 1238, 1239, -     1241, 1243, 1242, 1244, 1245, 1246, 1247, 1243, 1248, 1244, -     1245, 1246, 1247, 1249, 1248, 1250, 1251, 1253, 1254, 1249, - -     1255, 1250, 1251, 1253, 1254, 1256, 1255, 1258, 1259, 1262, -     1266, 1256, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, -     1257, 1257, 1257, 1257, 1260, 1261, 1263, 1260, 1261, 1267, -     1268, 1269, 1270, 1271, 1272, 1274, 1275, 1278, 1416, 1371, -     1258, 1417, 1418, 1262, 1257, 1257, 1257, 1257, 1257, 1257, -     1419, 1259, 1266, 1279, 1420, 1279, 1279, 1279, 1279, 1279, -     1279, 1263, 1282, 1421, 1422, 1272, 1336, 1275, 1278, 1282, -     1271, 1338, 1336, 1371, 1339, 1268, 1269, 1338, 1274, 1267, -     1339, 1280, 1270, 1280, 1280, 1280, 1280, 1280, 1280, 1341, -     1342, 1343, 1344, 1346, 1347, 1341, 1342, 1343, 1344, 1346, - -     1347, 1348, 1350, 1351, 1352, 1353, 1354, 1348, 1350, 1351, -     1352, 1353, 1354, 1355, 1356, 1358, 1359, 1360, 1362, 1355, -     1356, 1358, 1359, 1360, 1362, 1363, 1364, 1365, 1366, 1367, -     1368, 1363, 1364, 1365, 1366, 1367, 1368, 1370, 1370, 1370, -     1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1372, -     1373, 1374, 1380, 1381, 1382, 1384, 1383, 1385, 1389, 1392, -     1389, 1389, 1389, 1389, 1389, 1389, 1392, 1423, 1424, 1370, -     1370, 1370, 1370, 1370, 1370, 1425, 1372, 1373, 1374, 1426, -     1427, 1428, 1429, 1380, 1430, 1381, 1382, 1383, 1431, 1390, -     1384, 1390, 1390, 1390, 1390, 1390, 1390, 1432, 1433, 1434, - -     1385, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, -     1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, -     1454, 1455, 1450, 1456, 1452, 1453, 1454, 1455, 1457, 1456, -     1458, 1459, 1460, 1461, 1457, 1462, 1463, 1459, 1460, 1461, -     1464, 1462, 1463, 1465, 1466, 1467, 1464, 1468, 1469, 1465, -     1466, 1467, 1470, 1468, 1471, 1472, 1473, 1474, 1470, 1475, -     1471, 1472, 1473, 1474, 1476, 1475, 1477, 1478, 1479, 1480, -     1476, 1481, 1477, 1478, 1479, 1480, 1482, 1483, 1484, 1485, -     1487, 1488, 1482, 1483, 1484, 1485, 1486, 1486, 1486, 1486, -     1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1489, 1490, - -     1491, 1492, 1493, 1494, 1495, 1496, 1498, 1499, 1503, 1504, -     1505, 1497, 1500, 1506, 1488, 1507, 1504, 1508, 1486, 1486, -     1486, 1486, 1486, 1486, 1497, 1509, 1510, 1489, 1490, 1511, -     1512, 1513, 1514, 1498, 1515, 1491, 1495, 1496, 1501, 1500, -     1501, 1501, 1501, 1501, 1501, 1501, 1502, 1516, 1502, 1502, -     1502, 1502, 1502, 1502, 1517, 1518, 1499, 1519, 1520, 1521, -     1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, -     1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, -     1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, -     1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, - -     1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1565, -     1571, 1567, 1568, 1572, 1570, 1573, 1571, 1574, 1575, 1572, -     1576, 1577, 1578, 1574, 1575, 1579, 1576, 1577, 1578, 1580, -     1581, 1579, 1582, 1583, 1584, 1585, 1581, 1586, 1582, 1583, -     1587, 1585, 1588, 1586, 1589, 1590, 1587, 1591, 1588, 1592, -     1589, 1590, 1593, 1591, 1594, 1595, 1596, 1597, 1593, 1598, -     1594, 1595, 1599, 1597, 1600, 1598, 1601, 1602, 1599, 1603, -     1600, 1604, 1601, 1602, 1606, 1603, 1605, 1605, 1605, 1605, -     1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1607, 1608, -     1609, 1610, 1611, 1612, 1613, 1617, 1616, 1620, 1622, 1614, - -     1615, 1623, 1624, 1625, 1620, 1606, 1626, 1627, 1605, 1605, -     1605, 1605, 1605, 1605, 1618, 1629, 1618, 1618, 1618, 1618, -     1618, 1618, 1607, 1608, 1612, 1613, 1614, 1630, 1615, 1621, -     1628, 1631, 1632, 1633, 1609, 1616, 1621, 1628, 1634, 1635, -     1636, 1637, 1619, 1617, 1619, 1619, 1619, 1619, 1619, 1619, -     1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, -     1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, -     1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, -     1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, -     1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, - -     1688, 1689, 1684, 1690, 1686, 1687, 1691, 1689, 1692, 1690, -     1693, 1694, 1691, 1695, 1692, 1696, 1693, 1694, 1697, 1695, -     1698, 1696, 1699, 1700, 1701, 1702, 1698, 1703, 1699, 1700, -     1701, 1702, 1704, 1703, 1705, 1706, 1707, 1708, 1704, 1709, -     1705, 1706, 1707, 1708, 1710, 1711, 1712, 1713, 1714, 1715, -     1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, -     1720, 1721, 1716, 1717, 1718, 1719, 1720, 1722, 1723, 1724, -     1725, 1728, 1727, 1722, 1723, 1724, 1725, 1726, 1726, 1726, -     1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1729, -     1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1741, - -     1742, 1743, 1728, 1744, 1745, 1738, 1741, 1746, 1747, 1726, -     1726, 1726, 1726, 1726, 1726, 1727, 1748, 1749, 1750, 1751, -     1729, 1752, 1753, 1754, 1755, 1739, 1737, 1739, 1739, 1739, -     1739, 1739, 1739, 1736, 1756, 1733, 1734, 1757, 1758, 1759, -     1760, 1761, 1740, 1735, 1740, 1740, 1740, 1740, 1740, 1740, -     1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, -     1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, -     1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, -     1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, -     1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1805, - -     1811, 1807, 1808, 1809, 1810, 1812, 1811, 1813, 1814, 1815, -     1816, 1817, 1818, 1813, 1814, 1815, 1819, 1817, 1818, 1820, -     1821, 1822, 1819, 1823, 1824, 1820, 1821, 1822, 1825, 1823, -     1826, 1827, 1828, 1829, 1825, 1830, 1826, 1827, 1831, 1829, -     1832, 1830, 1833, 1834, 1831, 1835, 1832, 1836, 1833, 1834, -     1837, 1835, 1838, 1839, 1840, 1841, 1837, 1842, 1838, 1839, -     1843, 1841, 1844, 1842, 1845, 1846, 1843, 1847, 1844, 1848, -     1845, 1846, 1850, 1847, 1849, 1849, 1849, 1849, 1849, 1849, -     1849, 1849, 1849, 1849, 1849, 1849, 1851, 1852, 1853, 1854, -     1855, 1856, 1857, 1858, 1859, 1860, 1863, 1864, 1861, 1857, - -     1861, 1861, 1861, 1861, 1861, 1861, 1849, 1849, 1849, 1849, -     1849, 1849, 1862, 1865, 1862, 1862, 1862, 1862, 1862, 1862, -     1866, 1867, 1868, 1869, 1858, 1870, 1871, 1872, 1873, 1874, -     1875, 1876, 1877, 1878, 1879, 1880, 1881, 1860, 1882, 1883, -     1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, -     1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, -     1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, -     1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, -     1924, 1925, 1926, 1927, 1928, 1929, 1924, 1925, 1926, 1927, -     1930, 1929, 1931, 1932, 1933, 1934, 1930, 1935, 1931, 1932, - -     1933, 1934, 1936, 1935, 1937, 1938, 1939, 1940, 1936, 1941, -     1937, 1938, 1942, 1940, 1943, 1941, 1944, 1945, 1942, 1946, -     1943, 1947, 1944, 1945, 1948, 1946, 1949, 1947, 1950, 1951, -     1948, 1952, 1949, 1953, 1950, 1954, 1955, 1952, 1956, 1953, -     1957, 1954, 1955, 1958, 1956, 1959, 1957, 1960, 1961, 1958, -     1962, 1959, 1963, 1960, 1961, 1964, 1962, 1965, 1966, 1967, -     1969, 1964, 1970, 1965, 1966, 1967, 1968, 1968, 1968, 1968, -     1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1971, 1972, -     1974, 1973, 1974, 1974, 1974, 1974, 1974, 1974, 1975, 1976, -     1975, 1975, 1975, 1975, 1975, 1975, 1977, 1978, 1968, 1968, - -     1968, 1968, 1968, 1968, 1979, 1980, 1981, 1982, 1983, 1984, -     1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, -     1971, 1973, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -     2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, -     2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, -     2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, -     2033, 2034, 2035, 2036, 2037, 2038, 2039, 2034, 2035, 2036, +       15,   15,   19,   22,  626,   21,  120,   24,   25,   25, +       20,   26,   30,   19,   30,   88,  723,   25,  723,   22, +       19,   20,   15,   15,   15,   15,   15,   15,   19,   52, +       20,  602,  591,  598,   30,   19,   22,   19,   27,   27, + +       26, 1363,   22,   25,   19,   88,   15,   31,   25,   28, +      626,   26,   29,   27,   22,   28,   26,   29,   32,   25, +       34,   32,   26,   28,  130,   27,   88,   32,  598,   27, +       33,  130,   31,   27,   33,   34,   31,   39,   27,   29, +       62,   28,   39,   29,   33,   34,   31,   31,   28,   27, +       28,   31,   29,   67,   29,   36,   31,   29,   31,   34, +       28,   58,   36,   29,   38,   37,   37,   32,   39,   32, +       38,   62,   64,   33,   60,   36,   63,   64,   38,   36, +       37,   33,   66,   64,  134,  646,   36,   58,   39,   60, +      134,   62,   37,   55,   55,   67,   38,   44,   44,   44, + +       44,   44,   66,   38,   67,   37,   46,   46,   46,   46, +       46,   58,  219,  596,   63,   38,   37,   40,  225,  219, +       55,   40,   40,  315,  225,   60,  156,   63,   40,  315, +       40,   40,  646,   66, 1093,   47,   40,   47,   47,   47, +       47,   47,   47,   40,   55,   65,   69,   40,   40, 1364, +      156,  596, 1093,   40,  156,   40,   40,   82,   68,   48, +       40,   48,   48,   48,   48,   48,   48,   40,   53,   53, +       53,   53,   53,   53,   53,   53,   53,   53,   53,   53, +       70,   73,   74,   77,   71,   75,   76,   69,   65,   68, +       71,   83,   79,   78,   70,   81,   65,   69,   84,   82, + +       53,   53,   53,   53,   53,   53,   80,   85,   82,   68, +       83,   75,   90,   87,   89,   90,   71,   84,   73,   86, +      601,   96,   74,   77,   92,   76,   93,   91,  601, 1365, +       75,   70,   73,   74,   77,   71,   78,   76,   79,   81, +       87,   90,   83,   79,   78,   80,   81,   91,   86,   84, +       85,   89,   86,   98,   95,   93,   94,   80,   85,   97, +       95,  102,  100,   90,   87,   89,   99,  103,   92,  104, +       86,   91,   96,   94,  101,   92,  105,   93,   91,   98, +      107,  309,   94,  106,   99,  108,   95,  111,  309,  115, +      182,  109, 1291,  104,  107, 1291,  102,   94,   98,  110, + +      112,  102,  104,   97,   94,   95,  100,  113,   99,  103, +       97,  101,  102,  100,  111,  106,  101,   99,  103,  108, +      106,  109,  105,  113,  106,  101,  106,  105,  110,  111, +      115,  107,  114,  116,  106,  117,  108,  118,  111,  112, +      115,  182,  109,  112,  117,  114,  121,  119,  389,  116, +      110,  112,  615,  617,  123,  389,  976,  125,  113,  125, +      125,  125,  125,  125,  317,  730, 1366,  730,  118,  976, +      317,  126,  121,  126,  126,  126,  126,  126,  123,  615, +      617,  151,  137,  114,  116,  123,  117,  148,  118,  119, +      127,  121,  127,  127,  127,  127,  127,  127,  119,  124, + +      137,  124,  138,  128,  124,  128,  128,  128,  128,  128, +      128,  133,  133,  133,  133,  133,  124,  142,  124,  144, +      136,  151,  150,  150,  137,  124,  138,  124,  145,  698, +      124,  148,  151,  137,  698,  138,  142,  147,  148,  152, +      124,  154,  124,  136,  153,  149,  155, 1367,  144,  124, +      135,  135,  135,  135,  135,  135,  135,  135,  135,  135, +      135,  135,  158,  157,  147,  159,  145,  154,  142,  155, +      144,  136,  149,  150,  160,  153,  161,  162,  152,  145, +      164,  165,  135,  135,  135,  135,  135,  135,  147,  167, +      152,  166,  154,  155,  169,  153,  149,  155,  157,  163, + +      163,  163,  168,  159,  171,  160,  158,  170,  172,  167, +      171,  162,  165,  158,  157,  173,  159,  174,  175,  179, +      164,  161,  168,  176, 1194,  160, 1194,  161,  162,  175, +      166,  164,  165,  180, 1368, 1370,  184,  190,  169,  177, +      167,  178,  166,  170,  187,  169,  173,  192,  176, 1373, +     1378,  172,  163,  168,  175,  171,  179,  177,  170,  172, +      181,  174,  186,  176,  180,  178,  173,  181,  174,  175, +      179,  184,  188,  185,  178,  189,  191,  190,  187,  194, +      192,  177,  193,  195,  180,  181,  186,  184,  190,  198, +      177,  181,  185,  200,  186,  187,  201,  197,  192,  196, + +      181,  193,  202,  203,  199,  205,  206,  209,  204,  188, +      195,  212,  200,  207,  208,  198,  185,  210,  207,  189, +      191,  194,  600,  188,  185,  211,  189,  191,  197,  206, +      194,  712,  201,  193,  195,  199,  196,  204,  203,  792, +      198,  210,  205,  344,  200,  208,  202,  201,  197,  213, +      196,  792,  732,  202,  203,  199,  205,  206,  209,  204, +      712,  600,  212,  214,  207,  208,  344,  211,  210,  593, +      214,  214,  732,  213,  344,  214,  211,  213,  215,  215, +      215,  215,  215,  223,  223,  223,  223,  223,  214,  224, +      224,  224,  224,  224,  214,  214,  228,  233,  229,  214, + +      593, 1382,  216,  214,  216,  216,  216,  216,  216,  216, +      217,  229,  217,  217,  217,  217,  217,  217,  227,  227, +      227,  227,  227,  227,  227,  227,  227,  227,  227,  227, +      232,  228,  230,  234,  233,  235,  229,  236,  234,  237, +      239,  240,  242,  241,  242,  243,  245,  228,  233,  229, +      227,  227,  227,  227,  227,  227,  244,  230,  247,  251, +      252,  232,  249,  253,  250,  791,  235, 1390, 1394,  791, +      230,  241,  255,  236,  237,  245,  257,  256,  258,  266, +      260,  232,  268,  240,  234,  259,  235,  243,  236,  239, +      237,  239,  240,  242,  241,  250,  243,  245,  255,  249, + +      244,  262,  252,  256,  253,  254,  260,  244,  264,  247, +      251,  252,  267,  249,  253,  250,  259,  254,  257,  263, +      258,  261,  265,  255,  254,  263,  261,  257,  256,  258, +      266,  260,  262,  268,  270,  270,  259,  603,  271,  272, +      273, 1185,  274,  264,  275,  276,  278,  267,  279,  280, +      283,  281,  262, 1185,  276,  285,  254, 1402,  282,  264, +      286,  270,  638,  267,  271,  284,  265,  279,  274,  287, +      263,  288,  261,  265,  272,  291,  294,  290,  295,  603, +      276,  283,  292,  296,  275,  270,  285,  293,  271,  297, +      272,  273,  274,  281,  638,  275,  276,  278,  282,  279, + +      280,  283,  281,  299,  287,  284,  285,  290,  286,  282, +      288,  286,  300,  292,  301,  291,  284,  294,  293,  298, +      287,  345,  288,  296,  297,  302,  291,  294,  290,  295, +      293,  320,  319,  292,  296,  303,  361,  302,  293,  476, +      297, 1408,  398,  303,  345,  298,  476,  303,  398,  323, +      400,  302,  345,  401,  299, 1410,  400,  301,  488,  401, +      361,  303,  302,  300,  488,  301, 1411,  490,  361,  303, +      298,  319,  303,  490,  304,  302,  304,  304,  304,  304, +      304,  322,  320,  319,  305,  303,  305,  305,  305,  305, +      305,  306,  323,  306,  306,  306,  306,  306,  306,  307, + +      323,  307,  307,  307,  307,  307,  307,  318,  318,  318, +      318,  318,  318,  318,  318,  318,  318,  318,  318,  324, +      325,  327,  328,  329,  325,  322,  330,  326,  331,  896, +      330,  334,  322,  333,  338,  340,  336,  341,  332,  318, +      318,  318,  318,  318,  318,  333,  325,  326,  334,  335, +      326,  339, 1195,  350, 1195,  342,  343,  348,  335,  324, +      329,  346,  340,  347,  327,  896,  328,  350,  331,  355, +      324,  325,  327,  328,  329,  332,  351,  330,  326,  331, +      336,  352,  334,  338,  333,  338,  340,  336,  341,  332, +      342,  343,  346,  339,  348,  347,  353,  357,  355,  354, + +      335,  358,  339,  359,  350,  360,  342,  343,  348,  363, +      356,  365,  346,  356,  347,  351,  352,  354,  354,  636, +      355,  367,  362,  357,  360,  373,  364,  351,  366,  368, +      369,  365,  352,  353,  374,  370,  376,  377,  375,  356, +      358,  379,  359,  382,  363,  357,  785,  353,  360,  368, +      354,  380,  358,  362,  359,  364,  360,  366,  636,  369, +      363,  356,  365,  374,  367,  370,  785,  383,  563,  378, +      373,  805,  367,  362,  379,  563,  373,  364,  405,  366, +      368,  369,  375,  378,  382,  374,  370,  376,  377,  375, +      380,  384,  379,  383,  382,  385,  385,  385,  385,  385, + +      805,  407,  380,  404,  408, 1412,  386,  384,  386,  386, +      386,  386,  386,  386,  406,  383,  411,  384,  410,  387, +      378,  387,  387,  387,  387,  387,  387,  414,  415,  405, +     1419,  384,  416,  404,  407,  412,  413,  417,  420,  384, +      403,  403,  403,  403,  403,  403,  403,  403,  403,  403, +      403,  403,  407,  410,  404,  408,  413,  406,  411,  415, +      419,  418,  423,  421,  424,  406,  425,  411,  417,  410, +      418,  414,  403,  403,  403,  403,  403,  403,  414,  415, +      412,  416,  420,  416,  426,  436,  412,  413,  417,  420, +      421,  427,  435,  438,  440,  441,  442,  444,  439,  443, + +      434,  491,  493,  425,  447,  419,  450,  491,  493, 1420, +      448,  419,  418,  423,  421,  424,  434,  425,  439,  435, +      434,  445,  426,  453,  444,  442,  441,  446,  436,  451, +      450,  440,  445,  452,  449,  426,  436,  450,  443,  455, +      447,  427,  427,  435,  438,  440,  441,  442,  444,  439, +      443,  434,  446,  448,  449,  447,  454,  445,  451,  456, +      457,  448,  458,  453,  459,  463,  459,  446,  462,  464, +      466,  464,  445,  467,  453,  455,  497,  452,  449,  469, +      451,  459,  465,  465,  452,  449,  494,  642,  695,  458, +      455,  454,  494,  456,  471,  471,  471,  471,  471,  471, + +      498,  463,  457,  467, 1425,  462,  469,  454,  580,  470, +      456,  457, 1427,  458,  580,  459,  463,  582,  470,  462, +      464,  466,  583,  582,  467,  504,  695,  497,  583,  642, +      469,  496,  500,  465,  470,  472,  472,  472,  472,  472, +      472,  473,  470,  473,  473,  473,  473,  473,  473,  470, +      474,  498,  474,  474,  474,  474,  474,  474,  495,  495, +      495,  495,  495,  495,  495,  495,  495,  495,  495,  495, +      500,  496,  501,  502,  503,  505,  504,  506,  511,  507, +      508,  509,  496,  500,  507,  510,  513, 1428,  507,  515, +      495,  495,  495,  495,  495,  495,  522,  506,  514,  508, + +      523,  527,  525,  532,  528,  524,  529,  501,  529,  503, +      533,  502,  509,  530,  531,  536,  510, 1429,  505,  539, +      515,  585,  511,  501,  502,  503,  505,  585,  506,  511, +      507,  508,  509,  514,  524,  528,  510,  513,  522,  540, +      515,  527,  523,  525,  531,  537,  532,  522,  538,  514, +      537,  523,  527,  525,  532,  528,  524,  529,  535,  530, +      535,  533,  539,  535,  530,  531,  536,  541,  542,  543, +      539,  544,  545,  535,  538,  554,  537,  546,  724,  547, +      548,  551,  552,  586,  553,  557,  587,  555,  540,  586, +      540,  544,  587,  597,  538,  554,  537,  588,  622,  545, + +      543,  676, 1421,  588,  541,  678,  542,  676,  558,  535, +      604,  678,  551,  552,  557, 1421,  724,  622,  541,  542, +      543,  546,  544,  545,  547,  548,  554,  555,  546,  553, +      547,  548,  551,  552,  558,  553,  557,  597,  555,  559, +      559,  559,  559,  559,  560,  604,  560,  560,  560,  560, +      560,  560,  599,  561,  558,  561,  561,  561,  561,  561, +      561,  590,  590,  590,  590,  590,  590,  590,  590,  590, +      590,  590,  590,  606,  614,  616,  621,  627,  624,  625, +      623,  633,  629,  634,  637,  635,  643,  628,  649,  649, +      649,  649,  649,  590,  590,  590,  590,  590,  590,  623, + +      599,  628,  639,  644,  654,  648,  616,  629,  806, 1430, +      679,  654,  633,  689,  614,  637,  679,  606, 1431,  629, +      635,  621,  624,  627,  625,  680,  628,  634,  681, 1432, +      643,  680,  689,  639,  681,  644,  648,  806,  628,  650, +      650,  650,  650,  650,  651,  691,  651,  651,  651,  651, +      651,  651,  652,  692,  652,  652,  652,  652,  652,  652, +      682,  683,  685,  686,  687,  693,  682,  683,  685,  686, +      687,  688,  688,  688,  688,  688,  688,  688,  688,  688, +      688,  688,  688,  694,  692,  691,  696,  697,  699,  700, +      709,  710,  701,  714,  713,  715,  693,  717,  720,  722, + +      725,  728,  782,  688,  688,  688,  688,  688,  688,  718, +      719,  721,  727,  731,  738,  802,  700,  786,  720,  699, +      824,  738,  765,  710, 1433,  694,  713,  824,  765,  717, +      696,  697,  701,  714,  709,  715,  784,  782, 1434,  722, +      718,  719,  721,  725,  727,  731,  728,  802,  735,  720, +      735,  735,  735,  735,  735,  735,  736,  786,  736,  736, +      736,  736,  736,  736,  767,  768,  770,  771,  772,  774, +      767,  768,  770,  771,  772,  774,  775,  776,  777,  778, +      779,  784,  775,  776,  777,  778,  779,  781,  781,  781, +      781,  781,  781,  781,  781,  781,  781,  781,  781,  787, + +      788,  789,  790,  793,  794,  801,  803,  808,  804,  807, +      809,  812,  813,  814,  815,  818,  876,  816,  875,  781, +      781,  781,  781,  781,  781,  820,  909,  817,  819,  855, +      857,  788,  789,  790,  883,  855,  857,  803, 1435,  787, +      804,  807, 1436,  794,  814,  801,  808,  793,  816,  815, +      876, 1292,  809,  909, 1292,  858,  812,  813,  817,  819, +      818,  858,  875, 1437, 1438,  883,  821,  820,  821,  821, +      821,  821,  821,  821,  822,  874,  822,  822,  822,  822, +      822,  822,  860,  861,  862,  863,  864,  865,  860,  861, +      862,  863,  864,  865,  866,  867,  869,  870,  871,  872, + +      866,  867,  869,  870,  871,  872,  873,  873,  873,  873, +      873,  873,  873,  873,  873,  873,  873,  873,  877,  878, +      879,  884,  880,  881,  892,  874,  885,  893,  895,  899, +      897,  901,  900,  904,  905,  906,  898,  902,  873,  873, +      873,  873,  873,  873,  908,  885,  907,  998,  913,  972, +      975,  949,  951,  892,  906,  913,  884,  949,  951,  895, +      879, 1439,  893,  877,  880,  881,  897,  898,  878,  902, +     1440, 1441, 1442,  899,  900,  901,  905,  904,  907,  998, +      972, 1443, 1444,  977, 1445,  910,  908,  910,  910,  910, +      910,  910,  910,  911,  975,  911,  911,  911,  911,  911, + +      911,  952,  954,  955,  956,  957,  959,  952,  954,  955, +      956,  957,  959,  960,  961,  963,  964,  965,  966,  960, +      961,  963,  964,  965,  966,  967,  968,  969,  977,  982, +      974,  967,  968,  969,  971,  971,  971,  971,  971,  971, +      971,  971,  971,  971,  971,  971,  978,  979,  980,  981, +      989,  990,  991,  992,  994,  995,  996,  993,  999, 1002, +     1000, 1076, 1001, 1003, 1074, 1097,  971,  971,  971,  971, +      971,  971,  974, 1004, 1008, 1087, 1089, 1048,  982, 1000, +      990, 1008, 1003, 1048,  992,  978,  979,  980,  993,  981, +      989, 1002, 1076,  999,  991, 1089,  994, 1001,  995, 1446, + +     1097,  996, 1004, 1005, 1074, 1005, 1005, 1005, 1005, 1005, +     1005, 1006, 1087, 1006, 1006, 1006, 1006, 1006, 1006, 1050, +     1051, 1052, 1053, 1054, 1055, 1050, 1051, 1052, 1053, 1054, +     1055, 1057, 1058, 1059, 1060, 1061, 1062, 1057, 1058, 1059, +     1060, 1061, 1062, 1063, 1064, 1065, 1066, 1068, 1069, 1063, +     1064, 1065, 1066, 1068, 1069, 1070, 1071, 1077, 1078, 1079, +     1080, 1070, 1071, 1072, 1072, 1072, 1072, 1072, 1072, 1072, +     1072, 1072, 1072, 1072, 1072, 1081, 1082, 1088, 1090, 1091, +     1094, 1095, 1098, 1088, 1092, 1078, 1079, 1096, 1101, 1099, +     1100, 1182, 1183, 1080, 1405, 1072, 1072, 1072, 1072, 1072, + +     1072, 1077, 1102, 1092, 1102, 1102, 1102, 1102, 1102, 1102, +     1105, 1209, 1095, 1447, 1081, 1082, 1448, 1105, 1209, 1094, +     1099, 1405, 1090, 1091, 1101, 1100, 1449, 1096, 1182, 1183, +     1450, 1103, 1098, 1103, 1103, 1103, 1103, 1103, 1103, 1150, +     1152, 1153, 1155, 1156, 1157, 1150, 1152, 1153, 1155, 1156, +     1157, 1159, 1160, 1161, 1162, 1163, 1164, 1159, 1160, 1161, +     1162, 1163, 1164, 1166, 1167, 1168, 1170, 1171, 1172, 1166, +     1167, 1168, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1179, +     1180, 1173, 1174, 1175, 1176, 1178, 1178, 1178, 1178, 1178, +     1178, 1178, 1178, 1178, 1178, 1178, 1178, 1184, 1186, 1192, + +     1193, 1196, 1197, 1199, 1200, 1201, 1202, 1198, 1203, 1204, +     1258, 1205, 1298, 1290, 1409, 1293, 1258, 1178, 1178, 1178, +     1178, 1178, 1178, 1180, 1179, 1198, 1260, 1186, 1261, 1451, +     1303, 1452, 1260, 1197, 1261, 1193, 1196, 1202, 1263, 1192, +     1453, 1184, 1264, 1200, 1263, 1199, 1205, 1265, 1264, 1293, +     1203, 1266, 1409, 1265, 1298, 1201, 1290, 1266, 1206, 1204, +     1206, 1206, 1206, 1206, 1206, 1206, 1207, 1303, 1207, 1207, +     1207, 1207, 1207, 1207, 1267, 1268, 1269, 1270, 1272, 1273, +     1267, 1268, 1269, 1270, 1272, 1273, 1274, 1275, 1276, 1277, +     1278, 1279, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, + +     1282, 1284, 1285, 1286, 1280, 1281, 1282, 1284, 1285, 1286, +     1287, 1289, 1294, 1299, 1300, 1301, 1287, 1288, 1288, 1288, +     1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1302, +     1304, 1306, 1311, 1307, 1310, 1312, 1315, 1312, 1312, 1312, +     1312, 1312, 1312, 1315, 1289, 1454, 1413, 1294, 1426, 1288, +     1288, 1288, 1288, 1288, 1288, 1426, 1369, 1455, 1456, 1300, +     1301, 1304, 1369, 1299, 1307, 1310, 1371, 1372, 1457, 1374, +     1375, 1311, 1371, 1372, 1306, 1374, 1375, 1413, 1313, 1302, +     1313, 1313, 1313, 1313, 1313, 1313, 1376, 1377, 1379, 1380, +     1381, 1383, 1376, 1377, 1379, 1380, 1381, 1383, 1384, 1385, + +     1386, 1387, 1388, 1389, 1384, 1385, 1386, 1387, 1388, 1389, +     1391, 1392, 1393, 1395, 1396, 1397, 1391, 1392, 1393, 1395, +     1396, 1397, 1398, 1399, 1400, 1401, 1404, 1406, 1398, 1399, +     1400, 1401, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, +     1403, 1403, 1403, 1403, 1407, 1414, 1415, 1417, 1416, 1418, +     1422, 1458, 1459, 1460, 1406, 1461, 1462, 1463, 1464, 1465, +     1404, 1466, 1467, 1468, 1403, 1403, 1403, 1403, 1403, 1403, +     1469, 1407, 1470, 1471, 1472, 1473, 1474, 1414, 1415, 1416, +     1475, 1476, 1417, 1422, 1423, 1477, 1423, 1423, 1423, 1423, +     1423, 1423, 1418, 1424, 1478, 1424, 1424, 1424, 1424, 1424, + +     1424, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, +     1488, 1489, 1484, 1490, 1486, 1487, 1488, 1489, 1491, 1490, +     1492, 1493, 1494, 1495, 1491, 1496, 1497, 1493, 1494, 1495, +     1498, 1496, 1497, 1499, 1500, 1501, 1498, 1502, 1503, 1499, +     1500, 1501, 1504, 1502, 1505, 1506, 1507, 1508, 1504, 1509, +     1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, 1513, 1514, +     1510, 1515, 1511, 1512, 1513, 1514, 1516, 1517, 1518, 1519, +     1521, 1522, 1516, 1517, 1518, 1519, 1520, 1520, 1520, 1520, +     1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1523, 1524, +     1525, 1526, 1527, 1528, 1529, 1530, 1532, 1533, 1535, 1538, + +     1539, 1531, 1534, 1540, 1522, 1541, 1542, 1539, 1520, 1520, +     1520, 1520, 1520, 1520, 1531, 1543, 1544, 1523, 1524, 1545, +     1546, 1547, 1548, 1532, 1549, 1525, 1529, 1530, 1536, 1534, +     1536, 1536, 1536, 1536, 1536, 1536, 1537, 1550, 1537, 1537, +     1537, 1537, 1537, 1537, 1551, 1552, 1533, 1553, 1554, 1555, +     1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, +     1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, +     1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, +     1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, +     1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + +     1600, 1606, 1602, 1603, 1607, 1605, 1608, 1606, 1609, 1610, +     1607, 1611, 1612, 1613, 1609, 1610, 1614, 1611, 1612, 1613, +     1615, 1616, 1614, 1617, 1618, 1619, 1620, 1616, 1621, 1617, +     1618, 1622, 1620, 1623, 1621, 1624, 1625, 1622, 1626, 1623, +     1627, 1624, 1625, 1628, 1626, 1629, 1630, 1631, 1632, 1628, +     1633, 1629, 1630, 1634, 1632, 1635, 1633, 1636, 1637, 1634, +     1638, 1635, 1639, 1636, 1637, 1641, 1638, 1640, 1640, 1640, +     1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1642, +     1643, 1644, 1645, 1646, 1647, 1648, 1652, 1651, 1655, 1657, +     1649, 1650, 1658, 1659, 1660, 1655, 1641, 1661, 1662, 1640, + +     1640, 1640, 1640, 1640, 1640, 1653, 1664, 1653, 1653, 1653, +     1653, 1653, 1653, 1642, 1643, 1647, 1648, 1649, 1665, 1650, +     1656, 1663, 1666, 1667, 1668, 1644, 1651, 1656, 1663, 1669, +     1670, 1671, 1672, 1654, 1652, 1654, 1654, 1654, 1654, 1654, +     1654, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, +     1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, +     1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, +     1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, +     1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, +     1722, 1723, 1724, 1719, 1725, 1721, 1722, 1726, 1724, 1727, + +     1725, 1728, 1729, 1726, 1730, 1727, 1731, 1728, 1729, 1732, +     1730, 1733, 1731, 1734, 1735, 1736, 1737, 1733, 1738, 1734, +     1735, 1736, 1737, 1739, 1738, 1740, 1741, 1742, 1743, 1739, +     1744, 1740, 1741, 1742, 1743, 1745, 1746, 1747, 1748, 1749, +     1750, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, +     1754, 1755, 1756, 1751, 1752, 1753, 1754, 1755, 1757, 1758, +     1759, 1760, 1763, 1762, 1757, 1758, 1759, 1760, 1761, 1761, +     1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, +     1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, +     1776, 1777, 1778, 1763, 1779, 1780, 1773, 1776, 1781, 1782, + +     1761, 1761, 1761, 1761, 1761, 1761, 1762, 1783, 1784, 1785, +     1786, 1764, 1787, 1788, 1789, 1790, 1774, 1772, 1774, 1774, +     1774, 1774, 1774, 1774, 1771, 1791, 1768, 1769, 1792, 1793, +     1794, 1795, 1796, 1775, 1770, 1775, 1775, 1775, 1775, 1775, +     1775, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, +     1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, +     1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, +     1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, +     1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, +     1840, 1846, 1842, 1843, 1844, 1845, 1847, 1846, 1848, 1849, + +     1850, 1851, 1852, 1853, 1848, 1849, 1850, 1854, 1852, 1853, +     1855, 1856, 1857, 1854, 1858, 1859, 1855, 1856, 1857, 1860, +     1858, 1861, 1862, 1863, 1864, 1860, 1865, 1861, 1862, 1866, +     1864, 1867, 1865, 1868, 1869, 1866, 1870, 1867, 1871, 1868, +     1869, 1872, 1870, 1873, 1874, 1875, 1876, 1872, 1877, 1873, +     1874, 1878, 1876, 1879, 1877, 1880, 1881, 1878, 1882, 1879, +     1883, 1880, 1881, 1885, 1882, 1884, 1884, 1884, 1884, 1884, +     1884, 1884, 1884, 1884, 1884, 1884, 1884, 1886, 1887, 1888, +     1889, 1890, 1891, 1892, 1893, 1894, 1895, 1898, 1899, 1896, +     1892, 1896, 1896, 1896, 1896, 1896, 1896, 1884, 1884, 1884, + +     1884, 1884, 1884, 1897, 1900, 1897, 1897, 1897, 1897, 1897, +     1897, 1901, 1902, 1903, 1904, 1893, 1905, 1906, 1907, 1908, +     1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1895, 1917, +     1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, +     1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, +     1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, +     1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, +     1958, 1959, 1960, 1961, 1962, 1963, 1964, 1959, 1960, 1961, +     1962, 1965, 1964, 1966, 1967, 1968, 1969, 1965, 1970, 1966, +     1967, 1968, 1969, 1971, 1970, 1972, 1973, 1974, 1975, 1971, + +     1976, 1972, 1973, 1977, 1975, 1978, 1976, 1979, 1980, 1977, +     1981, 1978, 1982, 1979, 1980, 1983, 1981, 1984, 1982, 1985, +     1986, 1983, 1987, 1984, 1988, 1985, 1989, 1990, 1987, 1991, +     1988, 1992, 1989, 1990, 1993, 1991, 1994, 1992, 1995, 1996, +     1993, 1997, 1994, 1998, 1995, 1996, 1999, 1997, 2000, 2001, +     2002, 2004, 1999, 2005, 2000, 2001, 2002, 2003, 2003, 2003, +     2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2006, +     2007, 2009, 2008, 2009, 2009, 2009, 2009, 2009, 2009, 2010, +     2011, 2010, 2010, 2010, 2010, 2010, 2010, 2012, 2013, 2003, +     2003, 2003, 2003, 2003, 2003, 2014, 2015, 2016, 2017, 2018, + +     2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, +     2029, 2006, 2008, 2030, 2031, 2032, 2033, 2034, 2035, 2036,       2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, -     2041, 2042, 2043, 2047, 2045, 2046, 2048, 2049, 2050, 2047, -     2051, 2052, 2048, 2049, 2050, 2053, 2051, 2054, 2055, 2056, - -     2057, 2053, 2058, 2054, 2055, 2059, 2057, 2060, 2058, 2061, -     2062, 2059, 2063, 2060, 2064, 2061, 2062, 2065, 2063, 2066, -     2067, 2068, 2069, 2065, 2070, 2066, 2067, 2071, 2069, 2072, -     2070, 2073, 2074, 2071, 2075, 2072, 2076, 2073, 2074, 2078, -     2075, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, -     2077, 2077, 2077, 2079, 2080, 2081, 2082, 2084, 2082, 2082, -     2082, 2082, 2082, 2082, 2083, 2085, 2083, 2083, 2083, 2083, -     2083, 2083, 2086, 2077, 2077, 2077, 2077, 2077, 2077, 2087, -     2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, -     2098, 2099, 2100, 2101, 2080, 2102, 2103, 2104, 2105, 2106, - -     2107, 2108, 2081, 2109, 2110, 2111, 2112, 2113, 2114, 2115, -     2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, -     2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, -     2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2138, 2139, -     2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, -     2144, 2145, 2146, 2147, 2150, 2149, 2151, 2152, 2153, 2154, -     2150, 2155, 2151, 2152, 2153, 2154, 2156, 2155, 2157, 2158, -     2159, 2160, 2156, 2161, 2157, 2158, 2159, 2162, 2163, 2161, -     2164, 2165, 2166, 2162, 2163, 2167, 2164, 2165, 2166, 2168, -     2169, 2167, 2170, 2171, 2172, 2168, 2169, 2173, 2170, 2171, - -     2174, 2175, 2176, 2173, 2178, 2179, 2174, 2175, 2176, 2177, -     2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, -     2177, 2180, 2181, 2182, 2184, 2182, 2182, 2182, 2182, 2182, -     2182, 2183, 2185, 2183, 2183, 2183, 2183, 2183, 2183, 2186, -     2187, 2177, 2177, 2177, 2177, 2177, 2177, 2188, 2189, 2190, -     2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, -     2201, 2181, 2202, 2203, 2204, 2205, 2181, 2206, 2180, 2207, -     2203, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, -     2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, -     2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, - -     2237, 2232, 2233, 2234, 2238, 2236, 2237, 2239, 2240, 2241, -     2238, 2242, 2243, 2239, 2240, 2241, 2244, 2242, 2243, 2245, -     2246, 2247, 2248, 2249, 2250, 2245, 2246, 2247, 2251, 2249, -     2250, 2252, 2253, 2254, 2251, 2255, 2256, 2252, 2253, 2254, -     2257, 2255, 2258, 2259, 2260, 2261, 2257, 2262, 2258, 2259, -     2263, 2261, 2264, 2262, 2265, 2266, 2263, 2267, 2264, 2268, -     2265, 2266, 2272, 2267, 2269, 2269, 2269, 2269, 2269, 2269, -     2269, 2269, 2269, 2269, 2269, 2269, 2273, 2274, 2275, 2277, -     2275, 2275, 2275, 2275, 2275, 2275, 2276, 2278, 2276, 2276, -     2276, 2276, 2276, 2276, 2279, 2280, 2269, 2269, 2269, 2269, - -     2269, 2269, 2281, 2282, 2283, 2284, 2272, 2285, 2286, 2287, -     2288, 2274, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, -     2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, -     2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, -     2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2319, 2320, -     2321, 2322, 2323, 2325, 2326, 2327, 2328, 2329, 2330, 2325, -     2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, -     2336, 2331, 2332, 2333, 2334, 2335, 2337, 2338, 2339, 2340, -     2341, 2342, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, -     2345, 2346, 2347, 2348, 2343, 2344, 2345, 2346, 2347, 2349, - -     2350, 2351, 2352, 2354, 2355, 2349, 2350, 2351, 2352, 2353, -     2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, -     2353, 2356, 2358, 2356, 2356, 2356, 2356, 2356, 2356, 2357, -     2359, 2357, 2357, 2357, 2357, 2357, 2357, 2354, 2360, 2361, -     2362, 2353, 2353, 2353, 2353, 2353, 2353, 2363, 2364, 2365, -     2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, -     2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, -     2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, -     2396, 2397, 2398, 2399, 2400, 2395, 2396, 2397, 2398, 2399, -     2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2402, 2403, - -     2404, 2408, 2406, 2407, 2409, 2410, 2411, 2408, 2412, 2413, -     2409, 2410, 2411, 2414, 2412, 2415, 2416, 2417, 2418, 2414, -     2419, 2415, 2416, 2420, 2418, 2421, 2419, 2422, 2423, 2420, -     2424, 2421, 2425, 2422, 2423, 2427, 2424, 2426, 2426, 2426, -     2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2428, -     2430, 2428, 2428, 2428, 2428, 2428, 2428, 2429, 2431, 2429, -     2429, 2429, 2429, 2429, 2429, 2432, 2433, 2434, 2435, 2426, -     2426, 2426, 2426, 2426, 2426, 2436, 2437, 2438, 2439, 2440, -     2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, -     2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, - -     2461, 2462, 2463, 2464, 2465, 2466, 2467, 2462, 2463, 2464, -     2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2468, -     2469, 2470, 2471, 2474, 2473, 2475, 2476, 2477, 2478, 2474, -     2479, 2475, 2476, 2477, 2478, 2480, 2479, 2481, 2482, 2483, -     2484, 2480, 2485, 2481, 2482, 2483, 2486, 2487, 2485, 2488, -     2492, 2493, 2486, 2487, 2494, 2488, 2489, 2489, 2489, 2489, -     2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2490, 2495, -     2490, 2490, 2490, 2490, 2490, 2490, 2491, 2496, 2491, 2491, -     2491, 2491, 2491, 2491, 2497, 2498, 2499, 2500, 2489, 2489, -     2489, 2489, 2489, 2489, 2501, 2502, 2503, 2504, 2505, 2506, - -     2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, -     2517, 2518, 2519, 2520, 2521, 2522, 2523, 2518, 2519, 2520, -     2524, 2522, 2523, 2525, 2526, 2527, 2524, 2528, 2529, 2525, -     2526, 2527, 2530, 2528, 2529, 2531, 2532, 2533, 2534, 2535, -     2536, 2531, 2532, 2533, 2537, 2535, 2536, 2538, 2539, 2540, -     2537, 2541, 2542, 2538, 2539, 2540, 2546, 2541, 2543, 2543, -     2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, -     2544, 2547, 2544, 2544, 2544, 2544, 2544, 2544, 2545, 2548, -     2545, 2545, 2545, 2545, 2545, 2545, 2549, 2550, 2551, 2552, -     2543, 2543, 2543, 2543, 2543, 2543, 2553, 2554, 2555, 2556, - -     2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, -     2567, 2568, 2569, 2570, 2571, 2572, 2567, 2568, 2569, 2570, -     2571, 2573, 2574, 2575, 2576, 2577, 2578, 2573, 2574, 2575, -     2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2579, -     2580, 2581, 2582, 2583, 2585, 2586, 2587, 2588, 2592, 2593, -     2585, 2586, 2587, 2588, 2589, 2589, 2589, 2589, 2589, 2589, -     2589, 2589, 2589, 2589, 2589, 2589, 2590, 2594, 2590, 2590, -     2590, 2590, 2590, 2590, 2591, 2595, 2591, 2591, 2591, 2591, -     2591, 2591, 2596, 2597, 2598, 2599, 2589, 2589, 2589, 2589, -     2589, 2589, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, - -     2608, 2609, 2610, 2611, 2612, 2613, 2614, 2609, 2610, 2611, -     2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, -     2616, 2617, 2618, 2622, 2620, 2621, 2623, 2624, 2625, 2622, -     2626, 2627, 2623, 2624, 2625, 2631, 2626, 2628, 2628, 2628, -     2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2629, -     2632, 2629, 2629, 2629, 2629, 2629, 2629, 2630, 2633, 2630, -     2630, 2630, 2630, 2630, 2630, 2634, 2635, 2636, 2637, 2628, -     2628, 2628, 2628, 2628, 2628, 2638, 2639, 2640, 2641, 2642, -     2643, 2644, 2645, 2646, 2647, 2648, 2649, 2644, 2645, 2646, -     2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2650, - -     2651, 2652, 2653, 2656, 2655, 2657, 2658, 2662, 2663, 2656, -     2664, 2657, 2658, 2659, 2659, 2659, 2659, 2659, 2659, 2659, -     2659, 2659, 2659, 2659, 2659, 2660, 2665, 2660, 2660, 2660, -     2660, 2660, 2660, 2661, 2666, 2661, 2661, 2661, 2661, 2661, -     2661, 2667, 2668, 2669, 2670, 2659, 2659, 2659, 2659, 2659, -     2659, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2672, 2673, -     2674, 2678, 2676, 2677, 2679, 2680, 2681, 2678, 2682, 2683, -     2679, 2680, 2681, 2684, 2682, 2683, 2685, 2685, 2685, 2685, -     2685, 2688, 2685, 2685, 2685, 2685, 2685, 2685, 2686, 2689, -     2686, 2686, 2686, 2686, 2686, 2686, 2687, 2690, 2687, 2687, - -     2687, 2687, 2687, 2687, 2691, 2692, 2693, 2694, 2685, 2685, -     2685, 2685, 2685, 2685, 2695, 2696, 2697, 2698, 2699, 2700, -     2695, 2696, 2697, 2698, 2699, 2701, 2702, 2703, 2704, 2708, -     2709, 2701, 2702, 2703, 2704, 2705, 2705, 2705, 2705, 2705, -     2705, 2705, 2705, 2705, 2705, 2705, 2705, 2706, 2710, 2706, -     2706, 2706, 2706, 2706, 2706, 2707, 2711, 2707, 2707, 2707, -     2707, 2707, 2707, 2712, 2714, 2721, 2725, 2705, 2705, 2705, -     2705, 2705, 2705, 2713, 2713, 2713, 2713, 2713, 2715, 2716, -     2717, 2718, 2719, 2720, 2715, 2716, 2717, 2718, 2719, 2720, -     2722, 2722, 2722, 2722, 2722, 2726, 2722, 2722, 2722, 2722, - -     2722, 2722, 2723, 2729, 2723, 2723, 2723, 2723, 2723, 2723, -     2724, 2737, 2724, 2724, 2724, 2724, 2724, 2724, 2738, 1328, -     1327, 1326, 2722, 2722, 2722, 2722, 2722, 2722, 2727, 2727, -     2727, 2727, 2727, 2728, 2728, 2728, 2728, 2728, 2730, 2731, -     2732, 2733, 1325, 1324, 2730, 2731, 2732, 2733, 2734, 2734, -     2734, 2734, 2734, 1323, 2734, 2734, 2734, 2734, 2734, 2734, -     2735, 1322, 2735, 2735, 2735, 2735, 2735, 2735, 2736, 1321, -     2736, 2736, 2736, 2736, 2736, 2736, 1320, 1319, 1318, 1317, -     2734, 2734, 2734, 2734, 2734, 2734, 2739, 2740, 1316, 1315, -     1314, 1313, 2739, 2740, 2741, 2741, 2741, 2741, 2741, 1312, - -     2741, 2741, 2741, 2741, 2741, 2741, 2742, 1311, 2742, 2742, -     2742, 2742, 2742, 2742, 2743, 1310, 2743, 2743, 2743, 2743, -     2743, 2743, 1309, 1308, 1307, 1306, 2741, 2741, 2741, 2741, -     2741, 2741, 2744, 1305, 1304, 1303, 1302, 1301, 2744, 2745, -     2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, -     2745, 2746, 1300, 2746, 2746, 2746, 2746, 2746, 2746, 2747, -     1299, 2747, 2747, 2747, 2747, 2747, 2747, 1298, 1297, 1296, -     1295, 2745, 2745, 2745, 2745, 2745, 2745, 2748, 2748, 2748, -     2748, 2748, 1294, 2748, 2748, 2748, 2748, 2748, 2748, 2749, -     1293, 2749, 2749, 2749, 2749, 2749, 2749, 2750, 1292, 2750, - -     2750, 2750, 2750, 2750, 2750, 1291, 1290, 1289, 1288, 2748, -     2748, 2748, 2748, 2748, 2748, 2751, 2751, 2751, 2751, 2751, -     1287, 2751, 2751, 2751, 2751, 2751, 2751, 2752, 1286, 2752, -     2752, 2752, 2752, 2752, 2752, 2753, 1285, 2753, 2753, 2753, -     2753, 2753, 2753, 1284, 1283, 1281, 1277, 2751, 2751, 2751, -     2751, 2751, 2751, 2754, 2754, 2754, 2754, 2754, 1276, 2754, -     2754, 2754, 2754, 2754, 2754, 2755, 1273, 2755, 2755, 2755, -     2755, 2755, 2755, 2756, 1265, 2756, 2756, 2756, 2756, 2756, -     2756, 1264, 1252, 1240, 1231, 2754, 2754, 2754, 2754, 2754, -     2754, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - -     2757, 2757, 2757, 2758, 1228, 2758, 2758, 2758, 2758, 2758, -     2758, 2759, 1226, 2759, 2759, 2759, 2759, 2759, 2759, 1225, -     1224, 1223, 1222, 2757, 2757, 2757, 2757, 2757, 2757, 2760, -     2760, 2760, 2760, 2760, 1221, 2760, 2760, 2760, 2760, 2760, -     2760, 2761, 1220, 2761, 2761, 2761, 2761, 2761, 2761, 2762, -     1219, 2762, 2762, 2762, 2762, 2762, 2762, 1218, 1217, 1216, -     1215, 2760, 2760, 2760, 2760, 2760, 2760, 2763, 2763, 2763, -     2763, 2763, 1214, 2763, 2763, 2763, 2763, 2763, 2763, 2764, -     1213, 2764, 2764, 2764, 2764, 2764, 2764, 2765, 1212, 2765, -     2765, 2765, 2765, 2765, 2765, 1211, 1210, 1209, 1208, 2763, - -     2763, 2763, 2763, 2763, 2763, 2766, 2766, 2766, 2766, 2766, -     1207, 2766, 2766, 2766, 2766, 2766, 2766, 2767, 1206, 2767, -     2767, 2767, 2767, 2767, 2767, 2768, 1205, 2768, 2768, 2768, -     2768, 2768, 2768, 1204, 1203, 1202, 1201, 2766, 2766, 2766, -     2766, 2766, 2766, 2769, 2769, 2769, 2769, 2769, 2769, 2769, -     2769, 2769, 2769, 2769, 2769, 2770, 1200, 2770, 2770, 2770, -     2770, 2770, 2770, 2771, 1199, 2771, 2771, 2771, 2771, 2771, -     2771, 1198, 1197, 1196, 1195, 2769, 2769, 2769, 2769, 2769, -     2769, 2772, 2772, 2772, 2772, 2772, 1194, 2772, 2772, 2772, -     2772, 2772, 2772, 2773, 1193, 2773, 2773, 2773, 2773, 2773, - -     2773, 2774, 1192, 2774, 2774, 2774, 2774, 2774, 2774, 1191, -     1190, 1189, 1188, 2772, 2772, 2772, 2772, 2772, 2772, 2775, -     2775, 2775, 2775, 2775, 1187, 2775, 2775, 2775, 2775, 2775, -     2775, 2776, 1186, 2776, 2776, 2776, 2776, 2776, 2776, 2777, -     1185, 2777, 2777, 2777, 2777, 2777, 2777, 1184, 1183, 1182, -     1181, 2775, 2775, 2775, 2775, 2775, 2775, 2778, 2778, 2778, -     2778, 2778, 1180, 2778, 2778, 2778, 2778, 2778, 2778, 2779, -     1179, 2779, 2779, 2779, 2779, 2779, 2779, 2780, 1177, 2780, -     2780, 2780, 2780, 2780, 2780, 1161, 1159, 1157, 1152, 2778, -     2778, 2778, 2778, 2778, 2778, 2781, 2781, 2781, 2781, 2781, - -     2781, 2781, 2781, 2781, 2781, 2781, 2781, 2782, 1148, 2782, -     2782, 2782, 2782, 2782, 2782, 2783, 1140, 2783, 2783, 2783, -     2783, 2783, 2783, 1136, 1129, 1125, 1122, 2781, 2781, 2781, -     2781, 2781, 2781, 2784, 2784, 2784, 2784, 2784, 1120, 2784, -     2784, 2784, 2784, 2784, 2784, 2785, 1119, 2785, 2785, 2785, -     2785, 2785, 2785, 2786, 1118, 2786, 2786, 2786, 2786, 2786, -     2786, 1117, 1116, 1115, 1114, 2784, 2784, 2784, 2784, 2784, -     2784, 2787, 2787, 2787, 2787, 2787, 1113, 2787, 2787, 2787, -     2787, 2787, 2787, 2788, 1112, 2788, 2788, 2788, 2788, 2788, -     2788, 2789, 1111, 2789, 2789, 2789, 2789, 2789, 2789, 1110, - -     1109, 1108, 1107, 2787, 2787, 2787, 2787, 2787, 2787, 2790, -     2790, 2790, 2790, 2790, 1106, 2790, 2790, 2790, 2790, 2790, -     2790, 2791, 1105, 2791, 2791, 2791, 2791, 2791, 2791, 2792, -     1104, 2792, 2792, 2792, 2792, 2792, 2792, 1103, 1102, 1101, -     1100, 2790, 2790, 2790, 2790, 2790, 2790, 2793, 2793, 2793, -     2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2794, -     1099, 2794, 2794, 2794, 2794, 2794, 2794, 2795, 1098, 2795, -     2795, 2795, 2795, 2795, 2795, 1097, 1096, 1095, 1094, 2793, -     2793, 2793, 2793, 2793, 2793, 2796, 2796, 2796, 2796, 2796, -     1093, 2796, 2796, 2796, 2796, 2796, 2796, 2797, 1092, 2797, - -     2797, 2797, 2797, 2797, 2797, 2798, 1091, 2798, 2798, 2798, -     2798, 2798, 2798, 1090, 1089, 1088, 1087, 2796, 2796, 2796, -     2796, 2796, 2796, 2799, 2799, 2799, 2799, 2799, 1086, 2799, -     2799, 2799, 2799, 2799, 2799, 2800, 1085, 2800, 2800, 2800, -     2800, 2800, 2800, 2801, 1084, 2801, 2801, 2801, 2801, 2801, -     2801, 1083, 1082, 1081, 1080, 2799, 2799, 2799, 2799, 2799, -     2799, 2802, 2802, 2802, 2802, 2802, 1079, 2802, 2802, 2802, -     2802, 2802, 2802, 2803, 1078, 2803, 2803, 2803, 2803, 2803, -     2803, 2804, 1077, 2804, 2804, 2804, 2804, 2804, 2804, 1075, -     1058, 1057, 1056, 2802, 2802, 2802, 2802, 2802, 2802, 2805, - -     2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, -     2805, 2806, 1055, 2806, 2806, 2806, 2806, 2806, 2806, 2807, -     1048, 2807, 2807, 2807, 2807, 2807, 2807, 1046, 1040, 1029, -     1022, 2805, 2805, 2805, 2805, 2805, 2805, 2808, 2808, 2808, -     2808, 2808, 1020, 2808, 2808, 2808, 2808, 2808, 2808, 2809, -     1019, 2809, 2809, 2809, 2809, 2809, 2809, 2810, 1018, 2810, -     2810, 2810, 2810, 2810, 2810, 1017, 1016, 1015, 1014, 2808, -     2808, 2808, 2808, 2808, 2808, 2811, 2811, 2811, 2811, 2811, -     1013, 2811, 2811, 2811, 2811, 2811, 2811, 2812, 1012, 2812, -     2812, 2812, 2812, 2812, 2812, 2813, 1011, 2813, 2813, 2813, - -     2813, 2813, 2813, 1010, 1009, 1008, 1007, 2811, 2811, 2811, -     2811, 2811, 2811, 2814, 2814, 2814, 2814, 2814, 1006, 2814, -     2814, 2814, 2814, 2814, 2814, 2815, 1005, 2815, 2815, 2815, -     2815, 2815, 2815, 2816, 1004, 2816, 2816, 2816, 2816, 2816, -     2816, 1003, 1002, 1001, 1000, 2814, 2814, 2814, 2814, 2814, -     2814, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, -     2817, 2817, 2817, 2818,  999, 2818, 2818, 2818, 2818, 2818, -     2818, 2819,  998, 2819, 2819, 2819, 2819, 2819, 2819,  997, -      996,  995,  994, 2817, 2817, 2817, 2817, 2817, 2817, 2820, -     2820, 2820, 2820, 2820,  993, 2820, 2820, 2820, 2820, 2820, - -     2820, 2821,  992, 2821, 2821, 2821, 2821, 2821, 2821, 2822, -      991, 2822, 2822, 2822, 2822, 2822, 2822,  990,  989,  988, -      987, 2820, 2820, 2820, 2820, 2820, 2820, 2823, 2823, 2823, -     2823, 2823,  986, 2823, 2823, 2823, 2823, 2823, 2823, 2824, -      985, 2824, 2824, 2824, 2824, 2824, 2824, 2825,  984, 2825, -     2825, 2825, 2825, 2825, 2825,  983,  982,  980,  971, 2823, -     2823, 2823, 2823, 2823, 2823, 2826, 2826, 2826, 2826, 2826, -      962, 2826, 2826, 2826, 2826, 2826, 2826, 2827,  960, 2827, -     2827, 2827, 2827, 2827, 2828,  959, 2828, 2828, 2828, 2828, -     2828,  957,  948,  945,  937,  933,  928, 2826, 2826, 2826, - -     2826, 2826, 2826, 2830, 2830, 2830, 2830, 2830, 2830, 2830, -     2830, 2831,  925, 2831, 2831, 2831, 2831, 2831, 2831, 2832, -      923, 2832, 2832, 2833,  922, 2833, 2833, 2833, 2833, 2834, -      921, 2834, 2834, 2835, 2835, 2836, 2836, 2837,  920, 2837, -     2837, 2838, 2838, 2839, 2839, 2840, 2840, 2840, 2841,  919, -     2841, 2841, 2842, 2842, 2843, 2843, 2844, 2844, 2845, 2845, -     2846, 2846, 2846, 2847, 2847, 2848,  918, 2848, 2848, 2849, -     2849, 2850, 2850, 2851, 2851, 2852, 2852, 2853, 2853, 2854, -     2854, 2855, 2855, 2855, 2856, 2856, 2857, 2857, 2857, 2858, -      917, 2858, 2858, 2859, 2859, 2860, 2860, 2861, 2861, 2862, - -     2862, 2863, 2863, 2864, 2864, 2865, 2865, 2866, 2866, 2867, -     2867, 2868, 2868, 2868, 2869, 2869, 2870, 2870, 2870, 2871, -     2871, 2871, 2872, 2872, 2873,  916, 2873, 2873, 2874, 2874, -     2875, 2875, 2876, 2876, 2877, 2877, 2878, 2878, 2879, 2879, -     2880, 2880, 2881, 2881, 2882, 2882, 2883, 2883, 2884, 2884, -     2885, 2885, 2886, 2886, 2886, 2887, 2887, 2888, 2888, 2888, -     2889, 2889, 2889, 2890, 2890, 2891, 2891, 2891, 2892, 2892, -     2892, 2893,  915, 2893, 2893, 2894, 2894, 2895, 2895, 2896, -     2896, 2897, 2897, 2898, 2898, 2899, 2899, 2900, 2900, 2901, -     2901, 2902, 2902, 2903, 2903, 2904, 2904, 2905, 2905, 2906, - -     2906, 2907, 2907, 2908, 2908, 2909, 2909, 2910, 2910, 2911, -     2911, 2911, 2912, 2912, 2913, 2913, 2913, 2914, 2914, 2914, -     2915, 2915, 2916, 2916, 2916, 2917, 2917, 2917, 2918, 2918, -     2918, 2919, 2919, 2919, 2920, 2920, 2921,  914, 2921, 2921, -     2921, 2922,  913, 2922, 2922, 2923, 2923, 2924, 2924, 2925, -     2925, 2926, 2926, 2927, 2927, 2928, 2928, 2929, 2929, 2930, -     2930, 2931, 2931, 2932, 2932, 2933, 2933, 2934, 2934, 2935, -     2935, 2936, 2936, 2937, 2937, 2938, 2938, 2939, 2939, 2940, -     2940, 2941, 2941, 2942, 2942, 2943, 2943, 2944, 2944, 2944, -     2945, 2945, 2946, 2946, 2946, 2947, 2947, 2947, 2948, 2948, - -     2948, 2949, 2949, 2949, 2950, 2950, 2950, 2951, 2951, 2951, -     2952, 2952, 2953, 2953, 2953, 2954, 2954, 2954, 2955, 2955, -     2955, 2956,  912, 2956, 2956, 2956, 2957,  911, 2957, 2957, -     2958, 2958, 2959, 2959, 2960, 2960, 2961, 2961, 2962, 2962, -     2963, 2963, 2964, 2964, 2965, 2965, 2966, 2966, 2967, 2967, -     2968, 2968, 2969, 2969, 2970, 2970, 2971, 2971, 2972, 2972, -     2973, 2973, 2974, 2974, 2975, 2975, 2976, 2976, 2977, 2977, -     2978, 2978, 2979, 2979, 2980, 2980, 2981, 2981, 2982, 2982, -     2983, 2983, 2984, 2984, 2984, 2985, 2985, 2986, 2986, 2986, -     2987, 2987, 2987, 2988, 2988, 2989, 2989, 2989, 2990, 2990, - -     2990, 2991, 2991, 2991, 2992, 2992, 2993, 2993, 2993, 2994, -     2994, 2994, 2995, 2995, 2995, 2996, 2996, 2996, 2997, 2997, -     2997, 2998, 2998, 2998, 2999, 2999, 3000,  910, 3000, 3000, -     3000, 3001,  909, 3001, 3001, 3002, 3002, 3003, 3003, 3004, -     3004, 3005, 3005, 3006, 3006, 3007, 3007, 3008, 3008, 3009, -     3009, 3010, 3010, 3011, 3011, 3012, 3012, 3013, 3013, 3014, -     3014, 3015, 3015, 3016, 3016, 3017, 3017, 3018, 3018, 3019, -     3019, 3020, 3020, 3021, 3021, 3022, 3022, 3023, 3023, 3024, -     3024, 3025, 3025, 3026, 3026, 3027, 3027, 3028, 3028, 3029, -     3029, 3030, 3030, 3031, 3031, 3031, 3032, 3032, 3033, 3033, - -     3033, 3034, 3034, 3034, 3035, 3035, 3036, 3036, 3036, 3037, -     3037, 3037, 3038, 3038, 3038, 3039, 3039, 3039, 3040, 3040, -     3040, 3041, 3041, 3041, 3042, 3042, 3042, 3043, 3043, 3043, -     3044, 3044, 3045, 3045, 3045, 3046, 3046, 3046, 3047, 3047, -     3047, 3048,  908, 3048, 3048, 3048, 3049,  907, 3049, 3049, -     3050, 3050, 3051, 3051, 3052, 3052, 3053, 3053, 3054, 3054, -     3055, 3055, 3056, 3056, 3057, 3057, 3058, 3058, 3059, 3059, -     3060, 3060, 3061, 3061, 3062, 3062, 3063, 3063, 3064, 3064, -     3065, 3065, 3066, 3066, 3067, 3067, 3068, 3068, 3069, 3069, -     3070, 3070, 3071, 3071, 3072, 3072, 3073, 3073, 3074, 3074, - -     3075, 3075, 3076, 3076, 3077, 3077, 3078, 3078, 3079, 3079, -     3080, 3080, 3081, 3081, 3082, 3082, 3083, 3083, 3084, 3084, -     3085, 3085, 3085, 3086, 3086, 3087, 3087, 3087, 3088, 3088, -     3088, 3089, 3089, 3090, 3090, 3090, 3091, 3091, 3091, 3092, -     3092, 3092, 3093, 3093, 3093, 3094, 3094, 3095, 3095, 3095, -     3096, 3096, 3096, 3097, 3097, 3097, 3098, 3098, 3099, 3099, -     3099, 3100, 3100, 3100, 3101, 3101, 3101, 3102, 3102, 3102, -     3103, 3103, 3103, 3104, 3104, 3104, 3105, 3105, 3106,  906, -     3106, 3106, 3106, 3107,  905, 3107, 3107, 3108, 3108, 3109, +     2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, +     2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, +     2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2069, 2070, +     2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, +     2081, 2076, 2077, 2078, 2082, 2080, 2081, 2083, 2084, 2085, +     2082, 2086, 2087, 2083, 2084, 2085, 2088, 2086, 2089, 2090, +     2091, 2092, 2088, 2093, 2089, 2090, 2094, 2092, 2095, 2093, + +     2096, 2097, 2094, 2098, 2095, 2099, 2096, 2097, 2100, 2098, +     2101, 2102, 2103, 2104, 2100, 2105, 2101, 2102, 2106, 2104, +     2107, 2105, 2108, 2109, 2106, 2110, 2107, 2111, 2108, 2109, +     2113, 2110, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, +     2112, 2112, 2112, 2112, 2114, 2115, 2116, 2117, 2119, 2117, +     2117, 2117, 2117, 2117, 2117, 2118, 2120, 2118, 2118, 2118, +     2118, 2118, 2118, 2121, 2112, 2112, 2112, 2112, 2112, 2112, +     2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, +     2132, 2133, 2134, 2135, 2136, 2115, 2137, 2138, 2139, 2140, +     2141, 2142, 2143, 2116, 2144, 2145, 2146, 2147, 2148, 2149, + +     2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, +     2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, +     2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2173, +     2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, +     2184, 2179, 2180, 2181, 2182, 2185, 2184, 2186, 2187, 2188, +     2189, 2185, 2190, 2186, 2187, 2188, 2189, 2191, 2190, 2192, +     2193, 2194, 2195, 2191, 2196, 2192, 2193, 2194, 2197, 2198, +     2196, 2199, 2200, 2201, 2197, 2198, 2202, 2199, 2200, 2201, +     2203, 2204, 2202, 2205, 2206, 2207, 2203, 2204, 2208, 2205, +     2206, 2209, 2210, 2211, 2208, 2213, 2214, 2209, 2210, 2211, + +     2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, +     2212, 2212, 2215, 2216, 2217, 2219, 2217, 2217, 2217, 2217, +     2217, 2217, 2218, 2220, 2218, 2218, 2218, 2218, 2218, 2218, +     2221, 2222, 2212, 2212, 2212, 2212, 2212, 2212, 2223, 2224, +     2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, +     2235, 2236, 2216, 2237, 2238, 2239, 2240, 2216, 2241, 2215, +     2242, 2238, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, +     2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, +     2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, +     2271, 2272, 2267, 2268, 2269, 2273, 2271, 2272, 2274, 2275, + +     2276, 2273, 2277, 2278, 2274, 2275, 2276, 2279, 2277, 2278, +     2280, 2281, 2282, 2283, 2284, 2285, 2280, 2281, 2282, 2286, +     2284, 2285, 2287, 2288, 2289, 2286, 2290, 2291, 2287, 2288, +     2289, 2292, 2290, 2293, 2294, 2295, 2296, 2292, 2297, 2293, +     2294, 2298, 2296, 2299, 2297, 2300, 2301, 2298, 2302, 2299, +     2303, 2300, 2301, 2307, 2302, 2304, 2304, 2304, 2304, 2304, +     2304, 2304, 2304, 2304, 2304, 2304, 2304, 2308, 2309, 2310, +     2312, 2310, 2310, 2310, 2310, 2310, 2310, 2311, 2313, 2311, +     2311, 2311, 2311, 2311, 2311, 2314, 2315, 2304, 2304, 2304, +     2304, 2304, 2304, 2316, 2317, 2318, 2319, 2307, 2320, 2321, + +     2322, 2323, 2309, 2324, 2325, 2326, 2327, 2328, 2329, 2330, +     2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, +     2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, +     2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2354, +     2355, 2356, 2357, 2358, 2360, 2361, 2362, 2363, 2364, 2365, +     2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, +     2370, 2371, 2366, 2367, 2368, 2369, 2370, 2372, 2373, 2374, +     2375, 2376, 2377, 2372, 2373, 2374, 2375, 2376, 2377, 2378, +     2379, 2380, 2381, 2382, 2383, 2378, 2379, 2380, 2381, 2382, +     2384, 2385, 2386, 2387, 2389, 2390, 2384, 2385, 2386, 2387, + +     2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, +     2388, 2388, 2391, 2393, 2391, 2391, 2391, 2391, 2391, 2391, +     2392, 2394, 2392, 2392, 2392, 2392, 2392, 2392, 2389, 2395, +     2396, 2397, 2388, 2388, 2388, 2388, 2388, 2388, 2398, 2399, +     2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, +     2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, +     2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, +     2430, 2431, 2432, 2433, 2434, 2435, 2430, 2431, 2432, 2433, +     2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2437, +     2438, 2439, 2443, 2441, 2442, 2444, 2445, 2446, 2443, 2447, + +     2448, 2444, 2445, 2446, 2449, 2447, 2450, 2451, 2452, 2453, +     2449, 2454, 2450, 2451, 2455, 2453, 2456, 2454, 2457, 2458, +     2455, 2459, 2456, 2460, 2457, 2458, 2462, 2459, 2461, 2461, +     2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, +     2463, 2465, 2463, 2463, 2463, 2463, 2463, 2463, 2464, 2466, +     2464, 2464, 2464, 2464, 2464, 2464, 2467, 2468, 2469, 2470, +     2461, 2461, 2461, 2461, 2461, 2461, 2471, 2472, 2473, 2474, +     2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, +     2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, +     2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2497, 2498, + +     2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, +     2503, 2504, 2505, 2506, 2509, 2508, 2510, 2511, 2512, 2513, +     2509, 2514, 2510, 2511, 2512, 2513, 2515, 2514, 2516, 2517, +     2518, 2519, 2515, 2520, 2516, 2517, 2518, 2521, 2522, 2520, +     2523, 2527, 2528, 2521, 2522, 2529, 2523, 2524, 2524, 2524, +     2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2525, +     2530, 2525, 2525, 2525, 2525, 2525, 2525, 2526, 2531, 2526, +     2526, 2526, 2526, 2526, 2526, 2532, 2533, 2534, 2535, 2524, +     2524, 2524, 2524, 2524, 2524, 2536, 2537, 2538, 2539, 2540, +     2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, + +     2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2553, 2554, +     2555, 2559, 2557, 2558, 2560, 2561, 2562, 2559, 2563, 2564, +     2560, 2561, 2562, 2565, 2563, 2564, 2566, 2567, 2568, 2569, +     2570, 2571, 2566, 2567, 2568, 2572, 2570, 2571, 2573, 2574, +     2575, 2572, 2576, 2577, 2573, 2574, 2575, 2581, 2576, 2578, +     2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, +     2578, 2579, 2582, 2579, 2579, 2579, 2579, 2579, 2579, 2580, +     2583, 2580, 2580, 2580, 2580, 2580, 2580, 2584, 2585, 2586, +     2587, 2578, 2578, 2578, 2578, 2578, 2578, 2588, 2589, 2590, +     2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, + +     2601, 2602, 2603, 2604, 2605, 2606, 2607, 2602, 2603, 2604, +     2605, 2606, 2608, 2609, 2610, 2611, 2612, 2613, 2608, 2609, +     2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, +     2614, 2615, 2616, 2617, 2618, 2620, 2621, 2622, 2623, 2627, +     2628, 2620, 2621, 2622, 2623, 2624, 2624, 2624, 2624, 2624, +     2624, 2624, 2624, 2624, 2624, 2624, 2624, 2625, 2629, 2625, +     2625, 2625, 2625, 2625, 2625, 2626, 2630, 2626, 2626, 2626, +     2626, 2626, 2626, 2631, 2632, 2633, 2634, 2624, 2624, 2624, +     2624, 2624, 2624, 2635, 2636, 2637, 2638, 2639, 2640, 2641, +     2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2644, 2645, + +     2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, +     2656, 2651, 2652, 2653, 2657, 2655, 2656, 2658, 2659, 2660, +     2657, 2661, 2662, 2658, 2659, 2660, 2666, 2661, 2663, 2663, +     2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, +     2664, 2667, 2664, 2664, 2664, 2664, 2664, 2664, 2665, 2668, +     2665, 2665, 2665, 2665, 2665, 2665, 2669, 2670, 2671, 2672, +     2663, 2663, 2663, 2663, 2663, 2663, 2673, 2674, 2675, 2676, +     2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2679, 2680, +     2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, +     2685, 2686, 2687, 2688, 2691, 2690, 2692, 2693, 2697, 2698, + +     2691, 2699, 2692, 2693, 2694, 2694, 2694, 2694, 2694, 2694, +     2694, 2694, 2694, 2694, 2694, 2694, 2695, 2700, 2695, 2695, +     2695, 2695, 2695, 2695, 2696, 2701, 2696, 2696, 2696, 2696, +     2696, 2696, 2702, 2703, 2704, 2705, 2694, 2694, 2694, 2694, +     2694, 2694, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2707, +     2708, 2709, 2713, 2711, 2712, 2714, 2715, 2716, 2713, 2717, +     2718, 2714, 2715, 2716, 2719, 2717, 2718, 2720, 2720, 2720, +     2720, 2720, 2723, 2720, 2720, 2720, 2720, 2720, 2720, 2721, +     2724, 2721, 2721, 2721, 2721, 2721, 2721, 2722, 2725, 2722, +     2722, 2722, 2722, 2722, 2722, 2726, 2727, 2728, 2729, 2720, + +     2720, 2720, 2720, 2720, 2720, 2730, 2731, 2732, 2733, 2734, +     2735, 2730, 2731, 2732, 2733, 2734, 2736, 2737, 2738, 2739, +     2743, 2744, 2736, 2737, 2738, 2739, 2740, 2740, 2740, 2740, +     2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2741, 2745, +     2741, 2741, 2741, 2741, 2741, 2741, 2742, 2746, 2742, 2742, +     2742, 2742, 2742, 2742, 2747, 2749, 2756, 2760, 2740, 2740, +     2740, 2740, 2740, 2740, 2748, 2748, 2748, 2748, 2748, 2750, +     2751, 2752, 2753, 2754, 2755, 2750, 2751, 2752, 2753, 2754, +     2755, 2757, 2757, 2757, 2757, 2757, 2761, 2757, 2757, 2757, +     2757, 2757, 2757, 2758, 2764, 2758, 2758, 2758, 2758, 2758, + +     2758, 2759, 2772, 2759, 2759, 2759, 2759, 2759, 2759, 2773, +     1360, 1359, 1358, 2757, 2757, 2757, 2757, 2757, 2757, 2762, +     2762, 2762, 2762, 2762, 2763, 2763, 2763, 2763, 2763, 2765, +     2766, 2767, 2768, 1357, 1356, 2765, 2766, 2767, 2768, 2769, +     2769, 2769, 2769, 2769, 1355, 2769, 2769, 2769, 2769, 2769, +     2769, 2770, 1354, 2770, 2770, 2770, 2770, 2770, 2770, 2771, +     1353, 2771, 2771, 2771, 2771, 2771, 2771, 1352, 1351, 1350, +     1349, 2769, 2769, 2769, 2769, 2769, 2769, 2774, 2775, 1348, +     1347, 1346, 1345, 2774, 2775, 2776, 2776, 2776, 2776, 2776, +     1344, 2776, 2776, 2776, 2776, 2776, 2776, 2777, 1343, 2777, + +     2777, 2777, 2777, 2777, 2777, 2778, 1342, 2778, 2778, 2778, +     2778, 2778, 2778, 1341, 1340, 1339, 1338, 2776, 2776, 2776, +     2776, 2776, 2776, 2779, 1337, 1336, 1335, 1334, 1333, 2779, +     2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, +     2780, 2780, 2781, 1332, 2781, 2781, 2781, 2781, 2781, 2781, +     2782, 1331, 2782, 2782, 2782, 2782, 2782, 2782, 1330, 1329, +     1328, 1327, 2780, 2780, 2780, 2780, 2780, 2780, 2783, 2783, +     2783, 2783, 2783, 1326, 2783, 2783, 2783, 2783, 2783, 2783, +     2784, 1325, 2784, 2784, 2784, 2784, 2784, 2784, 2785, 1324, +     2785, 2785, 2785, 2785, 2785, 2785, 1323, 1322, 1321, 1320, + +     2783, 2783, 2783, 2783, 2783, 2783, 2786, 2786, 2786, 2786, +     2786, 1319, 2786, 2786, 2786, 2786, 2786, 2786, 2787, 1318, +     2787, 2787, 2787, 2787, 2787, 2787, 2788, 1317, 2788, 2788, +     2788, 2788, 2788, 2788, 1316, 1314, 1309, 1308, 2786, 2786, +     2786, 2786, 2786, 2786, 2789, 2789, 2789, 2789, 2789, 1305, +     2789, 2789, 2789, 2789, 2789, 2789, 2790, 1297, 2790, 2790, +     2790, 2790, 2790, 2790, 2791, 1296, 2791, 2791, 2791, 2791, +     2791, 2791, 1295, 1283, 1271, 1262, 2789, 2789, 2789, 2789, +     2789, 2789, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, +     2792, 2792, 2792, 2792, 2793, 1259, 2793, 2793, 2793, 2793, + +     2793, 2793, 2794, 1257, 2794, 2794, 2794, 2794, 2794, 2794, +     1256, 1255, 1254, 1253, 2792, 2792, 2792, 2792, 2792, 2792, +     2795, 2795, 2795, 2795, 2795, 1252, 2795, 2795, 2795, 2795, +     2795, 2795, 2796, 1251, 2796, 2796, 2796, 2796, 2796, 2796, +     2797, 1250, 2797, 2797, 2797, 2797, 2797, 2797, 1249, 1248, +     1247, 1246, 2795, 2795, 2795, 2795, 2795, 2795, 2798, 2798, +     2798, 2798, 2798, 1245, 2798, 2798, 2798, 2798, 2798, 2798, +     2799, 1244, 2799, 2799, 2799, 2799, 2799, 2799, 2800, 1243, +     2800, 2800, 2800, 2800, 2800, 2800, 1242, 1241, 1240, 1239, +     2798, 2798, 2798, 2798, 2798, 2798, 2801, 2801, 2801, 2801, + +     2801, 1238, 2801, 2801, 2801, 2801, 2801, 2801, 2802, 1237, +     2802, 2802, 2802, 2802, 2802, 2802, 2803, 1236, 2803, 2803, +     2803, 2803, 2803, 2803, 1235, 1234, 1233, 1232, 2801, 2801, +     2801, 2801, 2801, 2801, 2804, 2804, 2804, 2804, 2804, 2804, +     2804, 2804, 2804, 2804, 2804, 2804, 2805, 1231, 2805, 2805, +     2805, 2805, 2805, 2805, 2806, 1230, 2806, 2806, 2806, 2806, +     2806, 2806, 1229, 1228, 1227, 1226, 2804, 2804, 2804, 2804, +     2804, 2804, 2807, 2807, 2807, 2807, 2807, 1225, 2807, 2807, +     2807, 2807, 2807, 2807, 2808, 1224, 2808, 2808, 2808, 2808, +     2808, 2808, 2809, 1223, 2809, 2809, 2809, 2809, 2809, 2809, + +     1222, 1221, 1220, 1219, 2807, 2807, 2807, 2807, 2807, 2807, +     2810, 2810, 2810, 2810, 2810, 1218, 2810, 2810, 2810, 2810, +     2810, 2810, 2811, 1217, 2811, 2811, 2811, 2811, 2811, 2811, +     2812, 1216, 2812, 2812, 2812, 2812, 2812, 2812, 1215, 1214, +     1213, 1212, 2810, 2810, 2810, 2810, 2810, 2810, 2813, 2813, +     2813, 2813, 2813, 1211, 2813, 2813, 2813, 2813, 2813, 2813, +     2814, 1210, 2814, 2814, 2814, 2814, 2814, 2814, 2815, 1208, +     2815, 2815, 2815, 2815, 2815, 2815, 1191, 1189, 1187, 1181, +     2813, 2813, 2813, 2813, 2813, 2813, 2816, 2816, 2816, 2816, +     2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2817, 1177, + +     2817, 2817, 2817, 2817, 2817, 2817, 2818, 1169, 2818, 2818, +     2818, 2818, 2818, 2818, 1165, 1158, 1154, 1151, 2816, 2816, +     2816, 2816, 2816, 2816, 2819, 2819, 2819, 2819, 2819, 1149, +     2819, 2819, 2819, 2819, 2819, 2819, 2820, 1148, 2820, 2820, +     2820, 2820, 2820, 2820, 2821, 1147, 2821, 2821, 2821, 2821, +     2821, 2821, 1146, 1145, 1144, 1143, 2819, 2819, 2819, 2819, +     2819, 2819, 2822, 2822, 2822, 2822, 2822, 1142, 2822, 2822, +     2822, 2822, 2822, 2822, 2823, 1141, 2823, 2823, 2823, 2823, +     2823, 2823, 2824, 1140, 2824, 2824, 2824, 2824, 2824, 2824, +     1139, 1138, 1137, 1136, 2822, 2822, 2822, 2822, 2822, 2822, + +     2825, 2825, 2825, 2825, 2825, 1135, 2825, 2825, 2825, 2825, +     2825, 2825, 2826, 1134, 2826, 2826, 2826, 2826, 2826, 2826, +     2827, 1133, 2827, 2827, 2827, 2827, 2827, 2827, 1132, 1131, +     1130, 1129, 2825, 2825, 2825, 2825, 2825, 2825, 2828, 2828, +     2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, +     2829, 1128, 2829, 2829, 2829, 2829, 2829, 2829, 2830, 1127, +     2830, 2830, 2830, 2830, 2830, 2830, 1126, 1125, 1124, 1123, +     2828, 2828, 2828, 2828, 2828, 2828, 2831, 2831, 2831, 2831, +     2831, 1122, 2831, 2831, 2831, 2831, 2831, 2831, 2832, 1121, +     2832, 2832, 2832, 2832, 2832, 2832, 2833, 1120, 2833, 2833, + +     2833, 2833, 2833, 2833, 1119, 1118, 1117, 1116, 2831, 2831, +     2831, 2831, 2831, 2831, 2834, 2834, 2834, 2834, 2834, 1115, +     2834, 2834, 2834, 2834, 2834, 2834, 2835, 1114, 2835, 2835, +     2835, 2835, 2835, 2835, 2836, 1113, 2836, 2836, 2836, 2836, +     2836, 2836, 1112, 1111, 1110, 1109, 2834, 2834, 2834, 2834, +     2834, 2834, 2837, 2837, 2837, 2837, 2837, 1108, 2837, 2837, +     2837, 2837, 2837, 2837, 2838, 1107, 2838, 2838, 2838, 2838, +     2838, 2838, 2839, 1106, 2839, 2839, 2839, 2839, 2839, 2839, +     1104, 1086, 1085, 1084, 2837, 2837, 2837, 2837, 2837, 2837, +     2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, + +     2840, 2840, 2841, 1083, 2841, 2841, 2841, 2841, 2841, 2841, +     2842, 1075, 2842, 2842, 2842, 2842, 2842, 2842, 1073, 1067, +     1056, 1049, 2840, 2840, 2840, 2840, 2840, 2840, 2843, 2843, +     2843, 2843, 2843, 1047, 2843, 2843, 2843, 2843, 2843, 2843, +     2844, 1046, 2844, 2844, 2844, 2844, 2844, 2844, 2845, 1045, +     2845, 2845, 2845, 2845, 2845, 2845, 1044, 1043, 1042, 1041, +     2843, 2843, 2843, 2843, 2843, 2843, 2846, 2846, 2846, 2846, +     2846, 1040, 2846, 2846, 2846, 2846, 2846, 2846, 2847, 1039, +     2847, 2847, 2847, 2847, 2847, 2847, 2848, 1038, 2848, 2848, +     2848, 2848, 2848, 2848, 1037, 1036, 1035, 1034, 2846, 2846, + +     2846, 2846, 2846, 2846, 2849, 2849, 2849, 2849, 2849, 1033, +     2849, 2849, 2849, 2849, 2849, 2849, 2850, 1032, 2850, 2850, +     2850, 2850, 2850, 2850, 2851, 1031, 2851, 2851, 2851, 2851, +     2851, 2851, 1030, 1029, 1028, 1027, 2849, 2849, 2849, 2849, +     2849, 2849, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, +     2852, 2852, 2852, 2852, 2853, 1026, 2853, 2853, 2853, 2853, +     2853, 2853, 2854, 1025, 2854, 2854, 2854, 2854, 2854, 2854, +     1024, 1023, 1022, 1021, 2852, 2852, 2852, 2852, 2852, 2852, +     2855, 2855, 2855, 2855, 2855, 1020, 2855, 2855, 2855, 2855, +     2855, 2855, 2856, 1019, 2856, 2856, 2856, 2856, 2856, 2856, + +     2857, 1018, 2857, 2857, 2857, 2857, 2857, 2857, 1017, 1016, +     1015, 1014, 2855, 2855, 2855, 2855, 2855, 2855, 2858, 2858, +     2858, 2858, 2858, 1013, 2858, 2858, 2858, 2858, 2858, 2858, +     2859, 1012, 2859, 2859, 2859, 2859, 2859, 2859, 2860, 1011, +     2860, 2860, 2860, 2860, 2860, 2860, 1010, 1009, 1007,  997, +     2858, 2858, 2858, 2858, 2858, 2858, 2861, 2861, 2861, 2861, +     2861,  988, 2861, 2861, 2861, 2861, 2861, 2861, 2862,  986, +     2862, 2862, 2862, 2862, 2862, 2863,  985, 2863, 2863, 2863, +     2863, 2863,  983,  973,  970,  962,  958,  953, 2861, 2861, +     2861, 2861, 2861, 2861, 2865, 2865, 2865, 2865, 2865, 2865, + +     2865, 2865, 2866,  950, 2866, 2866, 2866, 2866, 2866, 2866, +     2867,  948, 2867, 2867, 2868, 2868,  947, 2868, 2868, 2868, +     2869,  946, 2869, 2869, 2870, 2870, 2871, 2871, 2872,  945, +     2872, 2872, 2873, 2873, 2874, 2874, 2875, 2875, 2875, 2876, +      944, 2876, 2876, 2877, 2877, 2878, 2878, 2879, 2879, 2880, +     2880, 2881, 2881, 2881, 2882, 2882, 2883,  943, 2883, 2883, +     2884, 2884, 2885, 2885, 2886, 2886, 2887, 2887, 2888, 2888, +     2889, 2889, 2890, 2890, 2890, 2891, 2891, 2892, 2892, 2892, +     2893,  942, 2893, 2893, 2894, 2894, 2895, 2895, 2896, 2896, +     2897, 2897, 2898, 2898, 2899, 2899, 2900, 2900, 2901, 2901, + +     2902, 2902, 2903, 2903, 2903, 2904, 2904, 2905, 2905, 2905, +     2906, 2906, 2906, 2907, 2907, 2908,  941, 2908, 2908, 2909, +     2909, 2910, 2910, 2911, 2911, 2912, 2912, 2913, 2913, 2914, +     2914, 2915, 2915, 2916, 2916, 2917, 2917, 2918, 2918, 2919, +     2919, 2920, 2920, 2921, 2921, 2921, 2922, 2922, 2923, 2923, +     2923, 2924, 2924, 2924, 2925, 2925, 2926, 2926, 2926, 2927, +     2927, 2927, 2928,  940, 2928, 2928, 2929, 2929, 2930, 2930, +     2931, 2931, 2932, 2932, 2933, 2933, 2934, 2934, 2935, 2935, +     2936, 2936, 2937, 2937, 2938, 2938, 2939, 2939, 2940, 2940, +     2941, 2941, 2942, 2942, 2943, 2943, 2944, 2944, 2945, 2945, + +     2946, 2946, 2946, 2947, 2947, 2948, 2948, 2948, 2949, 2949, +     2949, 2950, 2950, 2951, 2951, 2951, 2952, 2952, 2952, 2953, +     2953, 2953, 2954, 2954, 2954, 2955, 2955, 2956, 2956,  939, +     2956, 2956, 2957,  938, 2957, 2957, 2958, 2958, 2959, 2959, +     2960, 2960, 2961, 2961, 2962, 2962, 2963, 2963, 2964, 2964, +     2965, 2965, 2966, 2966, 2967, 2967, 2968, 2968, 2969, 2969, +     2970, 2970, 2971, 2971, 2972, 2972, 2973, 2973, 2974, 2974, +     2975, 2975, 2976, 2976, 2977, 2977, 2978, 2978, 2979, 2979, +     2979, 2980, 2980, 2981, 2981, 2981, 2982, 2982, 2982, 2983, +     2983, 2983, 2984, 2984, 2984, 2985, 2985, 2985, 2986, 2986, + +     2986, 2987, 2987, 2988, 2988, 2988, 2989, 2989, 2989, 2990, +     2990, 2990, 2991, 2991,  937, 2991, 2991, 2992,  936, 2992, +     2992, 2993, 2993, 2994, 2994, 2995, 2995, 2996, 2996, 2997, +     2997, 2998, 2998, 2999, 2999, 3000, 3000, 3001, 3001, 3002, +     3002, 3003, 3003, 3004, 3004, 3005, 3005, 3006, 3006, 3007, +     3007, 3008, 3008, 3009, 3009, 3010, 3010, 3011, 3011, 3012, +     3012, 3013, 3013, 3014, 3014, 3015, 3015, 3016, 3016, 3017, +     3017, 3018, 3018, 3019, 3019, 3019, 3020, 3020, 3021, 3021, +     3021, 3022, 3022, 3022, 3023, 3023, 3024, 3024, 3024, 3025, +     3025, 3025, 3026, 3026, 3026, 3027, 3027, 3028, 3028, 3028, + +     3029, 3029, 3029, 3030, 3030, 3030, 3031, 3031, 3031, 3032, +     3032, 3032, 3033, 3033, 3033, 3034, 3034, 3035, 3035,  935, +     3035, 3035, 3036,  934, 3036, 3036, 3037, 3037, 3038, 3038, +     3039, 3039, 3040, 3040, 3041, 3041, 3042, 3042, 3043, 3043, +     3044, 3044, 3045, 3045, 3046, 3046, 3047, 3047, 3048, 3048, +     3049, 3049, 3050, 3050, 3051, 3051, 3052, 3052, 3053, 3053, +     3054, 3054, 3055, 3055, 3056, 3056, 3057, 3057, 3058, 3058, +     3059, 3059, 3060, 3060, 3061, 3061, 3062, 3062, 3063, 3063, +     3064, 3064, 3065, 3065, 3066, 3066, 3066, 3067, 3067, 3068, +     3068, 3068, 3069, 3069, 3069, 3070, 3070, 3071, 3071, 3071, + +     3072, 3072, 3072, 3073, 3073, 3073, 3074, 3074, 3074, 3075, +     3075, 3075, 3076, 3076, 3076, 3077, 3077, 3077, 3078, 3078, +     3078, 3079, 3079, 3080, 3080, 3080, 3081, 3081, 3081, 3082, +     3082, 3082, 3083, 3083,  933, 3083, 3083, 3084,  932, 3084, +     3084, 3085, 3085, 3086, 3086, 3087, 3087, 3088, 3088, 3089, +     3089, 3090, 3090, 3091, 3091, 3092, 3092, 3093, 3093, 3094, +     3094, 3095, 3095, 3096, 3096, 3097, 3097, 3098, 3098, 3099, +     3099, 3100, 3100, 3101, 3101, 3102, 3102, 3103, 3103, 3104, +     3104, 3105, 3105, 3106, 3106, 3107, 3107, 3108, 3108, 3109,       3109, 3110, 3110, 3111, 3111, 3112, 3112, 3113, 3113, 3114,       3114, 3115, 3115, 3116, 3116, 3117, 3117, 3118, 3118, 3119, -     3119, 3120, 3120, 3121, 3121, 3122, 3122, 3123, 3123, 3124, -     3124, 3125, 3125, 3126, 3126, 3127, 3127, 3128, 3128, 3129, -     3129, 3130, 3130, 3131, 3131, 3132, 3132, 3133, 3133, 3134, -     3134, 3135, 3135, 3136, 3136, 3137, 3137, 3138, 3138, 3139, -     3139, 3140, 3140, 3141, 3141, 3142, 3142, 3143, 3143, 3144, -     3144, 3145, 3145, 3145, 3146, 3146, 3147, 3147, 3147, 3148, -     3148, 3148, 3149, 3149, 3149, 3150, 3150, 3150, 3151, 3151, -     3151, 3152, 3152, 3152, 3153, 3153, 3154, 3154, 3154, 3155, -     3155, 3155, 3156, 3156, 3156, 3157, 3157, 3157, 3158, 3158, - -     3158, 3159, 3159, 3159, 3160, 3160, 3160, 3161, 3161, 3161, -     3162, 3162, 3162, 3163, 3163, 3164, 3164, 3164, 3165, 3165, -     3165, 3166, 3166, 3166, 3167,  904, 3167, 3167, 3167, 3168, -      903, 3168, 3168, 3169, 3169, 3170, 3170, 3171, 3171, 3172, -     3172, 3173, 3173, 3174, 3174, 3175, 3175, 3176, 3176, 3177, -     3177, 3178, 3178, 3179, 3179, 3180, 3180, 3181, 3181, 3182, -     3182, 3183, 3183, 3184, 3184, 3185, 3185, 3186, 3186, 3187, -     3187, 3188, 3188, 3189, 3189, 3190, 3190, 3191, 3191, 3192, -     3192, 3193, 3193, 3194, 3194, 3195, 3195, 3196, 3196, 3197, -     3197, 3198, 3198, 3199, 3199, 3200, 3200, 3201, 3201, 3202, - -     3202, 3203, 3203, 3204, 3204, 3205, 3205, 3206, 3206, 3207, -     3207, 3208, 3208, 3209, 3209, 3210, 3210, 3211, 3211, 3212, -     3212, 3212, 3213, 3213, 3214, 3214, 3214, 3215, 3215, 3215, -     3216, 3216, 3217, 3217, 3217, 3218, 3218, 3218, 3219, 3219, -     3219, 3220, 3220, 3221, 3221, 3221, 3222, 3222, 3222, 3223, -     3223, 3223, 3224, 3224, 3224, 3225, 3225, 3225, 3226, 3226, -     3226, 3227, 3227, 3228, 3228, 3228, 3229, 3229, 3229, 3230, -     3230, 3230, 3231, 3231, 3232, 3232, 3232, 3233, 3233, 3233, -     3234, 3234, 3234, 3235, 3235, 3235, 3236, 3236, 3236, 3237, -     3237, 3237, 3238, 3238, 3239,  902, 3239, 3239, 3239, 3240, - -      901, 3240, 3240, 3241, 3241, 3242, 3242, 3243, 3243, 3244, -     3244, 3245, 3245, 3246, 3246, 3247, 3247, 3248, 3248, 3249, -     3249, 3250, 3250, 3251, 3251, 3252, 3252, 3253, 3253, 3254, -     3254, 3255, 3255, 3256, 3256, 3257, 3257, 3258, 3258, 3259, -     3259, 3260, 3260, 3261, 3261, 3262, 3262, 3263, 3263, 3264, -     3264, 3265, 3265, 3266, 3266, 3267, 3267, 3268, 3268, 3269, -     3269, 3270, 3270, 3271, 3271, 3272, 3272, 3273, 3273, 3274, -     3274, 3275, 3275, 3276, 3276, 3277, 3277, 3278, 3278, 3279, -     3279, 3280, 3280, 3281, 3281, 3282, 3282, 3283, 3283, 3284, -     3284, 3285, 3285, 3286, 3286, 3286, 3287, 3287, 3288, 3288, - -     3288, 3289, 3289, 3289, 3290, 3290, 3291, 3291, 3291, 3292, -     3292, 3292, 3293, 3293, 3293, 3294, 3294, 3294, 3295, 3295, -     3295, 3296, 3296, 3296, 3297, 3297, 3297, 3298, 3298, 3298, -     3299, 3299, 3300, 3300, 3300, 3301, 3301, 3301, 3302, 3302, -     3302, 3303, 3303, 3303, 3304, 3304, 3304, 3305, 3305, 3305, -     3306, 3306, 3306, 3307, 3307, 3307, 3308, 3308, 3308, 3309, -     3309, 3310, 3310, 3310, 3311, 3311, 3311, 3312, 3312, 3312, -     3313,  900, 3313, 3313, 3313, 3314,  899, 3314, 3314, 3315, -     3315, 3316, 3316, 3317, 3317, 3318, 3318, 3319, 3319, 3320, -     3320, 3321, 3321, 3322, 3322, 3323, 3323, 3324, 3324, 3325, - -     3325, 3326, 3326, 3327, 3327, 3328, 3328, 3329, 3329, 3330, -     3330, 3331, 3331, 3332, 3332, 3333, 3333, 3334, 3334, 3335, -     3335, 3336, 3336, 3337, 3337, 3338, 3338, 3339, 3339, 3340, -     3340, 3341, 3341, 3342, 3342, 3343, 3343, 3344, 3344, 3345, -     3345, 3346, 3346, 3347, 3347, 3348, 3348, 3349, 3349, 3350, -     3350, 3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, 3355, -     3355, 3356, 3356, 3357, 3357, 3358, 3358, 3359, 3359, 3360, -     3360, 3361, 3361, 3362, 3362, 3363, 3363, 3364, 3364, 3365, -     3365, 3366, 3366, 3367, 3367, 3367, 3368, 3368, 3369, 3369, -     3369, 3370, 3370, 3370, 3371, 3371, 3372, 3372, 3372, 3373, - -     3373, 3373, 3374, 3374, 3374, 3375, 3375, 3375, 3376, 3376, -     3377, 3377, 3377, 3378, 3378, 3378, 3379, 3379, 3379, 3380, -     3380, 3381, 3381, 3381, 3382, 3382, 3382, 3383, 3383, 3383, -     3384, 3384, 3384, 3385, 3385, 3385, 3386, 3386, 3386, 3387, -     3387, 3388, 3388, 3388, 3389, 3389, 3389, 3390, 3390, 3390, -     3391, 3391, 3392, 3392, 3392, 3393, 3393, 3393, 3394, 3394, -     3394, 3395, 3395, 3395, 3396, 3396, 3396, 3397, 3397, 3397, -     3398, 3398, 3399,  898, 3399, 3399, 3399, 3400,  897, 3400, -     3400, 3401, 3401, 3402, 3402, 3403, 3403, 3404, 3404, 3405, -     3405, 3406, 3406, 3407, 3407, 3408, 3408, 3409, 3409, 3410, - -     3410, 3411, 3411, 3412, 3412, 3413, 3413, 3414, 3414, 3415, -     3415, 3416, 3416, 3417, 3417, 3418, 3418, 3419, 3419, 3420, -     3420, 3421, 3421, 3422, 3422, 3423, 3423, 3424, 3424, 3425, -     3425, 3426, 3426, 3427, 3427, 3428, 3428, 3429, 3429, 3430, -     3430, 3431, 3431, 3432, 3432, 3433, 3433, 3434, 3434, 3435, -     3435, 3436, 3436, 3437, 3437, 3438, 3438, 3439, 3439, 3440, -     3440, 3441, 3441, 3442, 3442, 3443, 3443, 3444, 3444, 3445, -     3445, 3446, 3446, 3447, 3447, 3448, 3448, 3449, 3449, 3450, -     3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, 3454, -     3455, 3455, 3456, 3456, 3456, 3457, 3457, 3457, 3458, 3458, - -     3458, 3459, 3459, 3459, 3460, 3460, 3460, 3461, 3461, 3461, -     3462, 3462, 3463, 3463, 3463, 3464, 3464, 3464, 3465, 3465, -     3465, 3466, 3466, 3466, 3467, 3467, 3467, 3468, 3468, 3468, -     3469, 3469, 3469, 3470, 3470, 3470, 3471, 3471, 3471, 3472, -     3472, 3473, 3473, 3473, 3474, 3474, 3474, 3475, 3475, 3475, -     3476, 3476, 3476, 3477, 3477, 3477, 3478, 3478, 3478, 3479, -     3479, 3479, 3480, 3480, 3480, 3481, 3481, 3481, 3482, 3482, -     3483, 3483, 3483, 3484, 3484, 3484, 3485, 3485, 3485, 3486, -      896, 3486, 3486, 3486, 3487,  895, 3487, 3487, 3488, 3488, -     3489, 3489, 3490, 3490, 3491, 3491, 3492, 3492, 3493, 3493, - -     3494, 3494, 3495, 3495, 3496, 3496, 3497, 3497, 3498, 3498, -     3499, 3499, 3500, 3500, 3501, 3501, 3502, 3502, 3503, 3503, -     3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507, 3508, 3508, -     3509, 3509, 3510, 3510, 3511, 3511, 3512, 3512, 3513, 3513, -     3514, 3514, 3515, 3515, 3516, 3516, 3517, 3517, 3518, 3518, -     3519, 3519, 3520, 3520, 3521, 3521, 3522, 3522, 3523, 3523, -     3524, 3524, 3525, 3525, 3526, 3526, 3527, 3527, 3528, 3528, -     3529, 3529, 3530, 3530, 3531, 3531, 3532, 3532, 3533, 3533, -     3534, 3534, 3535, 3535, 3536, 3536, 3537, 3537, 3538, 3538, -     3539, 3539, 3540, 3540, 3541, 3541, 3542, 3542, 3543, 3543, - -     3544, 3544, 3545, 3545, 3546, 3546, 3546, 3547, 3547, 3548, -     3548, 3548, 3549, 3549, 3549, 3550, 3550, 3551, 3551, 3551, -     3552, 3552, 3552, 3553, 3553, 3553, 3554, 3554, 3555, 3555, -     3555, 3556, 3556, 3556, 3557, 3557, 3557, 3558, 3558, 3558, -     3559, 3559, 3559, 3560, 3560, 3560, 3561, 3561, 3562, 3562, -     3562, 3563, 3563, 3563, 3564, 3564, 3564, 3565, 3565, 3566, -     3566, 3566, 3567, 3567, 3567, 3568, 3568, 3568, 3569, 3569, -     3569, 3570, 3570, 3570, 3571, 3571, 3571, 3572, 3572, 3573, -     3573, 3573, 3574, 3574, 3574, 3575, 3575, 3575, 3576, 3576, -     3577, 3577, 3577, 3578, 3578, 3578, 3579, 3579, 3579, 3580, - -     3580, 3580, 3581, 3581, 3581, 3582, 3582, 3582, 3583, 3583, -     3584,  894, 3584, 3584, 3584, 3585,  893, 3585, 3585, 3586, -     3586, 3587, 3587, 3588, 3588, 3589, 3589, 3590, 3590, 3591, -     3591, 3592, 3592, 3593, 3593, 3594, 3594, 3595, 3595, 3596, -     3596, 3597, 3597, 3598, 3598, 3599, 3599, 3600, 3600, 3601, -     3601, 3602, 3602, 3603, 3603, 3604, 3604, 3605, 3605, 3606, -     3606, 3607, 3607, 3608, 3608, 3609, 3609, 3610, 3610, 3611, -     3611, 3612, 3612, 3613, 3613, 3614, 3614, 3615, 3615, 3616, -     3616, 3617, 3617, 3618, 3618, 3619, 3619, 3620, 3620, 3621, -     3621, 3622, 3622, 3623, 3623, 3624, 3624, 3625, 3625, 3626, - -     3626, 3627, 3627, 3628, 3628, 3629, 3629, 3630, 3630, 3631, -     3631, 3632, 3632, 3633, 3633, 3634, 3634, 3635, 3635, 3636, -     3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640, 3641, -     3641, 3642, 3642, 3643, 3643, 3644, 3644, 3644, 3645, 3645, -     3646, 3646, 3646, 3647, 3647, 3647, 3648, 3648, 3649, 3649, -     3649, 3650, 3650, 3650, 3651, 3651, 3651, 3652, 3652, 3652, -     3653, 3653, 3653, 3654, 3654, 3654, 3655, 3655, 3655, 3656, -     3656, 3656, 3657, 3657, 3658, 3658, 3658, 3659, 3659, 3659, -     3660, 3660, 3660, 3661, 3661, 3661, 3662, 3662, 3662, 3663, -     3663, 3663, 3664, 3664, 3664, 3665, 3665, 3665, 3666, 3666, - -     3666, 3667, 3667, 3668, 3668, 3668, 3669, 3669, 3669, 3670, -     3670, 3670, 3671, 3671, 3671, 3672, 3672, 3672, 3673, 3673, -     3673, 3674, 3674, 3674, 3675, 3675, 3675, 3676, 3676, 3676, -     3677, 3677, 3678, 3678, 3678, 3679, 3679, 3679, 3680, 3680, -     3680, 3681,  892, 3681, 3681, 3681, 3682,  891, 3682, 3682, -     3683, 3683, 3684, 3684, 3685, 3685, 3686, 3686, 3687, 3687, -     3688, 3688, 3689, 3689, 3690, 3690, 3691, 3691, 3692, 3692, -     3693, 3693, 3694, 3694, 3695, 3695, 3696, 3696, 3697, 3697, -     3698, 3698, 3699, 3699, 3700, 3700, 3701, 3701, 3702, 3702, -     3703, 3703, 3704, 3704, 3705, 3705, 3706, 3706, 3707, 3707, - -     3708, 3708, 3709, 3709, 3710, 3710, 3711, 3711, 3712, 3712, -     3713, 3713, 3714, 3714, 3715, 3715, 3716, 3716, 3717, 3717, -     3718, 3718, 3719, 3719, 3720, 3720, 3721, 3721, 3722, 3722, -     3723, 3723, 3724, 3724, 3725, 3725, 3726, 3726, 3727, 3727, -     3728, 3728, 3729, 3729, 3730, 3730, 3731, 3731, 3732, 3732, -     3733, 3733, 3734, 3734, 3735, 3735, 3736, 3736, 3737, 3737, -     3738, 3738, 3739, 3739, 3740, 3740, 3741, 3741, 3742, 3742, -     3742, 3743, 3743, 3744, 3744, 3744, 3745, 3745, 3745, 3746, -     3746, 3746, 3747, 3747, 3747, 3748, 3748, 3748, 3749, 3749, -     3750, 3750, 3750, 3751, 3751, 3751, 3752, 3752, 3752, 3753, - -     3753, 3754, 3754, 3754, 3755, 3755, 3755, 3756, 3756, 3756, -     3757, 3757, 3757, 3758, 3758, 3758, 3759, 3759, 3759, 3760, -     3760, 3761, 3761, 3761, 3762, 3762, 3762, 3763, 3763, 3763, -     3764, 3764, 3765, 3765, 3765, 3766, 3766, 3766, 3767, 3767, -     3767, 3768, 3768, 3768, 3769, 3769, 3769, 3770, 3770, 3770, -     3771, 3771, 3772, 3772, 3772, 3773, 3773, 3773, 3774, 3774, -     3774, 3775, 3775, 3776, 3776, 3776, 3777, 3777, 3777, 3778, -     3778, 3778, 3779, 3779, 3779, 3780, 3780, 3780, 3781, 3781, -     3781, 3782, 3782, 3783,  890, 3783, 3783, 3783, 3784,  889, -     3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, - -     3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, -     3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, -     3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, -     3804, 3804, 3805, 3805, 3806, 3806, 3807, 3807, 3808, 3808, -     3809, 3809, 3810, 3810, 3811, 3811, 3812, 3812, 3813, 3813, -     3814, 3814, 3815, 3815, 3816, 3816, 3817, 3817, 3818, 3818, -     3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, 3823, -     3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, 3828, -     3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3833, 3833, -     3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, 3838, - -     3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3842, 3843, -     3843, 3843, 3844, 3844, 3844, 3845, 3845, 3846, 3846, 3846, -     3847, 3847, 3847, 3848, 3848, 3848, 3849, 3849, 3849, 3850, -     3850, 3850, 3851, 3851, 3851, 3852, 3852, 3852, 3853, 3853, -     3853, 3854, 3854, 3854, 3855, 3855, 3856, 3856, 3856, 3857, -     3857, 3857, 3858, 3858, 3858, 3859, 3859, 3859, 3860, 3860, -     3860, 3861, 3861, 3861, 3862, 3862, 3862, 3863, 3863, 3863, -     3864, 3864, 3864, 3865, 3865, 3866, 3866, 3866, 3867, 3867, -     3867, 3868, 3868, 3868, 3869, 3869, 3869, 3870, 3870, 3870, -     3871, 3871, 3871, 3872, 3872, 3872, 3873, 3873, 3873, 3874, - -     3874, 3874, 3875, 3875, 3876, 3876, 3876, 3877, 3877, 3877, -     3878, 3878, 3878, 3879,  887, 3879, 3879, 3879, 3880,  879, -     3880, 3880, 3881, 3881, 3882, 3882, 3883, 3883, 3884, 3884, -     3885, 3885, 3886, 3886, 3887, 3887, 3888, 3888, 3889, 3889, -     3890, 3890, 3891, 3891, 3892, 3892, 3893, 3893, 3894, 3894, -     3895, 3895, 3896, 3896, 3897, 3897, 3898, 3898, 3899, 3899, -     3900, 3900, 3901, 3901, 3902, 3902, 3903, 3903, 3904, 3904, -     3905, 3905, 3906, 3906, 3907, 3907, 3908, 3908, 3909, 3909, -     3910, 3910, 3911, 3911, 3912, 3912, 3913, 3913, 3914, 3914, -     3915, 3915, 3916, 3916, 3917, 3917, 3918, 3918, 3919, 3919, - -     3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923, 3924, 3924, -     3925, 3925, 3926, 3926, 3927, 3927, 3928, 3928, 3929, 3929, -     3930, 3930, 3931, 3931, 3932, 3932, 3933, 3933, 3934, 3934, -     3935, 3935, 3936, 3936, 3937, 3937, 3937, 3938, 3938, 3938, -     3939, 3939, 3939, 3940, 3940, 3940, 3941, 3941, 3941, 3942, -     3942, 3942, 3943, 3943, 3944, 3944, 3944, 3945, 3945, 3945, -     3946, 3946, 3946, 3947, 3947, 3947, 3948, 3948, 3948, 3949, -     3949, 3949, 3950, 3950, 3950, 3951, 3951, 3951, 3952, 3952, -     3953, 3953, 3953, 3954, 3954, 3954, 3955, 3955, 3955, 3956, -     3956, 3957, 3957, 3957, 3958, 3958, 3958, 3959, 3959, 3959, - -     3960, 3960, 3960, 3961, 3961, 3961, 3962, 3962, 3962, 3963, -     3963, 3964, 3964, 3964, 3965, 3965, 3965, 3966, 3966, 3966, -     3967, 3967, 3968, 3968, 3968, 3969, 3969, 3969, 3970, 3970, -     3970, 3971, 3971, 3971, 3972, 3972, 3972, 3973, 3973, 3973, -     3974, 3974, 3975,  870, 3975, 3975, 3975, 3976,  867, 3976, -     3976, 3977, 3977, 3978, 3978, 3979, 3979, 3980, 3980, 3981, -     3981, 3982, 3982, 3983, 3983, 3984, 3984, 3985, 3985, 3986, -     3986, 3987, 3987, 3988, 3988, 3989, 3989, 3990, 3990, 3991, -     3991, 3992, 3992, 3993, 3993, 3994, 3994, 3995, 3995, 3996, -     3996, 3997, 3997, 3998, 3998, 3999, 3999, 4000, 4000, 4001, - -     4001, 4002, 4002, 4003, 4003, 4004, 4004, 4005, 4005, 4006, -     4006, 4007, 4007, 4008, 4008, 4009, 4009, 4010, 4010, 4011, -     4011, 4012, 4012, 4013, 4013, 4014, 4014, 4015, 4015, 4016, -     4016, 4017, 4017, 4018, 4018, 4019, 4019, 4020, 4020, 4021, -     4021, 4022, 4022, 4023, 4023, 4024, 4024, 4025, 4025, 4026, -     4026, 4027, 4027, 4028, 4028, 4028, 4029, 4029, 4029, 4030, -     4030, 4030, 4031, 4031, 4031, 4032, 4032, 4032, 4033, 4033, -     4033, 4034, 4034, 4034, 4035, 4035, 4035, 4036, 4036, 4036, -     4037, 4037, 4038, 4038, 4038, 4039, 4039, 4039, 4040, 4040, -     4040, 4041, 4041, 4041, 4042, 4042, 4042, 4043, 4043, 4043, - -     4044, 4044, 4044, 4045, 4045, 4045, 4046, 4046, 4046, 4047, -     4047, 4048, 4048, 4048, 4049, 4049, 4049, 4050, 4050, 4050, -     4051, 4051, 4051, 4052, 4052, 4052, 4053, 4053, 4053, 4054, -     4054, 4054, 4055, 4055, 4055, 4056, 4056, 4056, 4057, 4057, -     4058, 4058, 4058, 4059, 4059, 4059, 4060, 4060, 4060, 4061, -      866, 4061, 4061, 4061, 4062,  865, 4062, 4062, 4063, 4063, -     4064, 4064, 4065, 4065, 4066, 4066, 4067, 4067, 4068, 4068, -     4069, 4069, 4070, 4070, 4071, 4071, 4072, 4072, 4073, 4073, -     4074, 4074, 4075, 4075, 4076, 4076, 4077, 4077, 4078, 4078, -     4079, 4079, 4080, 4080, 4081, 4081, 4082, 4082, 4083, 4083, - -     4084, 4084, 4085, 4085, 4086, 4086, 4087, 4087, 4088, 4088, -     4089, 4089, 4090, 4090, 4091, 4091, 4092, 4092, 4093, 4093, -     4094, 4094, 4095, 4095, 4096, 4096, 4097, 4097, 4098, 4098, -     4099, 4099, 4100, 4100, 4101, 4101, 4102, 4102, 4103, 4103, -     4104, 4104, 4105, 4105, 4106, 4106, 4106, 4107, 4107, 4107, -     4108, 4108, 4108, 4109, 4109, 4110, 4110, 4110, 4111, 4111, -     4111, 4112, 4112, 4112, 4113, 4113, 4113, 4114, 4114, 4114, -     4115, 4115, 4115, 4116, 4116, 4116, 4117, 4117, 4118, 4118, -     4118, 4119, 4119, 4119, 4120, 4120, 4120, 4121, 4121, 4122, -     4122, 4122, 4123, 4123, 4123, 4124, 4124, 4124, 4125, 4125, - -     4125, 4126, 4126, 4126, 4127, 4127, 4127, 4128, 4128, 4129, -     4129, 4129, 4130, 4130, 4130, 4131, 4131, 4131, 4132, 4132, -     4133, 4133, 4133, 4134, 4134, 4134, 4135, 4135, 4135, 4136, -     4136, 4136, 4137, 4137, 4137, 4138, 4138, 4138, 4139, 4139, -     4140,  864, 4140, 4140, 4140, 4141,  863, 4141, 4141, 4142, -     4142, 4143, 4143, 4144, 4144, 4145, 4145, 4146, 4146, 4147, -     4147, 4148, 4148, 4149, 4149, 4150, 4150, 4151, 4151, 4152, -     4152, 4153, 4153, 4154, 4154, 4155, 4155, 4156, 4156, 4157, -     4157, 4158, 4158, 4159, 4159, 4160, 4160, 4161, 4161, 4162, -     4162, 4163, 4163, 4164, 4164, 4165, 4165, 4166, 4166, 4167, - -     4167, 4168, 4168, 4169, 4169, 4170, 4170, 4171, 4171, 4172, -     4172, 4173, 4173, 4174, 4174, 4175, 4175, 4176, 4176, 4177, -     4177, 4178, 4178, 4179, 4179, 4180, 4180, 4180, 4181, 4181, -     4181, 4182, 4182, 4182, 4183, 4183, 4183, 4184, 4184, 4184, -     4185, 4185, 4186, 4186, 4186, 4187, 4187, 4187, 4188, 4188, -     4188, 4189, 4189, 4189, 4190, 4190, 4190, 4191, 4191, 4191, -     4192, 4192, 4192, 4193, 4193, 4193, 4194, 4194, 4194, 4195, -     4195, 4196, 4196, 4196, 4197, 4197, 4197, 4198, 4198, 4198, -     4199, 4199, 4199, 4200, 4200, 4200, 4201, 4201, 4201, 4202, -     4202, 4202, 4203, 4203, 4203, 4204, 4204, 4204, 4205, 4205, - -     4206, 4206, 4206, 4207, 4207, 4207, 4208, 4208, 4208, 4209, -      862, 4209, 4209, 4209, 4210,  859, 4210, 4210, 4211, 4211, -     4212, 4212, 4213, 4213, 4214, 4214, 4215, 4215, 4216, 4216, -     4217, 4217, 4218, 4218, 4219, 4219, 4220, 4220, 4221, 4221, -     4222, 4222, 4223, 4223, 4224, 4224, 4225, 4225, 4226, 4226, -     4227, 4227, 4228, 4228, 4229, 4229, 4230, 4230, 4231, 4231, -     4232, 4232, 4233, 4233, 4234, 4234, 4235, 4235, 4236, 4236, -     4237, 4237, 4238, 4238, 4239, 4239, 4240, 4240, 4241, 4241, -     4242, 4242, 4243, 4243, 4244, 4244, 4245, 4245, 4246, 4246, -     4246, 4247, 4247, 4247, 4248, 4248, 4248, 4249, 4249, 4249, - -     4250, 4250, 4250, 4251, 4251, 4251, 4252, 4252, 4253, 4253, -     4253, 4254, 4254, 4254, 4255, 4255, 4255, 4256, 4256, 4256, -     4257, 4257, 4257, 4258, 4258, 4258, 4259, 4259, 4259, 4260, -     4260, 4260, 4261, 4261, 4262, 4262, 4262, 4263, 4263, 4263, -     4264, 4264, 4264, 4265, 4265, 4266, 4266, 4266, 4267, 4267, -     4267, 4268, 4268, 4268, 4269, 4269, 4269, 4270, 4270, 4270, -     4271, 4271, 4271, 4272, 4272, 4273,  845, 4273, 4273, 4273, -     4274,  836, 4274, 4274, 4275, 4275, 4276, 4276, 4277, 4277, -     4278, 4278, 4279, 4279, 4280, 4280, 4281, 4281, 4282, 4282, -     4283, 4283, 4284, 4284, 4285, 4285, 4286, 4286, 4287, 4287, - -     4288, 4288, 4289, 4289, 4290, 4290, 4291, 4291, 4292, 4292, -     4293, 4293, 4294, 4294, 4295, 4295, 4296, 4296, 4297, 4297, -     4298, 4298, 4299, 4299, 4300, 4300, 4301, 4301, 4302, 4302, -     4303, 4303, 4304, 4304, 4304, 4305, 4305, 4305, 4306, 4306, -     4306, 4307, 4307, 4307, 4308, 4308, 4308, 4309, 4309, 4309, -     4310, 4310, 4310, 4311, 4311, 4311, 4312, 4312, 4312, 4313, -     4313, 4314, 4314, 4314, 4315, 4315, 4315, 4316, 4316, 4316, -     4317, 4317, 4317, 4318, 4318, 4318, 4319, 4319, 4319, 4320, -     4320, 4320, 4321, 4321, 4321, 4322, 4322, 4322, 4323, 4323, -     4324, 4324, 4324, 4325, 4325, 4325, 4326, 4326, 4326, 4327, - -      833, 4327, 4327, 4327, 4328,  831, 4328, 4328, 4329, 4329, -     4330, 4330, 4331, 4331, 4332, 4332, 4333, 4333, 4334, 4334, -     4335, 4335, 4336, 4336, 4337, 4337, 4338, 4338, 4339, 4339, -     4340, 4340, 4341, 4341, 4342, 4342, 4343, 4343, 4344, 4344, -     4345, 4345, 4346, 4346, 4347, 4347, 4348, 4348, 4349, 4349, -     4350, 4350, 4351, 4351, 4352, 4352, 4352, 4353, 4353, 4353, -     4354, 4354, 4354, 4355, 4355, 4356, 4356, 4356, 4357, 4357, -     4357, 4358, 4358, 4358, 4359, 4359, 4359, 4360, 4360, 4360, -     4361, 4361, 4361, 4362, 4362, 4362, 4363, 4363, 4364, 4364, -     4364, 4365, 4365, 4365, 4366, 4366, 4366, 4367, 4367, 4368, - -     4368, 4368, 4369, 4369, 4369, 4370, 4370, 4370, 4371, 4371, -     4371, 4372, 4372, 4372, 4373, 4373, 4373, 4374, 4374, 4375, -      830, 4375, 4375, 4375, 4376,  829, 4376, 4376, 4377, 4377, -     4378, 4378, 4379, 4379, 4380, 4380, 4381, 4381, 4382, 4382, -     4383, 4383, 4384, 4384, 4385, 4385, 4386, 4386, 4387, 4387, -     4388, 4388, 4389, 4389, 4390, 4390, 4391, 4391, 4392, 4392, -     4393, 4393, 4394, 4394, 4395, 4395, 4395, 4396, 4396, 4396, -     4397, 4397, 4397, 4398, 4398, 4398, 4399, 4399, 4399, 4400, -     4400, 4401, 4401, 4401, 4402, 4402, 4402, 4403, 4403, 4403, -     4404, 4404, 4404, 4405, 4405, 4405, 4406, 4406, 4406, 4407, - -     4407, 4407, 4408, 4408, 4408, 4409, 4409, 4409, 4410, 4410, -     4411, 4411, 4411, 4412, 4412, 4412, 4413, 4413, 4413, 4414, -      828, 4414, 4414, 4414, 4415,  827, 4415, 4415, 4416, 4416, -     4417, 4417, 4418, 4418, 4419, 4419, 4420, 4420, 4421, 4421, -     4422, 4422, 4423, 4423, 4424, 4424, 4425, 4425, 4426, 4426, -     4427, 4427, 4428, 4428, 4429, 4429, 4430, 4430, 4431, 4431, -     4432, 4432, 4432, 4433, 4433, 4433, 4434, 4434, 4434, 4435, +     3119, 3120, 3120, 3120, 3121, 3121, 3122, 3122, 3122, 3123, +     3123, 3123, 3124, 3124, 3125, 3125, 3125, 3126, 3126, 3126, +     3127, 3127, 3127, 3128, 3128, 3128, 3129, 3129, 3130, 3130, +     3130, 3131, 3131, 3131, 3132, 3132, 3132, 3133, 3133, 3134, +     3134, 3134, 3135, 3135, 3135, 3136, 3136, 3136, 3137, 3137, +     3137, 3138, 3138, 3138, 3139, 3139, 3139, 3140, 3140, 3141, +     3141,  931, 3141, 3141, 3142,  930, 3142, 3142, 3143, 3143, +     3144, 3144, 3145, 3145, 3146, 3146, 3147, 3147, 3148, 3148, +     3149, 3149, 3150, 3150, 3151, 3151, 3152, 3152, 3153, 3153, + +     3154, 3154, 3155, 3155, 3156, 3156, 3157, 3157, 3158, 3158, +     3159, 3159, 3160, 3160, 3161, 3161, 3162, 3162, 3163, 3163, +     3164, 3164, 3165, 3165, 3166, 3166, 3167, 3167, 3168, 3168, +     3169, 3169, 3170, 3170, 3171, 3171, 3172, 3172, 3173, 3173, +     3174, 3174, 3175, 3175, 3176, 3176, 3177, 3177, 3178, 3178, +     3179, 3179, 3180, 3180, 3180, 3181, 3181, 3182, 3182, 3182, +     3183, 3183, 3183, 3184, 3184, 3184, 3185, 3185, 3185, 3186, +     3186, 3186, 3187, 3187, 3187, 3188, 3188, 3189, 3189, 3189, +     3190, 3190, 3190, 3191, 3191, 3191, 3192, 3192, 3192, 3193, +     3193, 3193, 3194, 3194, 3194, 3195, 3195, 3195, 3196, 3196, + +     3196, 3197, 3197, 3197, 3198, 3198, 3199, 3199, 3199, 3200, +     3200, 3200, 3201, 3201, 3201, 3202, 3202,  929, 3202, 3202, +     3203,  928, 3203, 3203, 3204, 3204, 3205, 3205, 3206, 3206, +     3207, 3207, 3208, 3208, 3209, 3209, 3210, 3210, 3211, 3211, +     3212, 3212, 3213, 3213, 3214, 3214, 3215, 3215, 3216, 3216, +     3217, 3217, 3218, 3218, 3219, 3219, 3220, 3220, 3221, 3221, +     3222, 3222, 3223, 3223, 3224, 3224, 3225, 3225, 3226, 3226, +     3227, 3227, 3228, 3228, 3229, 3229, 3230, 3230, 3231, 3231, +     3232, 3232, 3233, 3233, 3234, 3234, 3235, 3235, 3236, 3236, +     3237, 3237, 3238, 3238, 3239, 3239, 3240, 3240, 3241, 3241, + +     3242, 3242, 3243, 3243, 3244, 3244, 3245, 3245, 3246, 3246, +     3247, 3247, 3247, 3248, 3248, 3249, 3249, 3249, 3250, 3250, +     3250, 3251, 3251, 3252, 3252, 3252, 3253, 3253, 3253, 3254, +     3254, 3254, 3255, 3255, 3256, 3256, 3256, 3257, 3257, 3257, +     3258, 3258, 3258, 3259, 3259, 3259, 3260, 3260, 3260, 3261, +     3261, 3261, 3262, 3262, 3263, 3263, 3263, 3264, 3264, 3264, +     3265, 3265, 3265, 3266, 3266, 3267, 3267, 3267, 3268, 3268, +     3268, 3269, 3269, 3269, 3270, 3270, 3270, 3271, 3271, 3271, +     3272, 3272, 3272, 3273, 3273, 3274, 3274,  927, 3274, 3274, +     3275,  926, 3275, 3275, 3276, 3276, 3277, 3277, 3278, 3278, + +     3279, 3279, 3280, 3280, 3281, 3281, 3282, 3282, 3283, 3283, +     3284, 3284, 3285, 3285, 3286, 3286, 3287, 3287, 3288, 3288, +     3289, 3289, 3290, 3290, 3291, 3291, 3292, 3292, 3293, 3293, +     3294, 3294, 3295, 3295, 3296, 3296, 3297, 3297, 3298, 3298, +     3299, 3299, 3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, +     3304, 3304, 3305, 3305, 3306, 3306, 3307, 3307, 3308, 3308, +     3309, 3309, 3310, 3310, 3311, 3311, 3312, 3312, 3313, 3313, +     3314, 3314, 3315, 3315, 3316, 3316, 3317, 3317, 3318, 3318, +     3319, 3319, 3320, 3320, 3321, 3321, 3321, 3322, 3322, 3323, +     3323, 3323, 3324, 3324, 3324, 3325, 3325, 3326, 3326, 3326, + +     3327, 3327, 3327, 3328, 3328, 3328, 3329, 3329, 3329, 3330, +     3330, 3330, 3331, 3331, 3331, 3332, 3332, 3332, 3333, 3333, +     3333, 3334, 3334, 3335, 3335, 3335, 3336, 3336, 3336, 3337, +     3337, 3337, 3338, 3338, 3338, 3339, 3339, 3339, 3340, 3340, +     3340, 3341, 3341, 3341, 3342, 3342, 3342, 3343, 3343, 3343, +     3344, 3344, 3345, 3345, 3345, 3346, 3346, 3346, 3347, 3347, +     3347, 3348, 3348,  925, 3348, 3348, 3349,  924, 3349, 3349, +     3350, 3350, 3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, +     3355, 3355, 3356, 3356, 3357, 3357, 3358, 3358, 3359, 3359, +     3360, 3360, 3361, 3361, 3362, 3362, 3363, 3363, 3364, 3364, + +     3365, 3365, 3366, 3366, 3367, 3367, 3368, 3368, 3369, 3369, +     3370, 3370, 3371, 3371, 3372, 3372, 3373, 3373, 3374, 3374, +     3375, 3375, 3376, 3376, 3377, 3377, 3378, 3378, 3379, 3379, +     3380, 3380, 3381, 3381, 3382, 3382, 3383, 3383, 3384, 3384, +     3385, 3385, 3386, 3386, 3387, 3387, 3388, 3388, 3389, 3389, +     3390, 3390, 3391, 3391, 3392, 3392, 3393, 3393, 3394, 3394, +     3395, 3395, 3396, 3396, 3397, 3397, 3398, 3398, 3399, 3399, +     3400, 3400, 3401, 3401, 3402, 3402, 3402, 3403, 3403, 3404, +     3404, 3404, 3405, 3405, 3405, 3406, 3406, 3407, 3407, 3407, +     3408, 3408, 3408, 3409, 3409, 3409, 3410, 3410, 3410, 3411, + +     3411, 3412, 3412, 3412, 3413, 3413, 3413, 3414, 3414, 3414, +     3415, 3415, 3416, 3416, 3416, 3417, 3417, 3417, 3418, 3418, +     3418, 3419, 3419, 3419, 3420, 3420, 3420, 3421, 3421, 3421, +     3422, 3422, 3423, 3423, 3423, 3424, 3424, 3424, 3425, 3425, +     3425, 3426, 3426, 3427, 3427, 3427, 3428, 3428, 3428, 3429, +     3429, 3429, 3430, 3430, 3430, 3431, 3431, 3431, 3432, 3432, +     3432, 3433, 3433, 3434, 3434,  923, 3434, 3434, 3435,  922, +     3435, 3435, 3436, 3436, 3437, 3437, 3438, 3438, 3439, 3439, +     3440, 3440, 3441, 3441, 3442, 3442, 3443, 3443, 3444, 3444, +     3445, 3445, 3446, 3446, 3447, 3447, 3448, 3448, 3449, 3449, + +     3450, 3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, +     3455, 3455, 3456, 3456, 3457, 3457, 3458, 3458, 3459, 3459, +     3460, 3460, 3461, 3461, 3462, 3462, 3463, 3463, 3464, 3464, +     3465, 3465, 3466, 3466, 3467, 3467, 3468, 3468, 3469, 3469, +     3470, 3470, 3471, 3471, 3472, 3472, 3473, 3473, 3474, 3474, +     3475, 3475, 3476, 3476, 3477, 3477, 3478, 3478, 3479, 3479, +     3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483, 3484, 3484, +     3485, 3485, 3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, +     3489, 3490, 3490, 3491, 3491, 3491, 3492, 3492, 3492, 3493, +     3493, 3493, 3494, 3494, 3494, 3495, 3495, 3495, 3496, 3496, + +     3496, 3497, 3497, 3498, 3498, 3498, 3499, 3499, 3499, 3500, +     3500, 3500, 3501, 3501, 3501, 3502, 3502, 3502, 3503, 3503, +     3503, 3504, 3504, 3504, 3505, 3505, 3505, 3506, 3506, 3506, +     3507, 3507, 3508, 3508, 3508, 3509, 3509, 3509, 3510, 3510, +     3510, 3511, 3511, 3511, 3512, 3512, 3512, 3513, 3513, 3513, +     3514, 3514, 3514, 3515, 3515, 3515, 3516, 3516, 3516, 3517, +     3517, 3518, 3518, 3518, 3519, 3519, 3519, 3520, 3520, 3520, +     3521, 3521,  921, 3521, 3521, 3522,  920, 3522, 3522, 3523, +     3523, 3524, 3524, 3525, 3525, 3526, 3526, 3527, 3527, 3528, +     3528, 3529, 3529, 3530, 3530, 3531, 3531, 3532, 3532, 3533, + +     3533, 3534, 3534, 3535, 3535, 3536, 3536, 3537, 3537, 3538, +     3538, 3539, 3539, 3540, 3540, 3541, 3541, 3542, 3542, 3543, +     3543, 3544, 3544, 3545, 3545, 3546, 3546, 3547, 3547, 3548, +     3548, 3549, 3549, 3550, 3550, 3551, 3551, 3552, 3552, 3553, +     3553, 3554, 3554, 3555, 3555, 3556, 3556, 3557, 3557, 3558, +     3558, 3559, 3559, 3560, 3560, 3561, 3561, 3562, 3562, 3563, +     3563, 3564, 3564, 3565, 3565, 3566, 3566, 3567, 3567, 3568, +     3568, 3569, 3569, 3570, 3570, 3571, 3571, 3572, 3572, 3573, +     3573, 3574, 3574, 3575, 3575, 3576, 3576, 3577, 3577, 3578, +     3578, 3579, 3579, 3580, 3580, 3581, 3581, 3581, 3582, 3582, + +     3583, 3583, 3583, 3584, 3584, 3584, 3585, 3585, 3586, 3586, +     3586, 3587, 3587, 3587, 3588, 3588, 3588, 3589, 3589, 3590, +     3590, 3590, 3591, 3591, 3591, 3592, 3592, 3592, 3593, 3593, +     3593, 3594, 3594, 3594, 3595, 3595, 3595, 3596, 3596, 3597, +     3597, 3597, 3598, 3598, 3598, 3599, 3599, 3599, 3600, 3600, +     3601, 3601, 3601, 3602, 3602, 3602, 3603, 3603, 3603, 3604, +     3604, 3604, 3605, 3605, 3605, 3606, 3606, 3606, 3607, 3607, +     3608, 3608, 3608, 3609, 3609, 3609, 3610, 3610, 3610, 3611, +     3611, 3612, 3612, 3612, 3613, 3613, 3613, 3614, 3614, 3614, +     3615, 3615, 3615, 3616, 3616, 3616, 3617, 3617, 3617, 3618, + +     3618, 3619, 3619,  919, 3619, 3619, 3620,  918, 3620, 3620, +     3621, 3621, 3622, 3622, 3623, 3623, 3624, 3624, 3625, 3625, +     3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629, 3630, 3630, +     3631, 3631, 3632, 3632, 3633, 3633, 3634, 3634, 3635, 3635, +     3636, 3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640, +     3641, 3641, 3642, 3642, 3643, 3643, 3644, 3644, 3645, 3645, +     3646, 3646, 3647, 3647, 3648, 3648, 3649, 3649, 3650, 3650, +     3651, 3651, 3652, 3652, 3653, 3653, 3654, 3654, 3655, 3655, +     3656, 3656, 3657, 3657, 3658, 3658, 3659, 3659, 3660, 3660, +     3661, 3661, 3662, 3662, 3663, 3663, 3664, 3664, 3665, 3665, + +     3666, 3666, 3667, 3667, 3668, 3668, 3669, 3669, 3670, 3670, +     3671, 3671, 3672, 3672, 3673, 3673, 3674, 3674, 3675, 3675, +     3676, 3676, 3677, 3677, 3678, 3678, 3679, 3679, 3679, 3680, +     3680, 3681, 3681, 3681, 3682, 3682, 3682, 3683, 3683, 3684, +     3684, 3684, 3685, 3685, 3685, 3686, 3686, 3686, 3687, 3687, +     3687, 3688, 3688, 3688, 3689, 3689, 3689, 3690, 3690, 3690, +     3691, 3691, 3691, 3692, 3692, 3693, 3693, 3693, 3694, 3694, +     3694, 3695, 3695, 3695, 3696, 3696, 3696, 3697, 3697, 3697, +     3698, 3698, 3698, 3699, 3699, 3699, 3700, 3700, 3700, 3701, +     3701, 3701, 3702, 3702, 3703, 3703, 3703, 3704, 3704, 3704, + +     3705, 3705, 3705, 3706, 3706, 3706, 3707, 3707, 3707, 3708, +     3708, 3708, 3709, 3709, 3709, 3710, 3710, 3710, 3711, 3711, +     3711, 3712, 3712, 3713, 3713, 3713, 3714, 3714, 3714, 3715, +     3715, 3715, 3716, 3716,  917, 3716, 3716, 3717,  916, 3717, +     3717, 3718, 3718, 3719, 3719, 3720, 3720, 3721, 3721, 3722, +     3722, 3723, 3723, 3724, 3724, 3725, 3725, 3726, 3726, 3727, +     3727, 3728, 3728, 3729, 3729, 3730, 3730, 3731, 3731, 3732, +     3732, 3733, 3733, 3734, 3734, 3735, 3735, 3736, 3736, 3737, +     3737, 3738, 3738, 3739, 3739, 3740, 3740, 3741, 3741, 3742, +     3742, 3743, 3743, 3744, 3744, 3745, 3745, 3746, 3746, 3747, + +     3747, 3748, 3748, 3749, 3749, 3750, 3750, 3751, 3751, 3752, +     3752, 3753, 3753, 3754, 3754, 3755, 3755, 3756, 3756, 3757, +     3757, 3758, 3758, 3759, 3759, 3760, 3760, 3761, 3761, 3762, +     3762, 3763, 3763, 3764, 3764, 3765, 3765, 3766, 3766, 3767, +     3767, 3768, 3768, 3769, 3769, 3770, 3770, 3771, 3771, 3772, +     3772, 3773, 3773, 3774, 3774, 3775, 3775, 3776, 3776, 3777, +     3777, 3777, 3778, 3778, 3779, 3779, 3779, 3780, 3780, 3780, +     3781, 3781, 3781, 3782, 3782, 3782, 3783, 3783, 3783, 3784, +     3784, 3785, 3785, 3785, 3786, 3786, 3786, 3787, 3787, 3787, +     3788, 3788, 3789, 3789, 3789, 3790, 3790, 3790, 3791, 3791, + +     3791, 3792, 3792, 3792, 3793, 3793, 3793, 3794, 3794, 3794, +     3795, 3795, 3796, 3796, 3796, 3797, 3797, 3797, 3798, 3798, +     3798, 3799, 3799, 3800, 3800, 3800, 3801, 3801, 3801, 3802, +     3802, 3802, 3803, 3803, 3803, 3804, 3804, 3804, 3805, 3805, +     3805, 3806, 3806, 3807, 3807, 3807, 3808, 3808, 3808, 3809, +     3809, 3809, 3810, 3810, 3811, 3811, 3811, 3812, 3812, 3812, +     3813, 3813, 3813, 3814, 3814, 3814, 3815, 3815, 3815, 3816, +     3816, 3816, 3817, 3817, 3818, 3818,  915, 3818, 3818, 3819, +      914, 3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, +     3823, 3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, + +     3828, 3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3833, +     3833, 3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, +     3838, 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, +     3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, +     3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, +     3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, +     3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, +     3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, +     3868, 3869, 3869, 3870, 3870, 3871, 3871, 3872, 3872, 3873, +     3873, 3874, 3874, 3875, 3875, 3876, 3876, 3877, 3877, 3877, + +     3878, 3878, 3878, 3879, 3879, 3879, 3880, 3880, 3881, 3881, +     3881, 3882, 3882, 3882, 3883, 3883, 3883, 3884, 3884, 3884, +     3885, 3885, 3885, 3886, 3886, 3886, 3887, 3887, 3887, 3888, +     3888, 3888, 3889, 3889, 3889, 3890, 3890, 3891, 3891, 3891, +     3892, 3892, 3892, 3893, 3893, 3893, 3894, 3894, 3894, 3895, +     3895, 3895, 3896, 3896, 3896, 3897, 3897, 3897, 3898, 3898, +     3898, 3899, 3899, 3899, 3900, 3900, 3901, 3901, 3901, 3902, +     3902, 3902, 3903, 3903, 3903, 3904, 3904, 3904, 3905, 3905, +     3905, 3906, 3906, 3906, 3907, 3907, 3907, 3908, 3908, 3908, +     3909, 3909, 3909, 3910, 3910, 3911, 3911, 3911, 3912, 3912, + +     3912, 3913, 3913, 3913, 3914, 3914,  912, 3914, 3914, 3915, +      903, 3915, 3915, 3916, 3916, 3917, 3917, 3918, 3918, 3919, +     3919, 3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923, 3924, +     3924, 3925, 3925, 3926, 3926, 3927, 3927, 3928, 3928, 3929, +     3929, 3930, 3930, 3931, 3931, 3932, 3932, 3933, 3933, 3934, +     3934, 3935, 3935, 3936, 3936, 3937, 3937, 3938, 3938, 3939, +     3939, 3940, 3940, 3941, 3941, 3942, 3942, 3943, 3943, 3944, +     3944, 3945, 3945, 3946, 3946, 3947, 3947, 3948, 3948, 3949, +     3949, 3950, 3950, 3951, 3951, 3952, 3952, 3953, 3953, 3954, +     3954, 3955, 3955, 3956, 3956, 3957, 3957, 3958, 3958, 3959, + +     3959, 3960, 3960, 3961, 3961, 3962, 3962, 3963, 3963, 3964, +     3964, 3965, 3965, 3966, 3966, 3967, 3967, 3968, 3968, 3969, +     3969, 3970, 3970, 3971, 3971, 3972, 3972, 3972, 3973, 3973, +     3973, 3974, 3974, 3974, 3975, 3975, 3975, 3976, 3976, 3976, +     3977, 3977, 3977, 3978, 3978, 3979, 3979, 3979, 3980, 3980, +     3980, 3981, 3981, 3981, 3982, 3982, 3982, 3983, 3983, 3983, +     3984, 3984, 3984, 3985, 3985, 3985, 3986, 3986, 3986, 3987, +     3987, 3988, 3988, 3988, 3989, 3989, 3989, 3990, 3990, 3990, +     3991, 3991, 3992, 3992, 3992, 3993, 3993, 3993, 3994, 3994, +     3994, 3995, 3995, 3995, 3996, 3996, 3996, 3997, 3997, 3997, + +     3998, 3998, 3999, 3999, 3999, 4000, 4000, 4000, 4001, 4001, +     4001, 4002, 4002, 4003, 4003, 4003, 4004, 4004, 4004, 4005, +     4005, 4005, 4006, 4006, 4006, 4007, 4007, 4007, 4008, 4008, +     4008, 4009, 4009, 4010, 4010,  894, 4010, 4010, 4011,  891, +     4011, 4011, 4012, 4012, 4013, 4013, 4014, 4014, 4015, 4015, +     4016, 4016, 4017, 4017, 4018, 4018, 4019, 4019, 4020, 4020, +     4021, 4021, 4022, 4022, 4023, 4023, 4024, 4024, 4025, 4025, +     4026, 4026, 4027, 4027, 4028, 4028, 4029, 4029, 4030, 4030, +     4031, 4031, 4032, 4032, 4033, 4033, 4034, 4034, 4035, 4035, +     4036, 4036, 4037, 4037, 4038, 4038, 4039, 4039, 4040, 4040, + +     4041, 4041, 4042, 4042, 4043, 4043, 4044, 4044, 4045, 4045, +     4046, 4046, 4047, 4047, 4048, 4048, 4049, 4049, 4050, 4050, +     4051, 4051, 4052, 4052, 4053, 4053, 4054, 4054, 4055, 4055, +     4056, 4056, 4057, 4057, 4058, 4058, 4059, 4059, 4060, 4060, +     4061, 4061, 4062, 4062, 4063, 4063, 4063, 4064, 4064, 4064, +     4065, 4065, 4065, 4066, 4066, 4066, 4067, 4067, 4067, 4068, +     4068, 4068, 4069, 4069, 4069, 4070, 4070, 4070, 4071, 4071, +     4071, 4072, 4072, 4073, 4073, 4073, 4074, 4074, 4074, 4075, +     4075, 4075, 4076, 4076, 4076, 4077, 4077, 4077, 4078, 4078, +     4078, 4079, 4079, 4079, 4080, 4080, 4080, 4081, 4081, 4081, + +     4082, 4082, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4085, +     4085, 4086, 4086, 4086, 4087, 4087, 4087, 4088, 4088, 4088, +     4089, 4089, 4089, 4090, 4090, 4090, 4091, 4091, 4091, 4092, +     4092, 4093, 4093, 4093, 4094, 4094, 4094, 4095, 4095, 4095, +     4096, 4096,  890, 4096, 4096, 4097,  889, 4097, 4097, 4098, +     4098, 4099, 4099, 4100, 4100, 4101, 4101, 4102, 4102, 4103, +     4103, 4104, 4104, 4105, 4105, 4106, 4106, 4107, 4107, 4108, +     4108, 4109, 4109, 4110, 4110, 4111, 4111, 4112, 4112, 4113, +     4113, 4114, 4114, 4115, 4115, 4116, 4116, 4117, 4117, 4118, +     4118, 4119, 4119, 4120, 4120, 4121, 4121, 4122, 4122, 4123, + +     4123, 4124, 4124, 4125, 4125, 4126, 4126, 4127, 4127, 4128, +     4128, 4129, 4129, 4130, 4130, 4131, 4131, 4132, 4132, 4133, +     4133, 4134, 4134, 4135, 4135, 4136, 4136, 4137, 4137, 4138, +     4138, 4139, 4139, 4140, 4140, 4141, 4141, 4141, 4142, 4142, +     4142, 4143, 4143, 4143, 4144, 4144, 4145, 4145, 4145, 4146, +     4146, 4146, 4147, 4147, 4147, 4148, 4148, 4148, 4149, 4149, +     4149, 4150, 4150, 4150, 4151, 4151, 4151, 4152, 4152, 4153, +     4153, 4153, 4154, 4154, 4154, 4155, 4155, 4155, 4156, 4156, +     4157, 4157, 4157, 4158, 4158, 4158, 4159, 4159, 4159, 4160, +     4160, 4160, 4161, 4161, 4161, 4162, 4162, 4162, 4163, 4163, + +     4164, 4164, 4164, 4165, 4165, 4165, 4166, 4166, 4166, 4167, +     4167, 4168, 4168, 4168, 4169, 4169, 4169, 4170, 4170, 4170, +     4171, 4171, 4171, 4172, 4172, 4172, 4173, 4173, 4173, 4174, +     4174, 4175, 4175,  888, 4175, 4175, 4176,  887, 4176, 4176, +     4177, 4177, 4178, 4178, 4179, 4179, 4180, 4180, 4181, 4181, +     4182, 4182, 4183, 4183, 4184, 4184, 4185, 4185, 4186, 4186, +     4187, 4187, 4188, 4188, 4189, 4189, 4190, 4190, 4191, 4191, +     4192, 4192, 4193, 4193, 4194, 4194, 4195, 4195, 4196, 4196, +     4197, 4197, 4198, 4198, 4199, 4199, 4200, 4200, 4201, 4201, +     4202, 4202, 4203, 4203, 4204, 4204, 4205, 4205, 4206, 4206, + +     4207, 4207, 4208, 4208, 4209, 4209, 4210, 4210, 4211, 4211, +     4212, 4212, 4213, 4213, 4214, 4214, 4215, 4215, 4215, 4216, +     4216, 4216, 4217, 4217, 4217, 4218, 4218, 4218, 4219, 4219, +     4219, 4220, 4220, 4221, 4221, 4221, 4222, 4222, 4222, 4223, +     4223, 4223, 4224, 4224, 4224, 4225, 4225, 4225, 4226, 4226, +     4226, 4227, 4227, 4227, 4228, 4228, 4228, 4229, 4229, 4229, +     4230, 4230, 4231, 4231, 4231, 4232, 4232, 4232, 4233, 4233, +     4233, 4234, 4234, 4234, 4235, 4235, 4235, 4236, 4236, 4236, +     4237, 4237, 4237, 4238, 4238, 4238, 4239, 4239, 4239, 4240, +     4240, 4241, 4241, 4241, 4242, 4242, 4242, 4243, 4243, 4243, + +     4244, 4244,  886, 4244, 4244, 4245,  882, 4245, 4245, 4246, +     4246, 4247, 4247, 4248, 4248, 4249, 4249, 4250, 4250, 4251, +     4251, 4252, 4252, 4253, 4253, 4254, 4254, 4255, 4255, 4256, +     4256, 4257, 4257, 4258, 4258, 4259, 4259, 4260, 4260, 4261, +     4261, 4262, 4262, 4263, 4263, 4264, 4264, 4265, 4265, 4266, +     4266, 4267, 4267, 4268, 4268, 4269, 4269, 4270, 4270, 4271, +     4271, 4272, 4272, 4273, 4273, 4274, 4274, 4275, 4275, 4276, +     4276, 4277, 4277, 4278, 4278, 4279, 4279, 4280, 4280, 4281, +     4281, 4281, 4282, 4282, 4282, 4283, 4283, 4283, 4284, 4284, +     4284, 4285, 4285, 4285, 4286, 4286, 4286, 4287, 4287, 4288, + +     4288, 4288, 4289, 4289, 4289, 4290, 4290, 4290, 4291, 4291, +     4291, 4292, 4292, 4292, 4293, 4293, 4293, 4294, 4294, 4294, +     4295, 4295, 4295, 4296, 4296, 4297, 4297, 4297, 4298, 4298, +     4298, 4299, 4299, 4299, 4300, 4300, 4301, 4301, 4301, 4302, +     4302, 4302, 4303, 4303, 4303, 4304, 4304, 4304, 4305, 4305, +     4305, 4306, 4306, 4306, 4307, 4307, 4308, 4308,  868, 4308, +     4308, 4309,  859, 4309, 4309, 4310, 4310, 4311, 4311, 4312, +     4312, 4313, 4313, 4314, 4314, 4315, 4315, 4316, 4316, 4317, +     4317, 4318, 4318, 4319, 4319, 4320, 4320, 4321, 4321, 4322, +     4322, 4323, 4323, 4324, 4324, 4325, 4325, 4326, 4326, 4327, + +     4327, 4328, 4328, 4329, 4329, 4330, 4330, 4331, 4331, 4332, +     4332, 4333, 4333, 4334, 4334, 4335, 4335, 4336, 4336, 4337, +     4337, 4338, 4338, 4339, 4339, 4339, 4340, 4340, 4340, 4341, +     4341, 4341, 4342, 4342, 4342, 4343, 4343, 4343, 4344, 4344, +     4344, 4345, 4345, 4345, 4346, 4346, 4346, 4347, 4347, 4347, +     4348, 4348, 4349, 4349, 4349, 4350, 4350, 4350, 4351, 4351, +     4351, 4352, 4352, 4352, 4353, 4353, 4353, 4354, 4354, 4354, +     4355, 4355, 4355, 4356, 4356, 4356, 4357, 4357, 4357, 4358, +     4358, 4359, 4359, 4359, 4360, 4360, 4360, 4361, 4361, 4361, +     4362, 4362,  856, 4362, 4362, 4363,  854, 4363, 4363, 4364, + +     4364, 4365, 4365, 4366, 4366, 4367, 4367, 4368, 4368, 4369, +     4369, 4370, 4370, 4371, 4371, 4372, 4372, 4373, 4373, 4374, +     4374, 4375, 4375, 4376, 4376, 4377, 4377, 4378, 4378, 4379, +     4379, 4380, 4380, 4381, 4381, 4382, 4382, 4383, 4383, 4384, +     4384, 4385, 4385, 4386, 4386, 4387, 4387, 4387, 4388, 4388, +     4388, 4389, 4389, 4389, 4390, 4390, 4391, 4391, 4391, 4392, +     4392, 4392, 4393, 4393, 4393, 4394, 4394, 4394, 4395, 4395, +     4395, 4396, 4396, 4396, 4397, 4397, 4397, 4398, 4398, 4399, +     4399, 4399, 4400, 4400, 4400, 4401, 4401, 4401, 4402, 4402, +     4403, 4403, 4403, 4404, 4404, 4404, 4405, 4405, 4405, 4406, + +     4406, 4406, 4407, 4407, 4407, 4408, 4408, 4408, 4409, 4409, +     4410, 4410,  853, 4410, 4410, 4411,  852, 4411, 4411, 4412, +     4412, 4413, 4413, 4414, 4414, 4415, 4415, 4416, 4416, 4417, +     4417, 4418, 4418, 4419, 4419, 4420, 4420, 4421, 4421, 4422, +     4422, 4423, 4423, 4424, 4424, 4425, 4425, 4426, 4426, 4427, +     4427, 4428, 4428, 4429, 4429, 4430, 4430, 4430, 4431, 4431, +     4431, 4432, 4432, 4432, 4433, 4433, 4433, 4434, 4434, 4434,       4435, 4435, 4436, 4436, 4436, 4437, 4437, 4437, 4438, 4438, -     4439, 4439, 4439, 4440, 4440, 4440, 4441, 4441, 4441, 4442, -     4442, 4442, 4443, 4443, 4443, 4444, 4444, 4444, 4445, 4445, - -     4445, 4446, 4446, 4446, 4447, 4447, 4448,  826, 4448, 4448, -     4448, 4449,  825, 4449, 4449, 4450, 4450, 4451, 4451, 4452, -     4452, 4453, 4453, 4454, 4454, 4455, 4455, 4456, 4456, 4457, -     4457, 4458, 4458, 4459, 4459, 4459, 4460, 4460, 4460, 4461, -     4461, 4461, 4462, 4462, 4462, 4463, 4463, 4463, 4464, 4464, -     4464, 4465, 4465, 4465, 4466, 4466, 4467, 4467, 4467, 4468, -     4468, 4468, 4469, 4469, 4469, 4470,  824, 4470, 4470, 4471, -     4471, 4472, 4472, 4473, 4473, 4474, 4474, 4475, 4475, 4476, -     4476, 4477, 4477, 4478, 4478, 4478, 4479, 4479, 4479, 4480, -     4480, 4480, 4481, 4481, 4481, 4482, 4482, 4482, 4483, 4483, - -     4483, 4484, 4484, 4484, 4485, 4485, 4485, 4486, 4486, 4487, -      823, 4487, 4487, 4488, 4488, 4489, 4489, 4490, 4490, 4491, -     4491, 4492, 4492, 4493, 4493, 4493, 4494, 4494, 4494, 4495, -     4495, 4495, 4496, 4496, 4496, 4497, 4497, 4497, 4498, 4498, -     4498, 4499,  822, 4499, 4499, 4500, 4500, 4501, 4501, 4502, -     4502, 4503, 4503, 4503, 4504, 4504, 4504, 4505, 4505, 4505, -     4506, 4506, 4506, 4507,  821, 4507, 4507, 4508, 4508, 4509, -     4509, 4510, 4510, 4510, 4511, 4511, 4511, 4512,  820, 4512, -     4512, 4513, 4513, 4513, 4514,  819, 4514, 4514, 4515,  818, -     4515, 4515, 4516,  817, 4516, 4516, 4517,  816, 4517, 4517, - -     4518,  815, 4518, 4518, 4519,  814, 4519, 4519, 4520,  813, -     4520, 4520, 4521,  812, 4521, 4521, 4522,  811, 4522, 4522, -     4523,  810, 4523, 4523, 4524,  809, 4524, 4524, 4525,  808, -     4525, 4525, 4526,  807, 4526, 4526, 4527,  806, 4527, 4527, -     4528,  805, 4528, 4528, 4529,  804, 4529, 4529, 4530,  803, -     4530, 4530, 4531,  802, 4531, 4531, 4532,  800, 4532, 4532, -     4533,  788, 4533, 4533, 4534,  778, 4534, 4534, 4535,  777, -     4535, 4535, 4536,  776, 4536, 4536, 4537,  775, 4537, 4537, -     4538,  774, 4538, 4538, 4539,  773, 4539, 4539, 4540,  759, -     4540, 4540,  752,  748,  745,  743,  742,  741,  740,  739, - -      738,  737,  736,  735,  734,  733,  732,  731,  730,  729, -      728,  727,  726,  725,  724,  723,  722,  721,  720,  719, -      718,  716,  713,  709,  706,  696,  691,  688,  687,  686, -      685,  684,  683,  682,  671,  665,  658,  656,  655,  654, -      653,  652,  651,  650,  649,  648,  647,  646,  645,  644, -      643,  642,  641,  640,  639,  638,  637,  636,  634,  628, -      627,  614,  613,  612,  602,  601,  595,  594,  593,  592, -      591,  590,  589,  578,  575,  572,  567,  564,  562,  561, -      560,  559,  558,  557,  556,  555,  554,  553,  552,  551, -      550,  549,  548,  547,  545,  539,  534,  533,  511,  506, - -      505,  504,  503,  502,  501,  497,  485,  478,  475,  473, -      472,  471,  470,  469,  468,  467,  466,  465,  464,  463, -      461,  454,  448,  447,  425,  421,  420,  419,  418,  417, -      416,  410,  398,  391,  388,  386,  385,  384,  383,  382, -      381,  380,  379,  377,  370,  362,  361,  340,  328,  308, -      306,  305,  304,  303,  302,  300,  240,  233,  226,  221, -      217,  216,  215,  213,  143,  140,  138,  137,  136,  128, -      126,   70,   60,   58,   56,   55,   53,   50,   48,   41, -       35,   13,    8,    3, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, -     2829, 2829 +     4438, 4439, 4439, 4439, 4440, 4440, 4440, 4441, 4441, 4441, +     4442, 4442, 4442, 4443, 4443, 4443, 4444, 4444, 4444, 4445, + +     4445, 4446, 4446, 4446, 4447, 4447, 4447, 4448, 4448, 4448, +     4449, 4449,  851, 4449, 4449, 4450,  850, 4450, 4450, 4451, +     4451, 4452, 4452, 4453, 4453, 4454, 4454, 4455, 4455, 4456, +     4456, 4457, 4457, 4458, 4458, 4459, 4459, 4460, 4460, 4461, +     4461, 4462, 4462, 4463, 4463, 4464, 4464, 4465, 4465, 4466, +     4466, 4467, 4467, 4467, 4468, 4468, 4468, 4469, 4469, 4469, +     4470, 4470, 4470, 4471, 4471, 4471, 4472, 4472, 4472, 4473, +     4473, 4474, 4474, 4474, 4475, 4475, 4475, 4476, 4476, 4476, +     4477, 4477, 4477, 4478, 4478, 4478, 4479, 4479, 4479, 4480, +     4480, 4480, 4481, 4481, 4481, 4482, 4482, 4483, 4483,  849, + +     4483, 4483, 4484,  848, 4484, 4484, 4485, 4485, 4486, 4486, +     4487, 4487, 4488, 4488, 4489, 4489, 4490, 4490, 4491, 4491, +     4492, 4492, 4493, 4493, 4494, 4494, 4494, 4495, 4495, 4495, +     4496, 4496, 4496, 4497, 4497, 4497, 4498, 4498, 4498, 4499, +     4499, 4499, 4500, 4500, 4500, 4501, 4501, 4502, 4502, 4502, +     4503, 4503, 4503, 4504, 4504, 4504, 4505,  847, 4505, 4505, +     4506, 4506, 4507, 4507, 4508, 4508, 4509, 4509, 4510, 4510, +     4511, 4511, 4512, 4512, 4513, 4513, 4513, 4514, 4514, 4514, +     4515, 4515, 4515, 4516, 4516, 4516, 4517, 4517, 4517, 4518, +     4518, 4518, 4519, 4519, 4519, 4520, 4520, 4520, 4521, 4521, + +     4522,  846, 4522, 4522, 4523, 4523, 4524, 4524, 4525, 4525, +     4526, 4526, 4527, 4527, 4528, 4528, 4528, 4529, 4529, 4529, +     4530, 4530, 4530, 4531, 4531, 4531, 4532, 4532, 4532, 4533, +     4533, 4533, 4534,  845, 4534, 4534, 4535, 4535, 4536, 4536, +     4537, 4537, 4538, 4538, 4538, 4539, 4539, 4539, 4540, 4540, +     4540, 4541, 4541, 4541, 4542,  844, 4542, 4542, 4543, 4543, +     4544, 4544, 4545, 4545, 4545, 4546, 4546, 4546, 4547,  843, +     4547, 4547, 4548, 4548, 4548, 4549,  842, 4549, 4549, 4550, +      841, 4550, 4550, 4551,  840, 4551, 4551, 4552,  839, 4552, +     4552, 4553,  838, 4553, 4553, 4554,  837, 4554, 4554, 4555, + +      836, 4555, 4555, 4556,  835, 4556, 4556, 4557,  834, 4557, +     4557, 4558,  833, 4558, 4558, 4559,  832, 4559, 4559, 4560, +      831, 4560, 4560, 4561,  830, 4561, 4561, 4562,  829, 4562, +     4562, 4563,  828, 4563, 4563, 4564,  827, 4564, 4564, 4565, +      826, 4565, 4565, 4566,  825, 4566, 4566, 4567,  823, 4567, +     4567, 4568,  810, 4568, 4568, 4569,  800, 4569, 4569, 4570, +      799, 4570, 4570, 4571,  798, 4571, 4571, 4572,  797, 4572, +     4572, 4573,  796, 4573, 4573, 4574,  795, 4574, 4574, 4575, +      780, 4575, 4575,  773,  769,  766,  764,  763,  762,  761, +      760,  759,  758,  757,  756,  755,  754,  753,  752,  751, + +      750,  749,  748,  747,  746,  745,  744,  743,  742,  741, +      740,  739,  737,  734,  729,  726,  716,  711,  708,  707, +      706,  705,  704,  703,  702,  690,  684,  677,  675,  674, +      673,  672,  671,  670,  669,  668,  667,  666,  665,  664, +      663,  662,  661,  660,  659,  658,  657,  656,  655,  653, +      647,  645,  632,  631,  630,  620,  619,  613,  612,  611, +      610,  609,  608,  607,  595,  592,  589,  584,  581,  579, +      578,  577,  576,  575,  574,  573,  572,  571,  570,  569, +      568,  567,  566,  565,  564,  562,  556,  550,  549,  526, +      521,  520,  519,  518,  517,  516,  512,  499,  492,  489, + +      487,  486,  485,  484,  483,  482,  481,  480,  479,  478, +      477,  475,  468,  461,  460,  437,  433,  432,  431,  430, +      429,  428,  422,  409,  402,  399,  397,  396,  395,  394, +      393,  392,  391,  390,  388,  381,  372,  371,  349,  337, +      316,  314,  313,  312,  311,  310,  308,  246,  238,  231, +      226,  222,  221,  220,  218,  146,  143,  141,  140,  139, +      131,  129,   72,   61,   59,   57,   56,   54,   51,   49, +       42,   35,   13,    8,    3, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, +     2864, 2864, 2864, 2864      } ;  /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[103] = +static yyconst flex_int32_t yy_rule_can_match_eol[106] =      {   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, 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, 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, 0,  -    1, 0, 0,     }; +    0, 0, 0, 1, 0, 0,     };  static yy_state_type yy_last_accepting_state;  static char *yy_last_accepting_cpos; @@ -4178,7 +4210,7 @@ char *yytext;  #include "read_config_yy.h"  #define YY_NO_INPUT 1 -#line 4182 "read_config_lex.c" +#line 4214 "read_config_lex.c"  #define INITIAL 0 @@ -4365,7 +4397,7 @@ YY_DECL  #line 57 "read_config_lex.l" -#line 4369 "read_config_lex.c" +#line 4401 "read_config_lex.c"  	if ( !(yy_init) )  		{ @@ -4418,13 +4450,13 @@ yy_match:  			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  				{  				yy_current_state = (int) yy_def[yy_current_state]; -				if ( yy_current_state >= 2830 ) +				if ( yy_current_state >= 2865 )  					yy_c = yy_meta[(unsigned int) yy_c];  				}  			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];  			++yy_cp;  			} -		while ( yy_base[yy_current_state] != 10685 ); +		while ( yy_base[yy_current_state] != 10776 );  yy_find_action:  		yy_act = yy_accept[yy_current_state]; @@ -4876,113 +4908,128 @@ YY_RULE_SETUP  case 84:  YY_RULE_SETUP  #line 141 "read_config_lex.l" -{ return T_ERROR_QUEUE_LENGTH; } +{ return T_OPTIONS; }  	YY_BREAK  case 85:  YY_RULE_SETUP -#line 143 "read_config_lex.l" -{ return T_ON; } +#line 142 "read_config_lex.l" +{ return T_TCP_WINDOW_TRACKING; }  	YY_BREAK  case 86:  YY_RULE_SETUP -#line 144 "read_config_lex.l" -{ return T_OFF; } +#line 143 "read_config_lex.l" +{ return T_EXPECT_SYNC; }  	YY_BREAK  case 87:  YY_RULE_SETUP -#line 145 "read_config_lex.l" -{ yylval.val = atoi(yytext); return T_NUMBER; } +#line 144 "read_config_lex.l" +{ return T_ERROR_QUEUE_LENGTH; }  	YY_BREAK  case 88:  YY_RULE_SETUP  #line 146 "read_config_lex.l" -{ yylval.val = atoi(yytext); return T_SIGNED_NUMBER; } +{ return T_ON; }  	YY_BREAK  case 89:  YY_RULE_SETUP  #line 147 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_IP; } +{ return T_OFF; }  	YY_BREAK  case 90:  YY_RULE_SETUP  #line 148 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_IP; } +{ yylval.val = atoi(yytext); return T_NUMBER; }  	YY_BREAK  case 91:  YY_RULE_SETUP  #line 149 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_PATH_VAL; } +{ yylval.val = atoi(yytext); return T_SIGNED_NUMBER; }  	YY_BREAK  case 92:  YY_RULE_SETUP  #line 150 "read_config_lex.l" -{ return T_ALARM; } +{ yylval.string = strdup(yytext); return T_IP; }  	YY_BREAK  case 93:  YY_RULE_SETUP  #line 151 "read_config_lex.l" +{ yylval.string = strdup(yytext); return T_IP; } +	YY_BREAK +case 94: +YY_RULE_SETUP +#line 152 "read_config_lex.l" +{ yylval.string = strdup(yytext); return T_PATH_VAL; } +	YY_BREAK +case 95: +YY_RULE_SETUP +#line 153 "read_config_lex.l" +{ return T_ALARM; } +	YY_BREAK +case 96: +YY_RULE_SETUP +#line 154 "read_config_lex.l"  { fprintf(stderr, "\nWARNING: Now `persistent' mode "  				  "is called `alarm'. Please, update "  				  "your conntrackd.conf file.\n");  			  return T_ALARM; }  	YY_BREAK -case 94: +case 97:  YY_RULE_SETUP -#line 155 "read_config_lex.l" +#line 158 "read_config_lex.l"  { return T_FTFW; }  	YY_BREAK -case 95: +case 98:  YY_RULE_SETUP -#line 156 "read_config_lex.l" +#line 159 "read_config_lex.l"  { fprintf(stderr, "\nWARNING: Now `nack' mode "  				  "is called `ftfw'. Please, update "  				  "your conntrackd.conf file.\n");  			  return T_FTFW; }  	YY_BREAK -case 96: +case 99:  YY_RULE_SETUP -#line 160 "read_config_lex.l" +#line 163 "read_config_lex.l"  { return T_NOTRACK; }  	YY_BREAK -case 97: +case 100:  YY_RULE_SETUP -#line 161 "read_config_lex.l" +#line 164 "read_config_lex.l"  { yylval.string = strdup(yytext); return T_STRING; }  	YY_BREAK -case 98: +case 101:  *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */  (yy_c_buf_p) = yy_cp -= 1;  YY_DO_BEFORE_ACTION; /* set up yytext again */  YY_RULE_SETUP -#line 163 "read_config_lex.l" +#line 166 "read_config_lex.l"  ;  	YY_BREAK -case 99: +case 102:  YY_RULE_SETUP -#line 164 "read_config_lex.l" +#line 167 "read_config_lex.l"  ;  	YY_BREAK -case 100: -/* rule 100 can match eol */ +case 103: +/* rule 103 can match eol */  YY_RULE_SETUP -#line 165 "read_config_lex.l" +#line 168 "read_config_lex.l"  ;  	YY_BREAK  case YY_STATE_EOF(INITIAL): -#line 167 "read_config_lex.l" +#line 170 "read_config_lex.l"  { yyterminate(); }  	YY_BREAK -case 101: +case 104:  YY_RULE_SETUP -#line 169 "read_config_lex.l" +#line 172 "read_config_lex.l"  { return yytext[0]; }  	YY_BREAK -case 102: +case 105:  YY_RULE_SETUP -#line 171 "read_config_lex.l" +#line 174 "read_config_lex.l"  ECHO;  	YY_BREAK -#line 4986 "read_config_lex.c" +#line 5033 "read_config_lex.c"  	case YY_END_OF_BUFFER:  		{ @@ -5272,7 +5319,7 @@ static int yy_get_next_buffer (void)  		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  			{  			yy_current_state = (int) yy_def[yy_current_state]; -			if ( yy_current_state >= 2830 ) +			if ( yy_current_state >= 2865 )  				yy_c = yy_meta[(unsigned int) yy_c];  			}  		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -5300,11 +5347,11 @@ static int yy_get_next_buffer (void)  	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  		{  		yy_current_state = (int) yy_def[yy_current_state]; -		if ( yy_current_state >= 2830 ) +		if ( yy_current_state >= 2865 )  			yy_c = yy_meta[(unsigned int) yy_c];  		}  	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; -	yy_is_jam = (yy_current_state == 2829); +	yy_is_jam = (yy_current_state == 2864);  	return yy_is_jam ? 0 : yy_current_state;  } @@ -5949,7 +5996,7 @@ void yyfree (void * ptr )  #define YYTABLES_NAME "yytables" -#line 171 "read_config_lex.l" +#line 174 "read_config_lex.l" diff --git a/src/read_config_lex.l b/src/read_config_lex.l index b2d4bdb..01fe4fc 100644 --- a/src/read_config_lex.l +++ b/src/read_config_lex.l @@ -47,7 +47,7 @@ ip6_part	{hex_255}":"?  ip6_form1	{ip6_part}{0,16}"::"{ip6_part}{0,16}  ip6_form2	({hex_255}":"){16}{hex_255}  ip6		{ip6_form1}{ip6_cidr}?|{ip6_form2}{ip6_cidr}? -string		[a-zA-Z][a-zA-Z0-9\.]* +string		[a-zA-Z][a-zA-Z0-9\.\-]*  persistent	[P|p][E|e][R|r][S|s][I|i][S|s][T|t][E|e][N|n][T|T]  nack		[N|n][A|a][C|c][K|k]  alarm		[A|a][L|l][A|a][R|r][M|m] @@ -138,6 +138,9 @@ notrack		[N|n][O|o][T|t][R|r][A|a][C|c][K|k]  "NetlinkEventsReliable"		{ return T_NETLINK_EVENTS_RELIABLE; }  "DisableInternalCache"		{ return T_DISABLE_INTERNAL_CACHE; }  "DisableExternalCache"		{ return T_DISABLE_EXTERNAL_CACHE; } +"Options"			{ return T_OPTIONS; } +"TCPWindowTracking"		{ return T_TCP_WINDOW_TRACKING; } +"ExpectationSync"		{ return T_EXPECT_SYNC; }  "ErrorQueueLength"		{ return T_ERROR_QUEUE_LENGTH; }  {is_on}			{ return T_ON; } diff --git a/src/read_config_yy.c b/src/read_config_yy.c index bd3a785..fe9ecd7 100644 --- a/src/read_config_yy.c +++ b/src/read_config_yy.c @@ -237,11 +237,14 @@ static void __max_dedicated_links_reached(void);       T_DISABLE_INTERNAL_CACHE = 343,       T_DISABLE_EXTERNAL_CACHE = 344,       T_ERROR_QUEUE_LENGTH = 345, -     T_IP = 346, -     T_PATH_VAL = 347, -     T_NUMBER = 348, -     T_SIGNED_NUMBER = 349, -     T_STRING = 350 +     T_OPTIONS = 346, +     T_TCP_WINDOW_TRACKING = 347, +     T_EXPECT_SYNC = 348, +     T_IP = 349, +     T_PATH_VAL = 350, +     T_NUMBER = 351, +     T_SIGNED_NUMBER = 352, +     T_STRING = 353     };  #endif  /* Tokens.  */ @@ -333,11 +336,14 @@ static void __max_dedicated_links_reached(void);  #define T_DISABLE_INTERNAL_CACHE 343  #define T_DISABLE_EXTERNAL_CACHE 344  #define T_ERROR_QUEUE_LENGTH 345 -#define T_IP 346 -#define T_PATH_VAL 347 -#define T_NUMBER 348 -#define T_SIGNED_NUMBER 349 -#define T_STRING 350 +#define T_OPTIONS 346 +#define T_TCP_WINDOW_TRACKING 347 +#define T_EXPECT_SYNC 348 +#define T_IP 349 +#define T_PATH_VAL 350 +#define T_NUMBER 351 +#define T_SIGNED_NUMBER 352 +#define T_STRING 353 @@ -355,7 +361,7 @@ typedef union YYSTYPE  /* Line 214 of yacc.c  */ -#line 359 "read_config_yy.c" +#line 365 "read_config_yy.c"  } YYSTYPE;  # define YYSTYPE_IS_TRIVIAL 1  # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -367,7 +373,7 @@ typedef union YYSTYPE  /* Line 264 of yacc.c  */ -#line 371 "read_config_yy.c" +#line 377 "read_config_yy.c"  #ifdef short  # undef short @@ -582,20 +588,20 @@ union yyalloc  /* YYFINAL -- State number of the termination state.  */  #define YYFINAL  21  /* YYLAST -- Last index in YYTABLE.  */ -#define YYLAST   332 +#define YYLAST   349  /* YYNTOKENS -- Number of terminals.  */ -#define YYNTOKENS  98 +#define YYNTOKENS  101  /* YYNNTS -- Number of nonterminals.  */ -#define YYNNTS  94 +#define YYNNTS  99  /* YYNRULES -- Number of rules.  */ -#define YYNRULES  234 +#define YYNRULES  248  /* YYNRULES -- Number of states.  */ -#define YYNSTATES  367 +#define YYNSTATES  385  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */  #define YYUNDEFTOK  2 -#define YYMAXUTOK   350 +#define YYMAXUTOK   353  #define YYTRANSLATE(YYX)						\    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -615,7 +621,7 @@ static const yytype_uint8 yytranslate[] =         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, -       2,     2,     2,    96,     2,    97,     2,     2,     2,     2, +       2,     2,     2,    99,     2,   100,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, @@ -638,7 +644,7 @@ static const yytype_uint8 yytranslate[] =        65,    66,    67,    68,    69,    70,    71,    72,    73,    74,        75,    76,    77,    78,    79,    80,    81,    82,    83,    84,        85,    86,    87,    88,    89,    90,    91,    92,    93,    94, -      95 +      95,    96,    97,    98  };  #if YYDEBUG @@ -656,119 +662,125 @@ static const yytype_uint16 yyprhs[] =       205,   208,   211,   214,   217,   220,   223,   226,   231,   232,       235,   238,   241,   246,   247,   250,   252,   254,   259,   260,       263,   265,   267,   269,   271,   273,   275,   277,   279,   281, -     283,   285,   287,   289,   291,   293,   295,   297,   303,   309, -     315,   316,   319,   321,   323,   325,   327,   329,   331,   332, -     335,   337,   339,   341,   343,   345,   347,   348,   351,   353, -     355,   357,   359,   362,   365,   368,   371,   374,   377,   380, -     383,   385,   387,   390,   395,   396,   399,   401,   403,   404, -     407,   409,   411,   413,   415,   417,   419,   421,   423,   425, -     428,   431,   436,   437,   440,   442,   444,   446,   448,   450, -     452,   454,   456,   458,   460,   462,   464,   466,   468,   470, -     472,   474,   476,   479,   482,   485,   488,   491,   494,   497, -     500,   505,   506,   509,   512,   515,   518,   521,   524,   529, -     536,   543,   544,   547,   553,   559,   560,   563,   565,   567, -     573,   579,   580,   583,   586,   589,   595,   601,   602,   605, -     609,   614,   615,   618,   620,   622,   624,   626,   628,   631, -     634,   637,   640,   643,   646 +     283,   285,   287,   289,   291,   293,   295,   297,   299,   304, +     305,   308,   311,   314,   317,   320,   325,   326,   329,   331, +     337,   343,   349,   350,   353,   355,   357,   359,   361,   363, +     365,   366,   369,   371,   373,   375,   377,   379,   381,   382, +     385,   387,   389,   391,   393,   396,   399,   402,   405,   408, +     411,   414,   417,   419,   421,   424,   429,   430,   433,   435, +     437,   438,   441,   443,   445,   447,   449,   451,   453,   455, +     457,   459,   462,   465,   470,   471,   474,   476,   478,   480, +     482,   484,   486,   488,   490,   492,   494,   496,   498,   500, +     502,   504,   506,   508,   510,   513,   516,   519,   522,   525, +     528,   531,   534,   539,   540,   543,   546,   549,   552,   555, +     558,   563,   570,   577,   578,   581,   587,   593,   594,   597, +     599,   601,   603,   605,   611,   617,   618,   621,   624,   627, +     633,   639,   640,   643,   647,   652,   653,   656,   658,   660, +     662,   664,   666,   669,   672,   675,   678,   681,   684  };  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */  static const yytype_int16 yyrhs[] =  { -      99,     0,    -1,    -1,   100,    -1,   101,    -1,   100,   101, -      -1,   130,    -1,   113,    -1,   107,    -1,   161,    -1,   133, -      -1,   184,    -1,    19,    45,    -1,    19,    46,    -1,    19, -      92,    -1,    61,    45,    -1,    61,    46,    -1,    61,    95, -      -1,    26,    92,    -1,    27,    -1,    11,    93,    -1,    29, -      93,    -1,    30,    93,    -1,    50,    93,    -1,    43,    45, -      -1,    43,    46,    -1,    16,    96,   114,    97,    -1,    -1, -     114,   115,    -1,     3,    91,    -1,    12,    91,    -1,     8, -      96,   117,    97,    -1,     8,    79,    96,   117,    97,    -1, -      -1,   117,   118,    -1,     3,    91,    -1,    12,    91,    -1, -       4,    91,    -1,    13,    91,    -1,    49,    95,    -1,    17, -      93,    -1,    18,    93,    -1,    66,    93,    -1,    65,    93, -      -1,    43,    45,    -1,    43,    46,    -1,    20,    96,   120, -      97,    -1,    20,    79,    96,   120,    97,    -1,    -1,   120, -     121,    -1,     3,    91,    -1,    12,    91,    -1,    82,    91, -      -1,    83,    91,    -1,    49,    95,    -1,     5,    93,    -1, -      66,    93,    -1,    65,    93,    -1,    43,    45,    -1,    43, -      46,    -1,    24,    96,   123,    97,    -1,    24,    79,    96, -     123,    97,    -1,    -1,   123,   124,    -1,     3,    91,    -1, -      12,    91,    -1,    82,    91,    -1,    83,    91,    -1,    49, -      95,    -1,     5,    93,    -1,    66,    93,    -1,    65,    93, -      -1,    43,    45,    -1,    43,    46,    -1,    90,    93,    -1, -       6,    93,    -1,     7,    93,    -1,    10,    96,   128,    97, -      -1,    -1,   128,   129,    -1,     9,    92,    -1,    17,    93, -      -1,    25,    96,   131,    97,    -1,    -1,   131,   132,    -1, -      93,    -1,    95,    -1,    32,    96,   134,    97,    -1,    -1, -     134,   135,    -1,   108,    -1,   109,    -1,   110,    -1,   111, -      -1,   112,    -1,   116,    -1,   119,    -1,   122,    -1,   151, -      -1,   152,    -1,   136,    -1,   137,    -1,   138,    -1,   153, -      -1,   154,    -1,   160,    -1,   150,    -1,    37,    41,    96, -     139,    97,    -1,    37,    42,    96,   141,    97,    -1,    37, -      67,    96,   143,    97,    -1,    -1,   139,   140,    -1,   108, -      -1,   109,    -1,   110,    -1,   111,    -1,   151,    -1,   152, -      -1,    -1,   141,   142,    -1,   148,    -1,   147,    -1,   110, -      -1,   111,    -1,   149,    -1,   146,    -1,    -1,   143,   144, -      -1,   110,    -1,   111,    -1,   145,    -1,   146,    -1,    88, -      45,    -1,    88,    46,    -1,    89,    45,    -1,    89,    46, -      -1,    40,    93,    -1,    51,    93,    -1,    44,    93,    -1, -      64,    93,    -1,    34,    -1,    36,    -1,    38,    91,    -1, -      47,   155,    48,   156,    -1,    -1,   155,   157,    -1,    95, -      -1,   159,    -1,    -1,   158,   159,    -1,    53,    -1,    54, -      -1,    52,    -1,    55,    -1,    56,    -1,    57,    -1,    58, -      -1,    59,    -1,    60,    -1,    62,    45,    -1,    62,    46, -      -1,    31,    96,   162,    97,    -1,    -1,   162,   163,    -1, -     125,    -1,   126,    -1,   102,    -1,   103,    -1,   105,    -1, -     104,    -1,   106,    -1,   127,    -1,   164,    -1,   165,    -1, -     172,    -1,   173,    -1,   174,    -1,   175,    -1,   166,    -1, -     167,    -1,   168,    -1,   169,    -1,    35,    93,    -1,    28, -      93,    -1,    80,    45,    -1,    80,    46,    -1,    80,    93, -      -1,    87,    45,    -1,    87,    46,    -1,    81,    94,    -1, -      84,    96,   170,    97,    -1,    -1,   170,   171,    -1,    85, -      95,    -1,    86,    93,    -1,    39,    95,    -1,    78,    93, -      -1,    68,    93,    -1,    69,    96,   176,    97,    -1,    69, -      75,    76,    96,   176,    97,    -1,    69,    75,    77,    96, -     176,    97,    -1,    -1,   176,   177,    -1,    71,    73,    96, -     178,    97,    -1,    71,    74,    96,   178,    97,    -1,    -1, -     178,   179,    -1,    95,    -1,    24,    -1,    70,    73,    96, -     180,    97,    -1,    70,    74,    96,   180,    97,    -1,    -1, -     180,   181,    -1,     3,    91,    -1,    12,    91,    -1,    72, -      73,    96,   182,    97,    -1,    72,    74,    96,   182,    97, -      -1,    -1,   182,   183,    -1,   158,    48,    24,    -1,    33, -      96,   185,    97,    -1,    -1,   185,   186,    -1,   187,    -1, -     188,    -1,   189,    -1,   190,    -1,   191,    -1,    19,    45, -      -1,    19,    46,    -1,    19,    92,    -1,    61,    45,    -1, -      61,    46,    -1,    61,    95,    -1,    63,    93,    -1 +     102,     0,    -1,    -1,   103,    -1,   104,    -1,   103,   104, +      -1,   133,    -1,   116,    -1,   110,    -1,   169,    -1,   136, +      -1,   192,    -1,    19,    45,    -1,    19,    46,    -1,    19, +      95,    -1,    61,    45,    -1,    61,    46,    -1,    61,    98, +      -1,    26,    95,    -1,    27,    -1,    11,    96,    -1,    29, +      96,    -1,    30,    96,    -1,    50,    96,    -1,    43,    45, +      -1,    43,    46,    -1,    16,    99,   117,   100,    -1,    -1, +     117,   118,    -1,     3,    94,    -1,    12,    94,    -1,     8, +      99,   120,   100,    -1,     8,    79,    99,   120,   100,    -1, +      -1,   120,   121,    -1,     3,    94,    -1,    12,    94,    -1, +       4,    94,    -1,    13,    94,    -1,    49,    98,    -1,    17, +      96,    -1,    18,    96,    -1,    66,    96,    -1,    65,    96, +      -1,    43,    45,    -1,    43,    46,    -1,    20,    99,   123, +     100,    -1,    20,    79,    99,   123,   100,    -1,    -1,   123, +     124,    -1,     3,    94,    -1,    12,    94,    -1,    82,    94, +      -1,    83,    94,    -1,    49,    98,    -1,     5,    96,    -1, +      66,    96,    -1,    65,    96,    -1,    43,    45,    -1,    43, +      46,    -1,    24,    99,   126,   100,    -1,    24,    79,    99, +     126,   100,    -1,    -1,   126,   127,    -1,     3,    94,    -1, +      12,    94,    -1,    82,    94,    -1,    83,    94,    -1,    49, +      98,    -1,     5,    96,    -1,    66,    96,    -1,    65,    96, +      -1,    43,    45,    -1,    43,    46,    -1,    90,    96,    -1, +       6,    96,    -1,     7,    96,    -1,    10,    99,   131,   100, +      -1,    -1,   131,   132,    -1,     9,    95,    -1,    17,    96, +      -1,    25,    99,   134,   100,    -1,    -1,   134,   135,    -1, +      96,    -1,    98,    -1,    32,    99,   137,   100,    -1,    -1, +     137,   138,    -1,   111,    -1,   112,    -1,   113,    -1,   114, +      -1,   115,    -1,   119,    -1,   122,    -1,   125,    -1,   159, +      -1,   160,    -1,   144,    -1,   145,    -1,   146,    -1,   161, +      -1,   162,    -1,   168,    -1,   158,    -1,   139,    -1,    91, +      99,   140,   100,    -1,    -1,   140,   141,    -1,    92,    45, +      -1,    92,    46,    -1,    93,    45,    -1,    93,    46,    -1, +      93,    99,   142,   100,    -1,    -1,   142,   143,    -1,    98, +      -1,    37,    41,    99,   147,   100,    -1,    37,    42,    99, +     149,   100,    -1,    37,    67,    99,   151,   100,    -1,    -1, +     147,   148,    -1,   111,    -1,   112,    -1,   113,    -1,   114, +      -1,   159,    -1,   160,    -1,    -1,   149,   150,    -1,   156, +      -1,   155,    -1,   113,    -1,   114,    -1,   157,    -1,   154, +      -1,    -1,   151,   152,    -1,   113,    -1,   114,    -1,   153, +      -1,   154,    -1,    88,    45,    -1,    88,    46,    -1,    89, +      45,    -1,    89,    46,    -1,    40,    96,    -1,    51,    96, +      -1,    44,    96,    -1,    64,    96,    -1,    34,    -1,    36, +      -1,    38,    94,    -1,    47,   163,    48,   164,    -1,    -1, +     163,   165,    -1,    98,    -1,   167,    -1,    -1,   166,   167, +      -1,    53,    -1,    54,    -1,    52,    -1,    55,    -1,    56, +      -1,    57,    -1,    58,    -1,    59,    -1,    60,    -1,    62, +      45,    -1,    62,    46,    -1,    31,    99,   170,   100,    -1, +      -1,   170,   171,    -1,   128,    -1,   129,    -1,   105,    -1, +     106,    -1,   108,    -1,   107,    -1,   109,    -1,   130,    -1, +     172,    -1,   173,    -1,   180,    -1,   181,    -1,   182,    -1, +     183,    -1,   174,    -1,   175,    -1,   176,    -1,   177,    -1, +      35,    96,    -1,    28,    96,    -1,    80,    45,    -1,    80, +      46,    -1,    80,    96,    -1,    87,    45,    -1,    87,    46, +      -1,    81,    97,    -1,    84,    99,   178,   100,    -1,    -1, +     178,   179,    -1,    85,    98,    -1,    86,    96,    -1,    39, +      98,    -1,    78,    96,    -1,    68,    96,    -1,    69,    99, +     184,   100,    -1,    69,    75,    76,    99,   184,   100,    -1, +      69,    75,    77,    99,   184,   100,    -1,    -1,   184,   185, +      -1,    71,    73,    99,   186,   100,    -1,    71,    74,    99, +     186,   100,    -1,    -1,   186,   187,    -1,    98,    -1,    24, +      -1,    20,    -1,    20,    -1,    70,    73,    99,   188,   100, +      -1,    70,    74,    99,   188,   100,    -1,    -1,   188,   189, +      -1,     3,    94,    -1,    12,    94,    -1,    72,    73,    99, +     190,   100,    -1,    72,    74,    99,   190,   100,    -1,    -1, +     190,   191,    -1,   166,    48,    24,    -1,    33,    99,   193, +     100,    -1,    -1,   193,   194,    -1,   195,    -1,   196,    -1, +     197,    -1,   198,    -1,   199,    -1,    19,    45,    -1,    19, +      46,    -1,    19,    95,    -1,    61,    45,    -1,    61,    46, +      -1,    61,    98,    -1,    63,    96,    -1  };  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */  static const yytype_uint16 yyrline[] =  { -       0,    84,    84,    85,    88,    89,    92,    93,    94,    95, -      96,    97,   100,   105,   109,   114,   119,   124,   156,   161, -     166,   171,   176,   181,   186,   197,   208,   218,   219,   221, -     243,   269,   283,   299,   300,   302,   321,   361,   380,   385, -     405,   412,   418,   424,   430,   436,   442,   456,   472,   473, -     475,   486,   503,   514,   531,   546,   552,   558,   564,   570, -     576,   592,   610,   611,   613,   624,   641,   652,   669,   684, -     690,   696,   702,   708,   714,   720,   725,   730,   732,   733, -     736,   741,   746,   756,   757,   760,   768,   781,   791,   792, -     794,   795,   796,   797,   798,   799,   800,   801,   802,   803, -     804,   805,   806,   807,   808,   809,   810,   813,   818,   823, -     828,   829,   831,   832,   833,   834,   835,   836,   839,   840, -     842,   843,   844,   845,   846,   847,   850,   851,   853,   854, -     855,   856,   859,   864,   869,   874,   879,   885,   890,   895, -     900,   906,   912,   917,   927,   928,   930,   937,   939,   940, -     942,   950,   958,   966,   974,   982,   990,   998,  1006,  1015, -    1021,  1027,  1029,  1030,  1033,  1034,  1035,  1036,  1037,  1038, -    1039,  1040,  1041,  1042,  1043,  1044,  1045,  1046,  1047,  1048, -    1049,  1050,  1053,  1058,  1063,  1068,  1073,  1078,  1083,  1088, -    1093,  1095,  1096,  1099,  1111,  1120,  1128,  1133,  1143,  1148, -    1153,  1158,  1159,  1161,  1170,  1183,  1184,  1186,  1205,  1224, -    1233,  1255,  1256,  1258,  1317,  1377,  1386,  1400,  1401,  1403, -    1405,  1415,  1416,  1419,  1420,  1421,  1422,  1423,  1426,  1431, -    1435,  1440,  1445,  1450,  1482 +       0,    85,    85,    86,    89,    90,    93,    94,    95,    96, +      97,    98,   101,   106,   110,   115,   120,   125,   157,   162, +     167,   172,   177,   182,   187,   198,   209,   219,   220,   222, +     244,   270,   284,   300,   301,   303,   322,   362,   381,   386, +     406,   413,   419,   425,   431,   437,   443,   457,   473,   474, +     476,   487,   504,   515,   532,   547,   553,   559,   565,   571, +     577,   593,   611,   612,   614,   625,   642,   653,   670,   685, +     691,   697,   703,   709,   715,   721,   726,   731,   733,   734, +     737,   742,   747,   757,   758,   761,   769,   782,   792,   793, +     795,   796,   797,   798,   799,   800,   801,   802,   803,   804, +     805,   806,   807,   808,   809,   810,   811,   812,   815,   817, +     818,   821,   826,   831,   843,   851,   863,   864,   866,   871, +     876,   881,   886,   887,   889,   890,   891,   892,   893,   894, +     897,   898,   900,   901,   902,   903,   904,   905,   908,   909, +     911,   912,   913,   914,   917,   922,   927,   932,   937,   943, +     948,   953,   958,   964,   970,   975,   985,   986,   988,   995, +     997,   998,  1000,  1008,  1016,  1024,  1032,  1040,  1048,  1056, +    1064,  1073,  1079,  1085,  1087,  1088,  1091,  1092,  1093,  1094, +    1095,  1096,  1097,  1098,  1099,  1100,  1101,  1102,  1103,  1104, +    1105,  1106,  1107,  1108,  1111,  1116,  1121,  1126,  1131,  1136, +    1141,  1146,  1151,  1153,  1154,  1157,  1169,  1178,  1186,  1191, +    1201,  1206,  1211,  1216,  1217,  1219,  1228,  1241,  1242,  1244, +    1263,  1282,  1301,  1320,  1329,  1351,  1352,  1354,  1413,  1473, +    1482,  1496,  1497,  1499,  1501,  1511,  1512,  1515,  1516,  1517, +    1518,  1519,  1522,  1527,  1531,  1536,  1541,  1546,  1578  };  #endif @@ -797,7 +809,8 @@ static const char *const yytname[] =    "T_NETLINK_OVERRUN_RESYNC", "T_NICE", "T_IPV4_DEST_ADDR",    "T_IPV6_DEST_ADDR", "T_SCHEDULER", "T_TYPE", "T_PRIO",    "T_NETLINK_EVENTS_RELIABLE", "T_DISABLE_INTERNAL_CACHE", -  "T_DISABLE_EXTERNAL_CACHE", "T_ERROR_QUEUE_LENGTH", "T_IP", "T_PATH_VAL", +  "T_DISABLE_EXTERNAL_CACHE", "T_ERROR_QUEUE_LENGTH", "T_OPTIONS", +  "T_TCP_WINDOW_TRACKING", "T_EXPECT_SYNC", "T_IP", "T_PATH_VAL",    "T_NUMBER", "T_SIGNED_NUMBER", "T_STRING", "'{'", "'}'", "$accept",    "configfile", "lines", "line", "logfile_bool", "logfile_path",    "syslog_bool", "syslog_facility", "lock", "strip_nat", "refreshtime", @@ -807,7 +820,8 @@ static const char *const yytname[] =    "udp_option", "tcp_line", "tcp_options", "tcp_option", "hashsize",    "hashlimit", "unix_line", "unix_options", "unix_option",    "ignore_protocol", "ignore_proto_list", "ignore_proto", "sync", -  "sync_list", "sync_line", "sync_mode_alarm", "sync_mode_ftfw", +  "sync_list", "sync_line", "option_line", "options", "option", +  "expect_list", "expect_item", "sync_mode_alarm", "sync_mode_ftfw",    "sync_mode_notrack", "sync_mode_alarm_list", "sync_mode_alarm_line",    "sync_mode_ftfw_list", "sync_mode_ftfw_line", "sync_mode_notrack_list",    "sync_mode_notrack_line", "disable_internal_cache", @@ -841,37 +855,39 @@ static const yytype_uint16 yytoknum[] =       315,   316,   317,   318,   319,   320,   321,   322,   323,   324,       325,   326,   327,   328,   329,   330,   331,   332,   333,   334,       335,   336,   337,   338,   339,   340,   341,   342,   343,   344, -     345,   346,   347,   348,   349,   350,   123,   125 +     345,   346,   347,   348,   349,   350,   351,   352,   353,   123, +     125  };  # endif  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */  static const yytype_uint8 yyr1[] =  { -       0,    98,    99,    99,   100,   100,   101,   101,   101,   101, -     101,   101,   102,   102,   103,   104,   104,   105,   106,   107, -     108,   109,   110,   111,   112,   112,   113,   114,   114,   115, -     115,   116,   116,   117,   117,   118,   118,   118,   118,   118, -     118,   118,   118,   118,   118,   118,   119,   119,   120,   120, -     121,   121,   121,   121,   121,   121,   121,   121,   121,   121, -     122,   122,   123,   123,   124,   124,   124,   124,   124,   124, -     124,   124,   124,   124,   124,   125,   126,   127,   128,   128, -     129,   129,   130,   131,   131,   132,   132,   133,   134,   134, -     135,   135,   135,   135,   135,   135,   135,   135,   135,   135, -     135,   135,   135,   135,   135,   135,   135,   136,   137,   138, -     139,   139,   140,   140,   140,   140,   140,   140,   141,   141, -     142,   142,   142,   142,   142,   142,   143,   143,   144,   144, -     144,   144,   145,   145,   146,   146,   147,   148,   149,   150, -     151,   152,   153,   154,   155,   155,   156,   157,   158,   158, -     159,   159,   159,   159,   159,   159,   159,   159,   159,   160, -     160,   161,   162,   162,   163,   163,   163,   163,   163,   163, -     163,   163,   163,   163,   163,   163,   163,   163,   163,   163, -     163,   163,   164,   165,   166,   166,   166,   167,   167,   168, -     169,   170,   170,   171,   171,   172,   173,   174,   175,   175, -     175,   176,   176,   177,   177,   178,   178,   179,   179,   177, -     177,   180,   180,   181,   181,   177,   177,   182,   182,   183, -     184,   185,   185,   186,   186,   186,   186,   186,   187,   187, -     188,   189,   189,   190,   191 +       0,   101,   102,   102,   103,   103,   104,   104,   104,   104, +     104,   104,   105,   105,   106,   107,   107,   108,   109,   110, +     111,   112,   113,   114,   115,   115,   116,   117,   117,   118, +     118,   119,   119,   120,   120,   121,   121,   121,   121,   121, +     121,   121,   121,   121,   121,   121,   122,   122,   123,   123, +     124,   124,   124,   124,   124,   124,   124,   124,   124,   124, +     125,   125,   126,   126,   127,   127,   127,   127,   127,   127, +     127,   127,   127,   127,   127,   128,   129,   130,   131,   131, +     132,   132,   133,   134,   134,   135,   135,   136,   137,   137, +     138,   138,   138,   138,   138,   138,   138,   138,   138,   138, +     138,   138,   138,   138,   138,   138,   138,   138,   139,   140, +     140,   141,   141,   141,   141,   141,   142,   142,   143,   144, +     145,   146,   147,   147,   148,   148,   148,   148,   148,   148, +     149,   149,   150,   150,   150,   150,   150,   150,   151,   151, +     152,   152,   152,   152,   153,   153,   154,   154,   155,   156, +     157,   158,   159,   160,   161,   162,   163,   163,   164,   165, +     166,   166,   167,   167,   167,   167,   167,   167,   167,   167, +     167,   168,   168,   169,   170,   170,   171,   171,   171,   171, +     171,   171,   171,   171,   171,   171,   171,   171,   171,   171, +     171,   171,   171,   171,   172,   173,   174,   174,   174,   175, +     175,   176,   177,   178,   178,   179,   179,   180,   181,   182, +     183,   183,   183,   184,   184,   185,   185,   186,   186,   187, +     187,   187,   187,   185,   185,   188,   188,   189,   189,   185, +     185,   190,   190,   191,   192,   193,   193,   194,   194,   194, +     194,   194,   195,   195,   196,   197,   197,   198,   199  };  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */ @@ -887,20 +903,21 @@ static const yytype_uint8 yyr2[] =         2,     2,     2,     2,     2,     2,     2,     4,     0,     2,         2,     2,     4,     0,     2,     1,     1,     4,     0,     2,         1,     1,     1,     1,     1,     1,     1,     1,     1,     1, -       1,     1,     1,     1,     1,     1,     1,     5,     5,     5, +       1,     1,     1,     1,     1,     1,     1,     1,     4,     0, +       2,     2,     2,     2,     2,     4,     0,     2,     1,     5, +       5,     5,     0,     2,     1,     1,     1,     1,     1,     1,         0,     2,     1,     1,     1,     1,     1,     1,     0,     2, -       1,     1,     1,     1,     1,     1,     0,     2,     1,     1, -       1,     1,     2,     2,     2,     2,     2,     2,     2,     2, -       1,     1,     2,     4,     0,     2,     1,     1,     0,     2, -       1,     1,     1,     1,     1,     1,     1,     1,     1,     2, -       2,     4,     0,     2,     1,     1,     1,     1,     1,     1, +       1,     1,     1,     1,     2,     2,     2,     2,     2,     2, +       2,     2,     1,     1,     2,     4,     0,     2,     1,     1, +       0,     2,     1,     1,     1,     1,     1,     1,     1,     1, +       1,     2,     2,     4,     0,     2,     1,     1,     1,     1,         1,     1,     1,     1,     1,     1,     1,     1,     1,     1, -       1,     1,     2,     2,     2,     2,     2,     2,     2,     2, -       4,     0,     2,     2,     2,     2,     2,     2,     4,     6, -       6,     0,     2,     5,     5,     0,     2,     1,     1,     5, -       5,     0,     2,     2,     2,     5,     5,     0,     2,     3, -       4,     0,     2,     1,     1,     1,     1,     1,     2,     2, -       2,     2,     2,     2,     2 +       1,     1,     1,     1,     2,     2,     2,     2,     2,     2, +       2,     2,     4,     0,     2,     2,     2,     2,     2,     2, +       4,     6,     6,     0,     2,     5,     5,     0,     2,     1, +       1,     1,     1,     5,     5,     0,     2,     2,     2,     5, +       5,     0,     2,     3,     4,     0,     2,     1,     1,     1, +       1,     1,     2,     2,     2,     2,     2,     2,     2  };  /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -909,116 +926,120 @@ static const yytype_uint8 yyr2[] =  static const yytype_uint8 yydefact[] =  {         2,     0,     0,    19,     0,     0,     0,     0,     3,     4, -       8,     7,     6,    10,     9,    11,    27,    83,   162,    88, -     221,     1,     5,     0,     0,     0,     0,     0,     0,     0, +       8,     7,     6,    10,     9,    11,    27,    83,   174,    88, +     235,     1,     5,     0,     0,     0,     0,     0,     0,     0,        26,    28,    85,    86,    82,    84,     0,     0,     0,     0,         0,     0,     0,     0,     0,     0,     0,     0,     0,     0, -       0,     0,   161,   166,   167,   169,   168,   170,   164,   165, -     171,   163,   172,   173,   178,   179,   180,   181,   174,   175, -     176,   177,     0,     0,     0,     0,     0,     0,   140,   141, -       0,     0,     0,   144,     0,     0,     0,    87,    90,    91, -      92,    93,    94,    95,    96,    97,    89,   100,   101,   102, -     106,    98,    99,   103,   104,   105,     0,     0,     0,   220, -     222,   223,   224,   225,   226,   227,    29,    30,    75,    76, -      78,    12,    13,    14,    18,   183,   182,   195,    15,    16, -      17,   197,     0,   201,   196,   184,   185,   186,   189,   191, -     187,   188,     0,    33,    20,     0,    48,     0,    62,    21, -      22,     0,     0,     0,   142,    24,    25,     0,    23,   159, -     160,   139,   228,   229,   230,   231,   232,   233,   234,     0, -       0,     0,     0,     0,    33,     0,    48,     0,    62,     0, -     110,   118,   126,     0,   152,   150,   151,   153,   154,   155, -     156,   157,   158,   145,   147,     0,     0,    77,    79,   201, -     201,     0,     0,     0,   198,   202,     0,     0,   190,   192, +       0,     0,   173,   178,   179,   181,   180,   182,   176,   177, +     183,   175,   184,   185,   190,   191,   192,   193,   186,   187, +     188,   189,     0,     0,     0,     0,     0,     0,   152,   153, +       0,     0,     0,   156,     0,     0,     0,     0,    87,    90, +      91,    92,    93,    94,    95,    96,    97,    89,   107,   100, +     101,   102,   106,    98,    99,   103,   104,   105,     0,     0, +       0,   234,   236,   237,   238,   239,   240,   241,    29,    30, +      75,    76,    78,    12,    13,    14,    18,   195,   194,   207, +      15,    16,    17,   209,     0,   213,   208,   196,   197,   198, +     201,   203,   199,   200,     0,    33,    20,     0,    48,     0, +      62,    21,    22,     0,     0,     0,   154,    24,    25,     0, +      23,   171,   172,   151,   109,   242,   243,   244,   245,   246, +     247,   248,     0,     0,     0,     0,     0,    33,     0,    48, +       0,    62,     0,   122,   130,   138,     0,   164,   162,   163, +     165,   166,   167,   168,   169,   170,   157,   159,     0,     0, +       0,    77,    79,   213,   213,     0,     0,     0,   210,   214, +       0,     0,   202,   204,     0,     0,     0,     0,     0,     0, +       0,     0,     0,     0,     0,    31,    34,     0,     0,     0, +       0,     0,     0,     0,     0,     0,     0,    46,    49,     0,         0,     0,     0,     0,     0,     0,     0,     0,     0,     0, -       0,    31,    34,     0,     0,     0,     0,     0,     0,     0, -       0,     0,     0,    46,    49,     0,     0,     0,     0,     0, -       0,     0,     0,     0,     0,     0,    60,    63,     0,     0, -       0,   146,   143,    80,    81,     0,     0,     0,     0,     0, -       0,     0,     0,   193,   194,    32,    35,    37,    36,    38, -      40,    41,    44,    45,    39,    43,    42,    47,    50,    55, -      51,    58,    59,    54,    57,    56,    52,    53,    61,    64, -      69,    65,    72,    73,    68,    71,    70,    66,    67,    74, -     107,   112,   113,   114,   115,   111,   116,   117,     0,     0, -       0,     0,   108,   122,   123,   119,   125,   121,   120,   124, -       0,   109,   128,   129,   127,   130,   131,   199,   200,   211, -     211,   205,   205,   217,   217,   136,   138,   137,   134,   135, -     132,   133,     0,     0,     0,     0,   148,   148,     0,     0, -     209,   212,   210,   208,   207,   203,   206,   204,   215,     0, -     218,   216,   213,   214,     0,   149,   219 +      60,    63,     0,     0,     0,   158,   155,     0,     0,   108, +     110,    80,    81,     0,     0,     0,     0,     0,     0,     0, +       0,   205,   206,    32,    35,    37,    36,    38,    40,    41, +      44,    45,    39,    43,    42,    47,    50,    55,    51,    58, +      59,    54,    57,    56,    52,    53,    61,    64,    69,    65, +      72,    73,    68,    71,    70,    66,    67,    74,   119,   124, +     125,   126,   127,   123,   128,   129,     0,     0,     0,     0, +     120,   134,   135,   131,   137,   133,   132,   136,     0,   121, +     140,   141,   139,   142,   143,   111,   112,   113,   114,   116, +     211,   212,   225,   225,   217,   217,   231,   231,   148,   150, +     149,   146,   147,   144,   145,     0,     0,     0,     0,     0, +     160,   160,   118,   115,   117,     0,     0,   223,   226,   224, +     221,   220,   219,   215,   218,   216,   229,     0,   232,   230, +     227,   228,     0,   161,   233  };  /* YYDEFGOTO[NTERM-NUM].  */  static const yytype_int16 yydefgoto[] =  {        -1,     7,     8,     9,    53,    54,    55,    56,    57,    10, -      88,    89,    90,    91,    92,    11,    23,    31,    93,   175, -     222,    94,   177,   234,    95,   179,   247,    58,    59,    60, -     169,   198,    12,    24,    35,    13,    26,    96,    97,    98, -      99,   248,   305,   249,   315,   250,   324,   325,   316,   317, -     318,   319,   100,   101,   102,   103,   104,   157,   252,   193, -     359,   194,   105,    14,    25,    61,    62,    63,    64,    65, -      66,    67,   173,   209,    68,    69,    70,    71,   172,   205, -     344,   356,   342,   351,   346,   360,    15,    27,   110,   111, -     112,   113,   114,   115 +      89,    90,    91,    92,    93,    11,    23,    31,    94,   178, +     226,    95,   180,   238,    96,   182,   251,    58,    59,    60, +     172,   202,    12,    24,    35,    13,    26,    97,    98,   198, +     260,   355,   364,    99,   100,   101,   252,   313,   253,   323, +     254,   332,   333,   324,   325,   326,   327,   102,   103,   104, +     105,   106,   159,   256,   196,   377,   197,   107,    14,    25, +      61,    62,    63,    64,    65,    66,    67,   176,   213,    68, +      69,    70,    71,   175,   209,   358,   374,   356,   368,   360, +     378,    15,    27,   112,   113,   114,   115,   116,   117  };  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing     STATE-NUM.  */ -#define YYPACT_NINF -94 +#define YYPACT_NINF -77  static const yytype_int16 yypact[] =  { -     193,   -93,   -90,   -94,   -84,   -77,   -70,    52,   193,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,    15,   115,   119,   155,    24,   -24,   -13, -     -94,   -94,   -94,   -94,   -94,   -94,     2,    20,    28,    60, -      38,    23,    42,    49,    -7,    62,   -52,    97,    53,    59, -     105,    26,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -47,   101,   -38,   -23,   111,   114,   -94,   -94, -      13,    76,    30,   -94,   118,    65,   135,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   104,     5,   137,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,    88,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   171,   -94,   -94,   172,   -94,   173,   -94,   -94, -     -94,   174,   175,   176,   -94,   -94,   -94,   179,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,    -4, -     177,   178,   -36,    84,   -94,    -3,   -94,    54,   -94,    -1, -     -94,   -94,   -94,   180,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   184,   185,   -94,   -94,   -94, -     -94,   100,   149,   170,   -94,   -94,   182,   186,   -94,   -94, -       4,   189,   190,   191,   192,   194,   195,   200,   196,   197, -     199,   -94,   -94,    74,   198,   203,   204,   202,   206,   207, -     209,   208,   212,   -94,   -94,    25,   213,   214,   215,   205, -     210,   216,   218,   221,   222,   223,   -94,   -94,    98,   132, -      -5,   -94,   -94,   -94,   -94,    71,    89,   188,   224,   225, -     226,   227,   228,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   232,   233, -     234,   217,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     219,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,    17,    21,     7,    36,   169,   211,   237,   238, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   201, -     -94,   -94,   -94,   -94,   261,   -94,   -94 +     194,   -76,   -68,   -77,   -49,   -39,   -14,    98,   194,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,     0,   -42,   124,   153,    10,    20,    28, +     -77,   -77,   -77,   -77,   -77,   -77,    36,    40,    50,    56, +      77,    79,    82,    86,    30,    90,   -50,    92,    42,   104, +     117,   121,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -73,   122,   -44,    34,   135,   145,   -77,   -77, +     -23,   126,   149,   -77,   147,   152,   181,   177,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,    73,    47, +     184,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -10,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   182,   -77,   -77,   183,   -77,   185, +     -77,   -77,   -77,   186,   187,   188,   -77,   -77,   -77,   180, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,    -4,   189,   190,    99,    62,   -77,    -3,   -77, +      29,   -77,    -1,   -77,   -77,   -77,   131,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   130,   195, +     196,   -77,   -77,   -77,   -77,    81,   133,   175,   -77,   -77, +     193,   197,   -77,   -77,     4,   200,   201,   203,   204,   205, +     207,   206,   198,   208,   209,   -77,   -77,    74,   212,   211, +     214,   221,   213,   216,   217,   215,   220,   -77,   -77,    25, +     222,   219,   224,   223,   226,   230,   231,   228,   234,   233, +     -77,   -77,     9,    76,    53,   -77,   -77,   225,     6,   -77, +     -77,   -77,   -77,   109,   142,   218,   232,   235,   236,   237, +     238,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   242,   243,   244,   227, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   229,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,    46,    21,    24,    37,    60, +     199,   210,   -77,   -77,   -77,   239,   247,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   202,   -77,   -77, +     -77,   -77,   259,   -77,   -77  };  /* YYPGOTO[NTERM-NUM].  */  static const yytype_int16 yypgoto[] =  { -     -94,   -94,   -94,   278,   -94,   -94,   -94,   -94,   -94,   -94, -      45,    46,   -35,    -8,   -94,   -94,   -94,   -94,   -94,   123, -     -94,   -94,   122,   -94,   -94,   136,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,    67,   -94, -     -94,   -94,   -94,    70,    82,   -94,   -94,   -94,   -94,   -94, -     -94,   -49,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94,   -94,   -94,   -94,   -94,   -22,   -94, -     -17,   -94,   -11,   -94,    -2,   -94,   -94,   -94,   -94,   -94, -     -94,   -94,   -94,   -94 +     -77,   -77,   -77,   292,   -77,   -77,   -77,   -77,   -77,   -77, +      67,    68,    -7,    11,   -77,   -77,   -77,   -77,   -77,   125, +     -77,   -77,   144,   -77,   -77,   140,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,    71,   -77,   -77,   -77,   -77,    78,    80, +     -77,   -77,   -77,   -77,   -77,   -77,   -35,   -77,   -77,   -77, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77, +     -77,   -77,   -77,    75,   -77,    -2,   -77,     1,   -77,     2, +     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77  };  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If @@ -1028,121 +1049,125 @@ static const yytype_int16 yypgoto[] =  #define YYTABLE_NINF -1  static const yytype_uint16 yytable[] =  { -     211,   212,   236,    16,   237,   195,    17,   211,   212,   213, -     214,   238,    18,   196,   215,   216,   213,   214,    28,    19, -     348,   215,   216,   132,   348,    77,    20,    29,   236,   349, -     237,   353,   142,   349,   201,   202,   203,   238,   128,   129, -     217,   145,   239,   106,   133,    84,   218,   217,   240,   143, -     165,   166,    21,   218,   151,   152,   147,   224,   146,   225, -     353,   204,   219,   220,   241,   242,   226,   116,   239,   219, -     220,   140,   141,   148,   240,   155,   156,   224,   117,   225, -     153,   243,   244,   320,   311,   107,   226,   108,   130,   245, -     241,   242,   321,   197,   221,   118,   246,   227,   135,   136, -     167,   265,   354,   228,   355,   121,   122,   243,   244,    73, -     159,   160,    30,   119,   350,   245,   125,   227,   352,   229, -     230,   109,   288,   228,   120,    36,    37,    76,    77,    38, -     124,   354,    78,   357,    79,   126,   231,   232,    39,   229, -     230,   201,   202,   203,   127,    40,   137,    41,    84,   162, -     163,   233,   123,   138,    42,   131,   231,   232,    43,   201, -     202,   203,    77,    72,   170,   171,    73,   154,   327,   206, -     207,   277,   308,   257,   258,    74,   309,   255,   256,    75, -      44,   208,    84,   310,    76,    77,   328,    45,    46,    78, -     134,    79,    80,    81,   144,   300,   164,    47,    82,    48, -      49,   139,    83,    50,   149,    84,    51,   150,    32,     1, -      33,   158,    34,   303,   313,   322,    52,    85,     2,    86, -       3,   311,   259,   260,     4,     5,     6,   183,   161,   312, -     168,   184,   185,   186,   187,   188,   189,   190,   191,   192, -     304,   314,   323,   261,   262,   272,   273,   281,   282,   364, -     292,   293,    87,   184,   185,   186,   187,   188,   189,   190, -     191,   192,   338,   339,   340,   341,   358,   174,   176,   178, -     180,   181,   182,   199,   200,   251,   253,   263,   254,   264, -     266,   267,   268,   269,   329,   366,    22,   270,   271,   278, -     275,   274,   276,   301,   302,   280,   279,   210,   223,   286, -     284,   283,   285,   287,   289,   294,   291,   290,   361,   295, -     365,   296,   297,   298,   235,   345,   299,   326,   306,   343, -     330,   331,   332,   333,   334,   335,   336,   337,   362,   363, -     307,     0,   347 +     215,   216,   240,    28,   241,   199,   144,   215,   216,   217, +     218,   242,    29,   200,   219,   220,   217,   218,   153,   154, +      73,   219,   220,    16,   365,   134,   145,   365,   240,   108, +     241,    17,   228,   366,   229,   147,   366,   242,    76,    77, +     221,   230,   243,    78,   155,    79,   222,   221,   244,   135, +      18,   337,   338,   222,    32,   148,    33,   370,    34,    84, +      19,   371,   223,   224,   245,   246,   173,   174,   243,   223, +     224,   109,   231,   110,   244,   130,   131,   228,   232,   229, +     370,   247,   248,    77,   371,    20,   230,   137,   138,   249, +     245,   246,   168,   169,   233,   234,   201,   225,    21,   250, +      30,   123,   124,    84,   273,   339,    77,   247,   248,   308, +     111,   235,   236,   149,   118,   249,   316,   231,   165,   166, +     317,   367,   119,   232,   369,   296,    84,   318,   132,   237, +      36,    37,   120,   150,    38,   372,   121,   373,   139,   233, +     234,   328,   319,    39,   362,   170,   363,   210,   211,   122, +      40,   125,    41,   329,   265,   266,   235,   236,   372,    42, +     375,    72,   212,    43,    73,   319,   142,   143,   167,   205, +     206,   207,   126,    74,   285,   127,   320,    75,   128,   205, +     206,   207,    76,    77,   129,    44,   133,    78,   136,    79, +      80,    81,    45,    46,   157,   158,    82,   161,   162,   208, +      83,   140,    47,    84,    48,    49,   267,   268,    50,   340, +       1,    51,   205,   206,   207,    85,   141,    86,   146,     2, +     156,     3,   257,   258,    52,     4,     5,     6,   186,   255, +     259,   151,   187,   188,   189,   190,   191,   192,   193,   194, +     195,   152,   341,   160,    87,   311,   321,   330,   269,   270, +     382,   280,   281,    88,   187,   188,   189,   190,   191,   192, +     193,   194,   195,   312,   322,   331,   289,   290,   300,   301, +     335,   336,   351,   352,   353,   354,   164,   163,   263,   264, +     171,   177,   179,   384,   181,   183,   184,   185,   203,   204, +     261,   271,   262,   272,   274,   275,   282,   276,   277,   376, +      22,   278,   214,   279,   283,   284,   286,   287,   288,   294, +     379,   291,   292,   293,   295,   298,   297,   342,   299,   309, +     310,   239,   305,   227,   302,   334,   303,   304,   306,   307, +     314,   343,   315,   380,   344,   345,   346,   347,   348,   349, +     350,   381,   383,   359,   357,     0,     0,     0,     0,   361  };  static const yytype_int16 yycheck[] =  { -       3,     4,     3,    96,     5,     9,    96,     3,     4,    12, -      13,    12,    96,    17,    17,    18,    12,    13,     3,    96, -       3,    17,    18,    75,     3,    30,    96,    12,     3,    12, -       5,    24,    79,    12,    70,    71,    72,    12,    45,    46, -      43,    79,    43,    19,    96,    50,    49,    43,    49,    96, -      45,    46,     0,    49,    41,    42,    79,     3,    96,     5, -      24,    97,    65,    66,    65,    66,    12,    91,    43,    65, -      66,    45,    46,    96,    49,    45,    46,     3,    91,     5, -      67,    82,    83,    88,    89,    61,    12,    63,    95,    90, -      65,    66,    97,    97,    97,    93,    97,    43,    45,    46, -      95,    97,    95,    49,    97,    45,    46,    82,    83,    11, -      45,    46,    97,    93,    97,    90,    93,    43,    97,    65, -      66,    97,    97,    49,    96,     6,     7,    29,    30,    10, -      92,    95,    34,    97,    36,    93,    82,    83,    19,    65, -      66,    70,    71,    72,    95,    26,    93,    28,    50,    45, -      46,    97,    92,    94,    35,    93,    82,    83,    39,    70, -      71,    72,    30,     8,    76,    77,    11,    91,    97,    85, -      86,    97,    40,    73,    74,    20,    44,   199,   200,    24, -      61,    97,    50,    51,    29,    30,    97,    68,    69,    34, -      93,    36,    37,    38,    93,    97,    92,    78,    43,    80, -      81,    96,    47,    84,    93,    50,    87,    93,    93,    16, -      95,    93,    97,   248,   249,   250,    97,    62,    25,    64, -      27,    89,    73,    74,    31,    32,    33,    48,    93,    97, -      93,    52,    53,    54,    55,    56,    57,    58,    59,    60, -     248,   249,   250,    73,    74,    45,    46,    45,    46,    48, -      45,    46,    97,    52,    53,    54,    55,    56,    57,    58, -      59,    60,    45,    46,    45,    46,    97,    96,    96,    96, -      96,    96,    96,    96,    96,    95,    92,    95,    93,    93, -      91,    91,    91,    91,    96,    24,     8,    93,    93,    91, -      93,    95,    93,   248,   248,    91,    93,   174,   176,    91, -      93,    95,    93,    91,    91,    95,    91,    93,    97,    93, -     359,    93,    91,    91,   178,   332,    93,   250,   248,   330, -      96,    96,    96,    96,    96,    93,    93,    93,    91,    91, -     248,    -1,   334 +       3,     4,     3,     3,     5,     9,    79,     3,     4,    12, +      13,    12,    12,    17,    17,    18,    12,    13,    41,    42, +      11,    17,    18,    99,     3,    75,    99,     3,     3,    19, +       5,    99,     3,    12,     5,    79,    12,    12,    29,    30, +      43,    12,    43,    34,    67,    36,    49,    43,    49,    99, +      99,    45,    46,    49,    96,    99,    98,    20,   100,    50, +      99,    24,    65,    66,    65,    66,    76,    77,    43,    65, +      66,    61,    43,    63,    49,    45,    46,     3,    49,     5, +      20,    82,    83,    30,    24,    99,    12,    45,    46,    90, +      65,    66,    45,    46,    65,    66,   100,   100,     0,   100, +     100,    45,    46,    50,   100,    99,    30,    82,    83,   100, +     100,    82,    83,    79,    94,    90,    40,    43,    45,    46, +      44,   100,    94,    49,   100,   100,    50,    51,    98,   100, +       6,     7,    96,    99,    10,    98,    96,   100,    96,    65, +      66,    88,    89,    19,    98,    98,   100,    85,    86,    99, +      26,    95,    28,   100,    73,    74,    82,    83,    98,    35, +     100,     8,   100,    39,    11,    89,    45,    46,    95,    70, +      71,    72,    95,    20,   100,    96,   100,    24,    96,    70, +      71,    72,    29,    30,    98,    61,    96,    34,    96,    36, +      37,    38,    68,    69,    45,    46,    43,    45,    46,   100, +      47,    97,    78,    50,    80,    81,    73,    74,    84,   100, +      16,    87,    70,    71,    72,    62,    99,    64,    96,    25, +      94,    27,    92,    93,   100,    31,    32,    33,    48,    98, +     100,    96,    52,    53,    54,    55,    56,    57,    58,    59, +      60,    96,   100,    96,    91,   252,   253,   254,    73,    74, +      48,    45,    46,   100,    52,    53,    54,    55,    56,    57, +      58,    59,    60,   252,   253,   254,    45,    46,    45,    46, +      45,    46,    45,    46,    45,    46,    99,    96,   203,   204, +      96,    99,    99,    24,    99,    99,    99,    99,    99,    99, +      95,    98,    96,    96,    94,    94,    98,    94,    94,   100, +       8,    96,   177,    96,    96,    96,    94,    96,    94,    94, +     100,    98,    96,    96,    94,    96,    94,    99,    94,   252, +     252,   181,    94,   179,    98,   254,    96,    96,    94,    96, +     252,    99,   252,    94,    99,    99,    99,    99,    96,    96, +      96,    94,   377,   345,   343,    -1,    -1,    -1,    -1,   347  };  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing     symbol of state STATE-NUM.  */  static const yytype_uint8 yystos[] =  { -       0,    16,    25,    27,    31,    32,    33,    99,   100,   101, -     107,   113,   130,   133,   161,   184,    96,    96,    96,    96, -      96,     0,   101,   114,   131,   162,   134,   185,     3,    12, -      97,   115,    93,    95,    97,   132,     6,     7,    10,    19, +       0,    16,    25,    27,    31,    32,    33,   102,   103,   104, +     110,   116,   133,   136,   169,   192,    99,    99,    99,    99, +      99,     0,   104,   117,   134,   170,   137,   193,     3,    12, +     100,   118,    96,    98,   100,   135,     6,     7,    10,    19,        26,    28,    35,    39,    61,    68,    69,    78,    80,    81, -      84,    87,    97,   102,   103,   104,   105,   106,   125,   126, -     127,   163,   164,   165,   166,   167,   168,   169,   172,   173, -     174,   175,     8,    11,    20,    24,    29,    30,    34,    36, -      37,    38,    43,    47,    50,    62,    64,    97,   108,   109, -     110,   111,   112,   116,   119,   122,   135,   136,   137,   138, -     150,   151,   152,   153,   154,   160,    19,    61,    63,    97, -     186,   187,   188,   189,   190,   191,    91,    91,    93,    93, -      96,    45,    46,    92,    92,    93,    93,    95,    45,    46, -      95,    93,    75,    96,    93,    45,    46,    93,    94,    96, -      45,    46,    79,    96,    93,    79,    96,    79,    96,    93, -      93,    41,    42,    67,    91,    45,    46,   155,    93,    45, -      46,    93,    45,    46,    92,    45,    46,    95,    93,   128, -      76,    77,   176,   170,    96,   117,    96,   120,    96,   123, -      96,    96,    96,    48,    52,    53,    54,    55,    56,    57, -      58,    59,    60,   157,   159,     9,    17,    97,   129,    96, -      96,    70,    71,    72,    97,   177,    85,    86,    97,   171, -     117,     3,     4,    12,    13,    17,    18,    43,    49,    65, -      66,    97,   118,   120,     3,     5,    12,    43,    49,    65, -      66,    82,    83,    97,   121,   123,     3,     5,    12,    43, -      49,    65,    66,    82,    83,    90,    97,   124,   139,   141, -     143,    95,   156,    92,    93,   176,   176,    73,    74,    73, -      74,    73,    74,    95,    93,    97,    91,    91,    91,    91, -      93,    93,    45,    46,    95,    93,    93,    97,    91,    93, -      91,    45,    46,    95,    93,    93,    91,    91,    97,    91, -      93,    91,    45,    46,    95,    93,    93,    91,    91,    93, -      97,   108,   109,   110,   111,   140,   151,   152,    40,    44, -      51,    89,    97,   110,   111,   142,   146,   147,   148,   149, -      88,    97,   110,   111,   144,   145,   146,    97,    97,    96, -      96,    96,    96,    96,    96,    93,    93,    93,    45,    46, -      45,    46,   180,   180,   178,   178,   182,   182,     3,    12, -      97,   181,    97,    24,    95,    97,   179,    97,    97,   158, -     183,    97,    91,    91,    48,   159,    24 +      84,    87,   100,   105,   106,   107,   108,   109,   128,   129, +     130,   171,   172,   173,   174,   175,   176,   177,   180,   181, +     182,   183,     8,    11,    20,    24,    29,    30,    34,    36, +      37,    38,    43,    47,    50,    62,    64,    91,   100,   111, +     112,   113,   114,   115,   119,   122,   125,   138,   139,   144, +     145,   146,   158,   159,   160,   161,   162,   168,    19,    61, +      63,   100,   194,   195,   196,   197,   198,   199,    94,    94, +      96,    96,    99,    45,    46,    95,    95,    96,    96,    98, +      45,    46,    98,    96,    75,    99,    96,    45,    46,    96, +      97,    99,    45,    46,    79,    99,    96,    79,    99,    79, +      99,    96,    96,    41,    42,    67,    94,    45,    46,   163, +      96,    45,    46,    96,    99,    45,    46,    95,    45,    46, +      98,    96,   131,    76,    77,   184,   178,    99,   120,    99, +     123,    99,   126,    99,    99,    99,    48,    52,    53,    54, +      55,    56,    57,    58,    59,    60,   165,   167,   140,     9, +      17,   100,   132,    99,    99,    70,    71,    72,   100,   185, +      85,    86,   100,   179,   120,     3,     4,    12,    13,    17, +      18,    43,    49,    65,    66,   100,   121,   123,     3,     5, +      12,    43,    49,    65,    66,    82,    83,   100,   124,   126, +       3,     5,    12,    43,    49,    65,    66,    82,    83,    90, +     100,   127,   147,   149,   151,    98,   164,    92,    93,   100, +     141,    95,    96,   184,   184,    73,    74,    73,    74,    73, +      74,    98,    96,   100,    94,    94,    94,    94,    96,    96, +      45,    46,    98,    96,    96,   100,    94,    96,    94,    45, +      46,    98,    96,    96,    94,    94,   100,    94,    96,    94, +      45,    46,    98,    96,    96,    94,    94,    96,   100,   111, +     112,   113,   114,   148,   159,   160,    40,    44,    51,    89, +     100,   113,   114,   150,   154,   155,   156,   157,    88,   100, +     113,   114,   152,   153,   154,    45,    46,    45,    46,    99, +     100,   100,    99,    99,    99,    99,    99,    99,    96,    96, +      96,    45,    46,    45,    46,   142,   188,   188,   186,   186, +     190,   190,    98,   100,   143,     3,    12,   100,   189,   100, +      20,    24,    98,   100,   187,   100,   100,   166,   191,   100, +      94,    94,    48,   167,    24  };  #define yyerrok		(yyerrstatus = 0) @@ -1956,7 +1981,7 @@ yyreduce:          case 12:  /* Line 1455 of yacc.c  */ -#line 101 "read_config_yy.y" +#line 102 "read_config_yy.y"      {  	strncpy(conf.logfile, DEFAULT_LOGFILE, FILENAME_MAXLEN);  } @@ -1965,7 +1990,7 @@ yyreduce:    case 13:  /* Line 1455 of yacc.c  */ -#line 106 "read_config_yy.y" +#line 107 "read_config_yy.y"      {  }      break; @@ -1973,7 +1998,7 @@ yyreduce:    case 14:  /* Line 1455 of yacc.c  */ -#line 110 "read_config_yy.y" +#line 111 "read_config_yy.y"      {  	strncpy(conf.logfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN);  } @@ -1982,7 +2007,7 @@ yyreduce:    case 15:  /* Line 1455 of yacc.c  */ -#line 115 "read_config_yy.y" +#line 116 "read_config_yy.y"      {  	conf.syslog_facility = DEFAULT_SYSLOG_FACILITY;  } @@ -1991,7 +2016,7 @@ yyreduce:    case 16:  /* Line 1455 of yacc.c  */ -#line 120 "read_config_yy.y" +#line 121 "read_config_yy.y"      {  	conf.syslog_facility = -1;  } @@ -2000,7 +2025,7 @@ yyreduce:    case 17:  /* Line 1455 of yacc.c  */ -#line 125 "read_config_yy.y" +#line 126 "read_config_yy.y"      {  	if (!strcmp((yyvsp[(2) - (2)].string), "daemon"))  		conf.syslog_facility = LOG_DAEMON; @@ -2036,7 +2061,7 @@ yyreduce:    case 18:  /* Line 1455 of yacc.c  */ -#line 157 "read_config_yy.y" +#line 158 "read_config_yy.y"      {  	strncpy(conf.lockfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN);  } @@ -2045,7 +2070,7 @@ yyreduce:    case 19:  /* Line 1455 of yacc.c  */ -#line 162 "read_config_yy.y" +#line 163 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`StripNAT' clause is obsolete, ignoring");  } @@ -2054,7 +2079,7 @@ yyreduce:    case 20:  /* Line 1455 of yacc.c  */ -#line 167 "read_config_yy.y" +#line 168 "read_config_yy.y"      {  	conf.refresh = (yyvsp[(2) - (2)].val);  } @@ -2063,7 +2088,7 @@ yyreduce:    case 21:  /* Line 1455 of yacc.c  */ -#line 172 "read_config_yy.y" +#line 173 "read_config_yy.y"      {  	conf.cache_timeout = (yyvsp[(2) - (2)].val);  } @@ -2072,7 +2097,7 @@ yyreduce:    case 22:  /* Line 1455 of yacc.c  */ -#line 177 "read_config_yy.y" +#line 178 "read_config_yy.y"      {  	conf.commit_timeout = (yyvsp[(2) - (2)].val);  } @@ -2081,7 +2106,7 @@ yyreduce:    case 23:  /* Line 1455 of yacc.c  */ -#line 182 "read_config_yy.y" +#line 183 "read_config_yy.y"      {  	conf.purge_timeout = (yyvsp[(2) - (2)].val);  } @@ -2090,7 +2115,7 @@ yyreduce:    case 24:  /* Line 1455 of yacc.c  */ -#line 187 "read_config_yy.y" +#line 188 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "the use of `Checksum' outside the "  				"`Multicast' clause is ambiguous"); @@ -2105,7 +2130,7 @@ yyreduce:    case 25:  /* Line 1455 of yacc.c  */ -#line 198 "read_config_yy.y" +#line 199 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "the use of `Checksum' outside the "  				"`Multicast' clause is ambiguous"); @@ -2120,7 +2145,7 @@ yyreduce:    case 26:  /* Line 1455 of yacc.c  */ -#line 209 "read_config_yy.y" +#line 210 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_ADDRESS, @@ -2134,7 +2159,7 @@ yyreduce:    case 29:  /* Line 1455 of yacc.c  */ -#line 222 "read_config_yy.y" +#line 223 "read_config_yy.y"      {  	union inet_address ip; @@ -2160,7 +2185,7 @@ yyreduce:    case 30:  /* Line 1455 of yacc.c  */ -#line 244 "read_config_yy.y" +#line 245 "read_config_yy.y"      {  	union inet_address ip; @@ -2190,7 +2215,7 @@ yyreduce:    case 31:  /* Line 1455 of yacc.c  */ -#line 270 "read_config_yy.y" +#line 271 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_MCAST) { @@ -2208,7 +2233,7 @@ yyreduce:    case 32:  /* Line 1455 of yacc.c  */ -#line 284 "read_config_yy.y" +#line 285 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_MCAST) { @@ -2228,7 +2253,7 @@ yyreduce:    case 35:  /* Line 1455 of yacc.c  */ -#line 303 "read_config_yy.y" +#line 304 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2251,7 +2276,7 @@ yyreduce:    case 36:  /* Line 1455 of yacc.c  */ -#line 322 "read_config_yy.y" +#line 323 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2295,7 +2320,7 @@ yyreduce:    case 37:  /* Line 1455 of yacc.c  */ -#line 362 "read_config_yy.y" +#line 363 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2318,7 +2343,7 @@ yyreduce:    case 38:  /* Line 1455 of yacc.c  */ -#line 381 "read_config_yy.y" +#line 382 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`IPv6_interface' not required, ignoring");  } @@ -2327,7 +2352,7 @@ yyreduce:    case 39:  /* Line 1455 of yacc.c  */ -#line 386 "read_config_yy.y" +#line 387 "read_config_yy.y"      {  	unsigned int idx; @@ -2351,7 +2376,7 @@ yyreduce:    case 40:  /* Line 1455 of yacc.c  */ -#line 406 "read_config_yy.y" +#line 407 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`Backlog' option inside Multicast clause is "  				"obsolete. Please, remove it from " @@ -2362,7 +2387,7 @@ yyreduce:    case 41:  /* Line 1455 of yacc.c  */ -#line 413 "read_config_yy.y" +#line 414 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.mcast.port = (yyvsp[(2) - (2)].val); @@ -2372,7 +2397,7 @@ yyreduce:    case 42:  /* Line 1455 of yacc.c  */ -#line 419 "read_config_yy.y" +#line 420 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.mcast.sndbuf = (yyvsp[(2) - (2)].val); @@ -2382,7 +2407,7 @@ yyreduce:    case 43:  /* Line 1455 of yacc.c  */ -#line 425 "read_config_yy.y" +#line 426 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.mcast.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2392,7 +2417,7 @@ yyreduce:    case 44:  /* Line 1455 of yacc.c  */ -#line 431 "read_config_yy.y" +#line 432 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.mcast.checksum = 0; @@ -2402,7 +2427,7 @@ yyreduce:    case 45:  /* Line 1455 of yacc.c  */ -#line 437 "read_config_yy.y" +#line 438 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.mcast.checksum = 1; @@ -2412,7 +2437,7 @@ yyreduce:    case 46:  /* Line 1455 of yacc.c  */ -#line 443 "read_config_yy.y" +#line 444 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_UDP) { @@ -2430,7 +2455,7 @@ yyreduce:    case 47:  /* Line 1455 of yacc.c  */ -#line 457 "read_config_yy.y" +#line 458 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_UDP) { @@ -2450,7 +2475,7 @@ yyreduce:    case 50:  /* Line 1455 of yacc.c  */ -#line 476 "read_config_yy.y" +#line 477 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2465,7 +2490,7 @@ yyreduce:    case 51:  /* Line 1455 of yacc.c  */ -#line 487 "read_config_yy.y" +#line 488 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2486,7 +2511,7 @@ yyreduce:    case 52:  /* Line 1455 of yacc.c  */ -#line 504 "read_config_yy.y" +#line 505 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2501,7 +2526,7 @@ yyreduce:    case 53:  /* Line 1455 of yacc.c  */ -#line 515 "read_config_yy.y" +#line 516 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2522,7 +2547,7 @@ yyreduce:    case 54:  /* Line 1455 of yacc.c  */ -#line 532 "read_config_yy.y" +#line 533 "read_config_yy.y"      {  	int idx; @@ -2541,7 +2566,7 @@ yyreduce:    case 55:  /* Line 1455 of yacc.c  */ -#line 547 "read_config_yy.y" +#line 548 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.udp.port = (yyvsp[(2) - (2)].val); @@ -2551,7 +2576,7 @@ yyreduce:    case 56:  /* Line 1455 of yacc.c  */ -#line 553 "read_config_yy.y" +#line 554 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.udp.sndbuf = (yyvsp[(2) - (2)].val); @@ -2561,7 +2586,7 @@ yyreduce:    case 57:  /* Line 1455 of yacc.c  */ -#line 559 "read_config_yy.y" +#line 560 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.udp.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2571,7 +2596,7 @@ yyreduce:    case 58:  /* Line 1455 of yacc.c  */ -#line 565 "read_config_yy.y" +#line 566 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.udp.checksum = 0; @@ -2581,7 +2606,7 @@ yyreduce:    case 59:  /* Line 1455 of yacc.c  */ -#line 571 "read_config_yy.y" +#line 572 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.udp.checksum = 1; @@ -2591,7 +2616,7 @@ yyreduce:    case 60:  /* Line 1455 of yacc.c  */ -#line 577 "read_config_yy.y" +#line 578 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_TCP) { @@ -2611,7 +2636,7 @@ yyreduce:    case 61:  /* Line 1455 of yacc.c  */ -#line 593 "read_config_yy.y" +#line 594 "read_config_yy.y"      {  	if (conf.channel_type_global != CHANNEL_NONE &&  	    conf.channel_type_global != CHANNEL_TCP) { @@ -2633,7 +2658,7 @@ yyreduce:    case 64:  /* Line 1455 of yacc.c  */ -#line 614 "read_config_yy.y" +#line 615 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2648,7 +2673,7 @@ yyreduce:    case 65:  /* Line 1455 of yacc.c  */ -#line 625 "read_config_yy.y" +#line 626 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2669,7 +2694,7 @@ yyreduce:    case 66:  /* Line 1455 of yacc.c  */ -#line 642 "read_config_yy.y" +#line 643 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2684,7 +2709,7 @@ yyreduce:    case 67:  /* Line 1455 of yacc.c  */ -#line 653 "read_config_yy.y" +#line 654 "read_config_yy.y"      {  	__max_dedicated_links_reached(); @@ -2705,7 +2730,7 @@ yyreduce:    case 68:  /* Line 1455 of yacc.c  */ -#line 670 "read_config_yy.y" +#line 671 "read_config_yy.y"      {  	int idx; @@ -2724,7 +2749,7 @@ yyreduce:    case 69:  /* Line 1455 of yacc.c  */ -#line 685 "read_config_yy.y" +#line 686 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.tcp.port = (yyvsp[(2) - (2)].val); @@ -2734,7 +2759,7 @@ yyreduce:    case 70:  /* Line 1455 of yacc.c  */ -#line 691 "read_config_yy.y" +#line 692 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.tcp.sndbuf = (yyvsp[(2) - (2)].val); @@ -2744,7 +2769,7 @@ yyreduce:    case 71:  /* Line 1455 of yacc.c  */ -#line 697 "read_config_yy.y" +#line 698 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.tcp.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2754,7 +2779,7 @@ yyreduce:    case 72:  /* Line 1455 of yacc.c  */ -#line 703 "read_config_yy.y" +#line 704 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.tcp.checksum = 0; @@ -2764,7 +2789,7 @@ yyreduce:    case 73:  /* Line 1455 of yacc.c  */ -#line 709 "read_config_yy.y" +#line 710 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	conf.channel[conf.channel_num].u.tcp.checksum = 1; @@ -2774,7 +2799,7 @@ yyreduce:    case 74:  /* Line 1455 of yacc.c  */ -#line 715 "read_config_yy.y" +#line 716 "read_config_yy.y"      {  	__max_dedicated_links_reached();  	CONFIG(channelc).error_queue_length = (yyvsp[(2) - (2)].val); @@ -2784,7 +2809,7 @@ yyreduce:    case 75:  /* Line 1455 of yacc.c  */ -#line 721 "read_config_yy.y" +#line 722 "read_config_yy.y"      {  	conf.hashsize = (yyvsp[(2) - (2)].val);  } @@ -2793,7 +2818,7 @@ yyreduce:    case 76:  /* Line 1455 of yacc.c  */ -#line 726 "read_config_yy.y" +#line 727 "read_config_yy.y"      {  	conf.limit = (yyvsp[(2) - (2)].val);  } @@ -2802,7 +2827,7 @@ yyreduce:    case 80:  /* Line 1455 of yacc.c  */ -#line 737 "read_config_yy.y" +#line 738 "read_config_yy.y"      {  	strcpy(conf.local.path, (yyvsp[(2) - (2)].string));  } @@ -2811,7 +2836,7 @@ yyreduce:    case 81:  /* Line 1455 of yacc.c  */ -#line 742 "read_config_yy.y" +#line 743 "read_config_yy.y"      {  	conf.local.backlog = (yyvsp[(2) - (2)].val);  } @@ -2820,7 +2845,7 @@ yyreduce:    case 82:  /* Line 1455 of yacc.c  */ -#line 747 "read_config_yy.y" +#line 748 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_L4PROTO, @@ -2834,7 +2859,7 @@ yyreduce:    case 85:  /* Line 1455 of yacc.c  */ -#line 761 "read_config_yy.y" +#line 762 "read_config_yy.y"      {  	if ((yyvsp[(1) - (1)].val) < IPPROTO_MAX)  		ct_filter_add_proto(STATE(us_filter), (yyvsp[(1) - (1)].val)); @@ -2846,7 +2871,7 @@ yyreduce:    case 86:  /* Line 1455 of yacc.c  */ -#line 769 "read_config_yy.y" +#line 770 "read_config_yy.y"      {  	struct protoent *pent; @@ -2863,7 +2888,7 @@ yyreduce:    case 87:  /* Line 1455 of yacc.c  */ -#line 782 "read_config_yy.y" +#line 783 "read_config_yy.y"      {  	if (conf.flags & CTD_STATS_MODE) {  		print_err(CTD_CFG_ERROR, "cannot use both `Stats' and `Sync' " @@ -2874,139 +2899,210 @@ yyreduce:  }      break; -  case 107: +  case 111:  /* Line 1455 of yacc.c  */ -#line 814 "read_config_yy.y" +#line 822 "read_config_yy.y" +    { +	CONFIG(sync).tcp_window_tracking = 1; +} +    break; + +  case 112: + +/* Line 1455 of yacc.c  */ +#line 827 "read_config_yy.y" +    { +	CONFIG(sync).tcp_window_tracking = 0; +} +    break; + +  case 113: + +/* Line 1455 of yacc.c  */ +#line 832 "read_config_yy.y" +    { +	CONFIG(flags) |= CTD_EXPECT; +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY | +				 NF_NETLINK_CONNTRACK_EXP_NEW | +				 NF_NETLINK_CONNTRACK_EXP_UPDATE | +				 NF_NETLINK_CONNTRACK_EXP_DESTROY; +} +    break; + +  case 114: + +/* Line 1455 of yacc.c  */ +#line 844 "read_config_yy.y" +    { +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY; +} +    break; + +  case 115: + +/* Line 1455 of yacc.c  */ +#line 852 "read_config_yy.y" +    { +	CONFIG(flags) |= CTD_EXPECT; +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY | +				 NF_NETLINK_CONNTRACK_EXP_NEW | +				 NF_NETLINK_CONNTRACK_EXP_UPDATE | +				 NF_NETLINK_CONNTRACK_EXP_DESTROY; +} +    break; + +  case 118: + +/* Line 1455 of yacc.c  */ +#line 867 "read_config_yy.y" +    { +	exp_filter_add(STATE(exp_filter), (yyvsp[(1) - (1)].string)); +} +    break; + +  case 119: + +/* Line 1455 of yacc.c  */ +#line 872 "read_config_yy.y"      {  	conf.flags |= CTD_SYNC_ALARM;  }      break; -  case 108: +  case 120:  /* Line 1455 of yacc.c  */ -#line 819 "read_config_yy.y" +#line 877 "read_config_yy.y"      {  	conf.flags |= CTD_SYNC_FTFW;  }      break; -  case 109: +  case 121:  /* Line 1455 of yacc.c  */ -#line 824 "read_config_yy.y" +#line 882 "read_config_yy.y"      {  	conf.flags |= CTD_SYNC_NOTRACK;  }      break; -  case 132: +  case 144:  /* Line 1455 of yacc.c  */ -#line 860 "read_config_yy.y" +#line 918 "read_config_yy.y"      {  	conf.sync.internal_cache_disable = 1;  }      break; -  case 133: +  case 145:  /* Line 1455 of yacc.c  */ -#line 865 "read_config_yy.y" +#line 923 "read_config_yy.y"      {  	conf.sync.internal_cache_disable = 0;  }      break; -  case 134: +  case 146:  /* Line 1455 of yacc.c  */ -#line 870 "read_config_yy.y" +#line 928 "read_config_yy.y"      {  	conf.sync.external_cache_disable = 1;  }      break; -  case 135: +  case 147:  /* Line 1455 of yacc.c  */ -#line 875 "read_config_yy.y" +#line 933 "read_config_yy.y"      {  	conf.sync.external_cache_disable = 0;  }      break; -  case 136: +  case 148:  /* Line 1455 of yacc.c  */ -#line 880 "read_config_yy.y" +#line 938 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`ResendBufferSize' is deprecated. "  				"Use `ResendQueueSize' instead");  }      break; -  case 137: +  case 149:  /* Line 1455 of yacc.c  */ -#line 886 "read_config_yy.y" +#line 944 "read_config_yy.y"      {  	conf.resend_queue_size = (yyvsp[(2) - (2)].val);  }      break; -  case 138: +  case 150:  /* Line 1455 of yacc.c  */ -#line 891 "read_config_yy.y" +#line 949 "read_config_yy.y"      {  	conf.window_size = (yyvsp[(2) - (2)].val);  }      break; -  case 139: +  case 151:  /* Line 1455 of yacc.c  */ -#line 896 "read_config_yy.y" +#line 954 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`DestroyTimeout' is deprecated. Remove it");  }      break; -  case 140: +  case 152:  /* Line 1455 of yacc.c  */ -#line 901 "read_config_yy.y" +#line 959 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`RelaxTransitions' clause is obsolete. "  				"Please, remove it from conntrackd.conf");  }      break; -  case 141: +  case 153:  /* Line 1455 of yacc.c  */ -#line 907 "read_config_yy.y" +#line 965 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`DelayDestroyMessages' clause is obsolete. "  				"Please, remove it from conntrackd.conf");  }      break; -  case 142: +  case 154:  /* Line 1455 of yacc.c  */ -#line 913 "read_config_yy.y" +#line 971 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "the clause `ListenTo' is obsolete, ignoring");  }      break; -  case 143: +  case 155:  /* Line 1455 of yacc.c  */ -#line 918 "read_config_yy.y" +#line 976 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_STATE, @@ -3017,10 +3113,10 @@ yyreduce:  }      break; -  case 146: +  case 158:  /* Line 1455 of yacc.c  */ -#line 931 "read_config_yy.y" +#line 989 "read_config_yy.y"      {  	if (strncmp((yyvsp[(1) - (1)].string), "TCP", strlen("TCP")) != 0) {  		print_err(CTD_CFG_WARN, "unsupported protocol `%s' in line %d", @@ -3029,10 +3125,10 @@ yyreduce:  }      break; -  case 150: +  case 162:  /* Line 1455 of yacc.c  */ -#line 943 "read_config_yy.y" +#line 1001 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3042,10 +3138,10 @@ yyreduce:  }      break; -  case 151: +  case 163:  /* Line 1455 of yacc.c  */ -#line 951 "read_config_yy.y" +#line 1009 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3055,10 +3151,10 @@ yyreduce:  }      break; -  case 152: +  case 164:  /* Line 1455 of yacc.c  */ -#line 959 "read_config_yy.y" +#line 1017 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3068,10 +3164,10 @@ yyreduce:  }      break; -  case 153: +  case 165:  /* Line 1455 of yacc.c  */ -#line 967 "read_config_yy.y" +#line 1025 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3081,10 +3177,10 @@ yyreduce:  }      break; -  case 154: +  case 166:  /* Line 1455 of yacc.c  */ -#line 975 "read_config_yy.y" +#line 1033 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3094,10 +3190,10 @@ yyreduce:  }      break; -  case 155: +  case 167:  /* Line 1455 of yacc.c  */ -#line 983 "read_config_yy.y" +#line 1041 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3107,10 +3203,10 @@ yyreduce:  }      break; -  case 156: +  case 168:  /* Line 1455 of yacc.c  */ -#line 991 "read_config_yy.y" +#line 1049 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3120,10 +3216,10 @@ yyreduce:  }      break; -  case 157: +  case 169:  /* Line 1455 of yacc.c  */ -#line 999 "read_config_yy.y" +#line 1057 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3133,10 +3229,10 @@ yyreduce:  }      break; -  case 158: +  case 170:  /* Line 1455 of yacc.c  */ -#line 1007 "read_config_yy.y" +#line 1065 "read_config_yy.y"      {  	ct_filter_add_state(STATE(us_filter),  			    IPPROTO_TCP, @@ -3146,102 +3242,102 @@ yyreduce:  }      break; -  case 159: +  case 171:  /* Line 1455 of yacc.c  */ -#line 1016 "read_config_yy.y" +#line 1074 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`CacheWriteThrough' clause is obsolete, "  				"ignoring");  }      break; -  case 160: +  case 172:  /* Line 1455 of yacc.c  */ -#line 1022 "read_config_yy.y" +#line 1080 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`CacheWriteThrough' clause is obsolete, "  				"ignoring");  }      break; -  case 182: +  case 194:  /* Line 1455 of yacc.c  */ -#line 1054 "read_config_yy.y" +#line 1112 "read_config_yy.y"      {  	conf.netlink_buffer_size = (yyvsp[(2) - (2)].val);  }      break; -  case 183: +  case 195:  /* Line 1455 of yacc.c  */ -#line 1059 "read_config_yy.y" +#line 1117 "read_config_yy.y"      {  	conf.netlink_buffer_size_max_grown = (yyvsp[(2) - (2)].val);  }      break; -  case 184: +  case 196:  /* Line 1455 of yacc.c  */ -#line 1064 "read_config_yy.y" +#line 1122 "read_config_yy.y"      {  	conf.nl_overrun_resync = 30;  }      break; -  case 185: +  case 197:  /* Line 1455 of yacc.c  */ -#line 1069 "read_config_yy.y" +#line 1127 "read_config_yy.y"      {  	conf.nl_overrun_resync = -1;  }      break; -  case 186: +  case 198:  /* Line 1455 of yacc.c  */ -#line 1074 "read_config_yy.y" +#line 1132 "read_config_yy.y"      {  	conf.nl_overrun_resync = (yyvsp[(2) - (2)].val);  }      break; -  case 187: +  case 199:  /* Line 1455 of yacc.c  */ -#line 1079 "read_config_yy.y" +#line 1137 "read_config_yy.y"      {  	conf.netlink.events_reliable = 1;  }      break; -  case 188: +  case 200:  /* Line 1455 of yacc.c  */ -#line 1084 "read_config_yy.y" +#line 1142 "read_config_yy.y"      {  	conf.netlink.events_reliable = 0;  }      break; -  case 189: +  case 201:  /* Line 1455 of yacc.c  */ -#line 1089 "read_config_yy.y" +#line 1147 "read_config_yy.y"      {  	conf.nice = (yyvsp[(2) - (2)].val);  }      break; -  case 193: +  case 205:  /* Line 1455 of yacc.c  */ -#line 1100 "read_config_yy.y" +#line 1158 "read_config_yy.y"      {  	if (strcasecmp((yyvsp[(2) - (2)].string), "rr") == 0) {  		conf.sched.type = SCHED_RR; @@ -3254,10 +3350,10 @@ yyreduce:  }      break; -  case 194: +  case 206:  /* Line 1455 of yacc.c  */ -#line 1112 "read_config_yy.y" +#line 1170 "read_config_yy.y"      {  	conf.sched.prio = (yyvsp[(2) - (2)].val);  	if (conf.sched.prio < 0 || conf.sched.prio > 99) { @@ -3267,10 +3363,10 @@ yyreduce:  }      break; -  case 195: +  case 207:  /* Line 1455 of yacc.c  */ -#line 1121 "read_config_yy.y" +#line 1179 "read_config_yy.y"      {  	if (strncmp((yyvsp[(2) - (2)].string), "IPv6", strlen("IPv6")) == 0)  		conf.family = AF_INET6; @@ -3279,19 +3375,19 @@ yyreduce:  }      break; -  case 196: +  case 208:  /* Line 1455 of yacc.c  */ -#line 1129 "read_config_yy.y" +#line 1187 "read_config_yy.y"      {  	CONFIG(event_iterations_limit) = (yyvsp[(2) - (2)].val);  }      break; -  case 197: +  case 209:  /* Line 1455 of yacc.c  */ -#line 1134 "read_config_yy.y" +#line 1192 "read_config_yy.y"      {  	conf.flags |= CTD_POLL;  	conf.poll_kernel_secs = (yyvsp[(2) - (2)].val); @@ -3302,37 +3398,37 @@ yyreduce:  }      break; -  case 198: +  case 210:  /* Line 1455 of yacc.c  */ -#line 1144 "read_config_yy.y" +#line 1202 "read_config_yy.y"      {  	CONFIG(filter_from_kernelspace) = 0;  }      break; -  case 199: +  case 211:  /* Line 1455 of yacc.c  */ -#line 1149 "read_config_yy.y" +#line 1207 "read_config_yy.y"      {  	CONFIG(filter_from_kernelspace) = 0;  }      break; -  case 200: +  case 212:  /* Line 1455 of yacc.c  */ -#line 1154 "read_config_yy.y" +#line 1212 "read_config_yy.y"      {  	CONFIG(filter_from_kernelspace) = 1;  }      break; -  case 203: +  case 215:  /* Line 1455 of yacc.c  */ -#line 1162 "read_config_yy.y" +#line 1220 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_L4PROTO, @@ -3342,10 +3438,10 @@ yyreduce:  }      break; -  case 204: +  case 216:  /* Line 1455 of yacc.c  */ -#line 1171 "read_config_yy.y" +#line 1229 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_L4PROTO, @@ -3359,10 +3455,10 @@ yyreduce:  }      break; -  case 207: +  case 219:  /* Line 1455 of yacc.c  */ -#line 1187 "read_config_yy.y" +#line 1245 "read_config_yy.y"      {  	struct protoent *pent; @@ -3382,10 +3478,10 @@ yyreduce:  }      break; -  case 208: +  case 220:  /* Line 1455 of yacc.c  */ -#line 1206 "read_config_yy.y" +#line 1264 "read_config_yy.y"      {  	struct protoent *pent; @@ -3405,10 +3501,56 @@ yyreduce:  }      break; -  case 209: +  case 221: + +/* Line 1455 of yacc.c  */ +#line 1283 "read_config_yy.y" +    { +	struct protoent *pent; + +	pent = getprotobyname("udp"); +	if (pent == NULL) { +		print_err(CTD_CFG_WARN, "getprotobyname() cannot find " +					"protocol `udp' in /etc/protocols"); +		break; +	} +	ct_filter_add_proto(STATE(us_filter), pent->p_proto); + +	__kernel_filter_start(); + +	nfct_filter_add_attr_u32(STATE(filter), +				 NFCT_FILTER_L4PROTO, +				 pent->p_proto); +} +    break; + +  case 222:  /* Line 1455 of yacc.c  */ -#line 1225 "read_config_yy.y" +#line 1302 "read_config_yy.y" +    { +	struct protoent *pent; + +	pent = getprotobyname("udp"); +	if (pent == NULL) { +		print_err(CTD_CFG_WARN, "getprotobyname() cannot find " +					"protocol `udp' in /etc/protocols"); +		break; +	} +	ct_filter_add_proto(STATE(us_filter), pent->p_proto); + +	__kernel_filter_start(); + +	nfct_filter_add_attr_u32(STATE(filter), +				 NFCT_FILTER_L4PROTO, +				 pent->p_proto); +} +    break; + +  case 223: + +/* Line 1455 of yacc.c  */ +#line 1321 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_ADDRESS, @@ -3418,10 +3560,10 @@ yyreduce:  }      break; -  case 210: +  case 224:  /* Line 1455 of yacc.c  */ -#line 1234 "read_config_yy.y" +#line 1330 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_ADDRESS, @@ -3444,10 +3586,10 @@ yyreduce:  }      break; -  case 213: +  case 227:  /* Line 1455 of yacc.c  */ -#line 1259 "read_config_yy.y" +#line 1355 "read_config_yy.y"      {  	union inet_address ip;  	char *slash; @@ -3507,10 +3649,10 @@ yyreduce:  }      break; -  case 214: +  case 228:  /* Line 1455 of yacc.c  */ -#line 1318 "read_config_yy.y" +#line 1414 "read_config_yy.y"      {  	union inet_address ip;  	char *slash; @@ -3571,10 +3713,10 @@ yyreduce:  }      break; -  case 215: +  case 229:  /* Line 1455 of yacc.c  */ -#line 1378 "read_config_yy.y" +#line 1474 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_STATE, @@ -3584,10 +3726,10 @@ yyreduce:  }      break; -  case 216: +  case 230:  /* Line 1455 of yacc.c  */ -#line 1387 "read_config_yy.y" +#line 1483 "read_config_yy.y"      {  	ct_filter_set_logic(STATE(us_filter),  			    CT_FILTER_STATE, @@ -3602,10 +3744,10 @@ yyreduce:  }      break; -  case 220: +  case 234:  /* Line 1455 of yacc.c  */ -#line 1406 "read_config_yy.y" +#line 1502 "read_config_yy.y"      {  	if (conf.flags & CTD_SYNC_MODE) {  		print_err(CTD_CFG_ERROR, "cannot use both `Stats' and `Sync' " @@ -3616,54 +3758,54 @@ yyreduce:  }      break; -  case 228: +  case 242:  /* Line 1455 of yacc.c  */ -#line 1427 "read_config_yy.y" +#line 1523 "read_config_yy.y"      {  	strncpy(conf.stats.logfile, DEFAULT_STATS_LOGFILE, FILENAME_MAXLEN);  }      break; -  case 229: +  case 243:  /* Line 1455 of yacc.c  */ -#line 1432 "read_config_yy.y" +#line 1528 "read_config_yy.y"      {  }      break; -  case 230: +  case 244:  /* Line 1455 of yacc.c  */ -#line 1436 "read_config_yy.y" +#line 1532 "read_config_yy.y"      {  	strncpy(conf.stats.logfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN);  }      break; -  case 231: +  case 245:  /* Line 1455 of yacc.c  */ -#line 1441 "read_config_yy.y" +#line 1537 "read_config_yy.y"      {  	conf.stats.syslog_facility = DEFAULT_SYSLOG_FACILITY;  }      break; -  case 232: +  case 246:  /* Line 1455 of yacc.c  */ -#line 1446 "read_config_yy.y" +#line 1542 "read_config_yy.y"      {  	conf.stats.syslog_facility = -1;  }      break; -  case 233: +  case 247:  /* Line 1455 of yacc.c  */ -#line 1451 "read_config_yy.y" +#line 1547 "read_config_yy.y"      {  	if (!strcmp((yyvsp[(2) - (2)].string), "daemon"))  		conf.stats.syslog_facility = LOG_DAEMON; @@ -3696,10 +3838,10 @@ yyreduce:  }      break; -  case 234: +  case 248:  /* Line 1455 of yacc.c  */ -#line 1483 "read_config_yy.y" +#line 1579 "read_config_yy.y"      {  	print_err(CTD_CFG_WARN, "`LogFileBufferSize' is deprecated");  } @@ -3708,7 +3850,7 @@ yyreduce:  /* Line 1455 of yacc.c  */ -#line 3712 "read_config_yy.c" +#line 3854 "read_config_yy.c"        default: break;      }    YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -3920,7 +4062,7 @@ yyreturn:  /* Line 1675 of yacc.c  */ -#line 1487 "read_config_yy.y" +#line 1583 "read_config_yy.y"  int __attribute__((noreturn)) @@ -3998,6 +4140,7 @@ init_config(char *filename)  	/* Zero may be a valid facility */  	CONFIG(syslog_facility) = -1;  	CONFIG(stats).syslog_facility = -1; +	CONFIG(netlink).subsys_id = -1;  	yyrestart(fp);  	yyparse(); @@ -4036,7 +4179,7 @@ init_config(char *filename)  	/* default number of bucket of the hashtable that are committed in  	   one run loop. XXX: no option available to tune this value yet. */  	if (CONFIG(general).commit_steps == 0) -		CONFIG(general).commit_steps = 64; +		CONFIG(general).commit_steps = 8192;  	/* if overrun, automatically resync with kernel after 30 seconds */  	if (CONFIG(nl_overrun_resync) == 0) @@ -4046,6 +4189,13 @@ init_config(char *filename)  	if (CONFIG(channelc).error_queue_length == 0)  		CONFIG(channelc).error_queue_length = 128; +	if (CONFIG(netlink).subsys_id == -1) { +		CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; +		CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +					 NF_NETLINK_CONNTRACK_UPDATE | +					 NF_NETLINK_CONNTRACK_DESTROY; +	} +  	return 0;  } diff --git a/src/read_config_yy.h b/src/read_config_yy.h index c1c2a98..a941e7e 100644 --- a/src/read_config_yy.h +++ b/src/read_config_yy.h @@ -127,11 +127,14 @@       T_DISABLE_INTERNAL_CACHE = 343,       T_DISABLE_EXTERNAL_CACHE = 344,       T_ERROR_QUEUE_LENGTH = 345, -     T_IP = 346, -     T_PATH_VAL = 347, -     T_NUMBER = 348, -     T_SIGNED_NUMBER = 349, -     T_STRING = 350 +     T_OPTIONS = 346, +     T_TCP_WINDOW_TRACKING = 347, +     T_EXPECT_SYNC = 348, +     T_IP = 349, +     T_PATH_VAL = 350, +     T_NUMBER = 351, +     T_SIGNED_NUMBER = 352, +     T_STRING = 353     };  #endif  /* Tokens.  */ @@ -223,11 +226,14 @@  #define T_DISABLE_INTERNAL_CACHE 343  #define T_DISABLE_EXTERNAL_CACHE 344  #define T_ERROR_QUEUE_LENGTH 345 -#define T_IP 346 -#define T_PATH_VAL 347 -#define T_NUMBER 348 -#define T_SIGNED_NUMBER 349 -#define T_STRING 350 +#define T_OPTIONS 346 +#define T_TCP_WINDOW_TRACKING 347 +#define T_EXPECT_SYNC 348 +#define T_IP 349 +#define T_PATH_VAL 350 +#define T_NUMBER 351 +#define T_SIGNED_NUMBER 352 +#define T_STRING 353 @@ -245,7 +251,7 @@ typedef union YYSTYPE  /* Line 1676 of yacc.c  */ -#line 249 "read_config_yy.h" +#line 255 "read_config_yy.h"  } YYSTYPE;  # define YYSTYPE_IS_TRIVIAL 1  # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/src/read_config_yy.y b/src/read_config_yy.y index 6dfca98..d94bd85 100644 --- a/src/read_config_yy.y +++ b/src/read_config_yy.y @@ -73,6 +73,7 @@ static void __max_dedicated_links_reached(void);  %token T_NETLINK_OVERRUN_RESYNC T_NICE T_IPV4_DEST_ADDR T_IPV6_DEST_ADDR  %token T_SCHEDULER T_TYPE T_PRIO T_NETLINK_EVENTS_RELIABLE  %token T_DISABLE_INTERNAL_CACHE T_DISABLE_EXTERNAL_CACHE T_ERROR_QUEUE_LENGTH +%token T_OPTIONS T_TCP_WINDOW_TRACKING T_EXPECT_SYNC  %token <string> T_IP T_PATH_VAL  %token <val> T_NUMBER @@ -808,8 +809,65 @@ sync_line: refreshtime  	 | state_replication  	 | cache_writethrough  	 | destroy_timeout +	 | option_line  	 ; +option_line: T_OPTIONS '{' options '}'; + +options: +       | options option  +       ; + +option: T_TCP_WINDOW_TRACKING T_ON +{ +	CONFIG(sync).tcp_window_tracking = 1; +}; + +option: T_TCP_WINDOW_TRACKING T_OFF +{ +	CONFIG(sync).tcp_window_tracking = 0; +}; + +option: T_EXPECT_SYNC T_ON +{ +	CONFIG(flags) |= CTD_EXPECT; +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY | +				 NF_NETLINK_CONNTRACK_EXP_NEW | +				 NF_NETLINK_CONNTRACK_EXP_UPDATE | +				 NF_NETLINK_CONNTRACK_EXP_DESTROY; +}; + +option: T_EXPECT_SYNC T_OFF +{ +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY; +}; + +option: T_EXPECT_SYNC '{' expect_list '}' +{ +	CONFIG(flags) |= CTD_EXPECT; +	CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; +	CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +				 NF_NETLINK_CONNTRACK_UPDATE | +				 NF_NETLINK_CONNTRACK_DESTROY | +				 NF_NETLINK_CONNTRACK_EXP_NEW | +				 NF_NETLINK_CONNTRACK_EXP_UPDATE | +				 NF_NETLINK_CONNTRACK_EXP_DESTROY; +}; + +expect_list: +            | expect_list expect_item ; + +expect_item: T_STRING +{ +	exp_filter_add(STATE(exp_filter), $1); +} +  sync_mode_alarm: T_SYNC_MODE T_ALARM '{' sync_mode_alarm_list '}'  {  	conf.flags |= CTD_SYNC_ALARM; @@ -1221,6 +1279,44 @@ filter_protocol_item : T_TCP  				 pent->p_proto);  }; +filter_protocol_item : T_UDP +{ +	struct protoent *pent; + +	pent = getprotobyname("udp"); +	if (pent == NULL) { +		print_err(CTD_CFG_WARN, "getprotobyname() cannot find " +					"protocol `udp' in /etc/protocols"); +		break; +	} +	ct_filter_add_proto(STATE(us_filter), pent->p_proto); + +	__kernel_filter_start(); + +	nfct_filter_add_attr_u32(STATE(filter), +				 NFCT_FILTER_L4PROTO, +				 pent->p_proto); +}; + +filter_protocol_item : T_UDP +{ +	struct protoent *pent; + +	pent = getprotobyname("udp"); +	if (pent == NULL) { +		print_err(CTD_CFG_WARN, "getprotobyname() cannot find " +					"protocol `udp' in /etc/protocols"); +		break; +	} +	ct_filter_add_proto(STATE(us_filter), pent->p_proto); + +	__kernel_filter_start(); + +	nfct_filter_add_attr_u32(STATE(filter), +				 NFCT_FILTER_L4PROTO, +				 pent->p_proto); +}; +  filter_item : T_ADDRESS T_ACCEPT '{' filter_address_list '}'  {  	ct_filter_set_logic(STATE(us_filter), @@ -1561,6 +1657,7 @@ init_config(char *filename)  	/* Zero may be a valid facility */  	CONFIG(syslog_facility) = -1;  	CONFIG(stats).syslog_facility = -1; +	CONFIG(netlink).subsys_id = -1;  	yyrestart(fp);  	yyparse(); @@ -1599,7 +1696,7 @@ init_config(char *filename)  	/* default number of bucket of the hashtable that are committed in  	   one run loop. XXX: no option available to tune this value yet. */  	if (CONFIG(general).commit_steps == 0) -		CONFIG(general).commit_steps = 64; +		CONFIG(general).commit_steps = 8192;  	/* if overrun, automatically resync with kernel after 30 seconds */  	if (CONFIG(nl_overrun_resync) == 0) @@ -1609,5 +1706,12 @@ init_config(char *filename)  	if (CONFIG(channelc).error_queue_length == 0)  		CONFIG(channelc).error_queue_length = 128; +	if (CONFIG(netlink).subsys_id == -1) { +		CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; +		CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | +					 NF_NETLINK_CONNTRACK_UPDATE | +					 NF_NETLINK_CONNTRACK_DESTROY; +	} +  	return 0;  } @@ -1,6 +1,7 @@  /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -186,40 +187,91 @@ static void dump_stats_runtime(int fd)  	send(fd, buf, size, 0);  } +static void local_flush_master(void) +{ +	STATE(stats).nl_kernel_table_flush++; +	dlog(LOG_NOTICE, "flushing kernel conntrack table"); + +	/* fork a child process that performs the flush operation, +	 * meanwhile the parent process handles events. */ +	if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, +			     NULL, NULL) == 0) { +		nl_flush_conntrack_table(STATE(flush)); +		exit(EXIT_SUCCESS); +	} +} + +static void local_resync_master(void) +{ +	if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { +		STATE(stats).nl_kernel_table_resync++; +		dlog(LOG_NOTICE, "resync with master conntrack table"); +		nl_dump_conntrack_table(STATE(dump)); +	} else { +		dlog(LOG_NOTICE, "resync is unsupported in this mode"); +	} +} + +static void local_exp_flush_master(void) +{ +	if (!(CONFIG(flags) & CTD_EXPECT)) +		return; + +	STATE(stats).nl_kernel_table_flush++; +	dlog(LOG_NOTICE, "flushing kernel expect table"); + +	/* fork a child process that performs the flush operation, +	 * meanwhile the parent process handles events. */ +	if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, +			     NULL, NULL) == 0) { +		nl_flush_expect_table(STATE(flush)); +		exit(EXIT_SUCCESS); +	} +} + +static void local_exp_resync_master(void) +{ +	if (!(CONFIG(flags) & CTD_EXPECT)) +		return; + +	if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { +		STATE(stats).nl_kernel_table_resync++; +		dlog(LOG_NOTICE, "resync with master expect table"); +		nl_dump_expect_table(STATE(dump)); +	} else { +		dlog(LOG_NOTICE, "resync is unsupported in this mode"); +	} +} +  static int local_handler(int fd, void *data)  {  	int ret = LOCAL_RET_OK;  	int type; -	ret = read(fd, &type, sizeof(type)); -	if (ret == -1) { +	if (read(fd, &type, sizeof(type)) <= 0) {  		STATE(stats).local_read_failed++;  		return LOCAL_RET_OK;  	} -	if (ret == 0) -		return LOCAL_RET_OK; -  	switch(type) { -	case FLUSH_MASTER: -		STATE(stats).nl_kernel_table_flush++; -		dlog(LOG_NOTICE, "flushing kernel conntrack table"); - -		/* fork a child process that performs the flush operation, -		 * meanwhile the parent process handles events. */ -		if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, -				     NULL, NULL) == 0) { -			nl_flush_conntrack_table(STATE(flush)); -			exit(EXIT_SUCCESS); -		} +	case CT_FLUSH_MASTER: +		local_flush_master();  		break; -	case RESYNC_MASTER: -		if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { -			STATE(stats).nl_kernel_table_resync++; -			dlog(LOG_NOTICE, "resync with master table"); -			nl_dump_conntrack_table(STATE(dump)); -		} else { -			dlog(LOG_NOTICE, "resync is unsupported in this mode"); -		} +	case CT_RESYNC_MASTER: +		local_resync_master(); +		break; +	case EXP_FLUSH_MASTER: +		local_exp_flush_master(); +		break; +	case EXP_RESYNC_MASTER: +		local_exp_resync_master(); +		break; +	case ALL_FLUSH_MASTER: +		local_flush_master(); +		local_exp_flush_master(); +		break; +	case ALL_RESYNC_MASTER: +		local_resync_master(); +		local_exp_resync_master();  		break;  	case STATS_RUNTIME:  		dump_stats_runtime(fd); @@ -245,10 +297,14 @@ static void do_overrun_resync_alarm(struct alarm_block *a, void *data)  static void do_polling_alarm(struct alarm_block *a, void *data)  { -	if (STATE(mode)->internal->purge) -		STATE(mode)->internal->purge(); +	if (STATE(mode)->internal->ct.purge) +		STATE(mode)->internal->ct.purge(); + +	if (STATE(mode)->internal->exp.purge) +		STATE(mode)->internal->exp.purge();  	nl_send_resync(STATE(resync)); +	nl_send_expect_resync(STATE(resync));  	add_alarm(&STATE(polling_alarm), CONFIG(poll_kernel_secs), 0);  } @@ -271,13 +327,13 @@ static int event_handler(const struct nlmsghdr *nlh,  	switch(type) {  	case NFCT_T_NEW: -		STATE(mode)->internal->new(ct, origin_type); +		STATE(mode)->internal->ct.new(ct, origin_type);  		break;  	case NFCT_T_UPDATE: -		STATE(mode)->internal->update(ct, origin_type); +		STATE(mode)->internal->ct.upd(ct, origin_type);  		break;  	case NFCT_T_DESTROY: -		if (STATE(mode)->internal->destroy(ct, origin_type)) +		if (STATE(mode)->internal->ct.del(ct, origin_type))  			update_traffic_stats(ct);  		break;  	default: @@ -286,10 +342,52 @@ static int event_handler(const struct nlmsghdr *nlh,  	}  out: -	if (STATE(event_iterations_limit)-- <= 0) { -		STATE(event_iterations_limit) = CONFIG(event_iterations_limit); +	if (STATE(event_iterations_limit)-- <= 0)  		return NFCT_CB_STOP; -	} else +	else +		return NFCT_CB_CONTINUE; +} + +static int exp_event_handler(const struct nlmsghdr *nlh, +			     enum nf_conntrack_msg_type type, +			     struct nf_expect *exp, +			     void *data) +{ +	int origin_type; +	const struct nf_conntrack *master = +		nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	STATE(stats).nl_events_received++; + +	if (!exp_filter_find(STATE(exp_filter), exp)) { +		STATE(stats).nl_events_filtered++; +		goto out; +	} +	if (ct_filter_conntrack(master, 1)) +		return NFCT_CB_CONTINUE; + +	origin_type = origin_find(nlh); + +	switch(type) { +	case NFCT_T_NEW: +		STATE(mode)->internal->exp.new(exp, origin_type); +		break; +	case NFCT_T_UPDATE: +		STATE(mode)->internal->exp.upd(exp, origin_type); +		break; +	case NFCT_T_DESTROY: +		STATE(mode)->internal->exp.del(exp, origin_type); +		break; +	default: +		STATE(stats).nl_events_unknown_type++; +		break; +	} + +out: +	/* we reset the iteration limiter in the main select loop. */ +	if (STATE(event_iterations_limit)-- <= 0) +		return NFCT_CB_STOP; +	else  		return NFCT_CB_CONTINUE;  } @@ -302,7 +400,30 @@ static int dump_handler(enum nf_conntrack_msg_type type,  	switch(type) {  	case NFCT_T_UPDATE: -		STATE(mode)->internal->populate(ct); +		STATE(mode)->internal->ct.populate(ct); +		break; +	default: +		STATE(stats).nl_dump_unknown_type++; +		break; +	} +	return NFCT_CB_CONTINUE; +} + +static int exp_dump_handler(enum nf_conntrack_msg_type type, +			    struct nf_expect *exp, void *data) +{ +	const struct nf_conntrack *master = +		nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	if (!exp_filter_find(STATE(exp_filter), exp)) +		return NFCT_CB_CONTINUE; + +	if (ct_filter_conntrack(master, 1)) +		return NFCT_CB_CONTINUE; + +	switch(type) { +	case NFCT_T_UPDATE: +		STATE(mode)->internal->exp.populate(exp);  		break;  	default:  		STATE(stats).nl_dump_unknown_type++; @@ -322,9 +443,27 @@ static int get_handler(enum nf_conntrack_msg_type type,  	return NFCT_CB_CONTINUE;  } +static int exp_get_handler(enum nf_conntrack_msg_type type, +			   struct nf_expect *exp, void *data) +{ +	const struct nf_conntrack *master = +		nfexp_get_attr(exp, ATTR_EXP_MASTER); + +	if (!exp_filter_find(STATE(exp_filter), exp)) +		return NFCT_CB_CONTINUE; + +	if (ct_filter_conntrack(master, 1)) +		return NFCT_CB_CONTINUE; + +	STATE(get_retval) = 1; +	return NFCT_CB_CONTINUE; +} +  int  init(void)  { +	do_gettimeofday(); +  	if (CONFIG(flags) & CTD_STATS_MODE)  		STATE(mode) = &stats_mode;  	else if (CONFIG(flags) & CTD_SYNC_MODE) @@ -355,21 +494,8 @@ init(void)  	}  	register_fd(STATE(local).fd, STATE(fds)); -	if (!(CONFIG(flags) & CTD_POLL)) { -		STATE(event) = nl_init_event_handler(); -		if (STATE(event) == NULL) { -			dlog(LOG_ERR, "can't open netlink handler: %s", -			     strerror(errno)); -			dlog(LOG_ERR, "no ctnetlink kernel support?"); -			return -1; -		} -		nfct_callback_register2(STATE(event), NFCT_T_ALL, -				        event_handler, NULL); -		register_fd(nfct_fd(STATE(event)), STATE(fds)); -	} -  	/* resynchronize (like 'dump' socket) but it also purges old entries */ -	STATE(resync) = nfct_open(CONNTRACK, 0); +	STATE(resync) = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (STATE(resync)== NULL) {  		dlog(LOG_ERR, "can't open netlink handler: %s",  		     strerror(errno)); @@ -378,13 +504,13 @@ init(void)  	}  	nfct_callback_register(STATE(resync),  			       NFCT_T_ALL, -			       STATE(mode)->internal->resync, +			       STATE(mode)->internal->ct.resync,  			       NULL);  	register_fd(nfct_fd(STATE(resync)), STATE(fds));  	fcntl(nfct_fd(STATE(resync)), F_SETFL, O_NONBLOCK);  	if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { -		STATE(dump) = nfct_open(CONNTRACK, 0); +		STATE(dump) = nfct_open(CONFIG(netlink).subsys_id, 0);  		if (STATE(dump) == NULL) {  			dlog(LOG_ERR, "can't open netlink handler: %s",  			     strerror(errno)); @@ -394,13 +520,26 @@ init(void)  		nfct_callback_register(STATE(dump), NFCT_T_ALL,  				       dump_handler, NULL); +		if (CONFIG(flags) & CTD_EXPECT) { +			nfexp_callback_register(STATE(dump), NFCT_T_ALL, +						exp_dump_handler, NULL); +		} +  		if (nl_dump_conntrack_table(STATE(dump)) == -1) {  			dlog(LOG_ERR, "can't get kernel conntrack table");  			return -1;  		} + +		if (CONFIG(flags) & CTD_EXPECT) { +			if (nl_dump_expect_table(STATE(dump)) == -1) { +				dlog(LOG_ERR, "can't get kernel " +					      "expect table"); +				return -1; +			} +		}  	} -	STATE(get) = nfct_open(CONNTRACK, 0); +	STATE(get) = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (STATE(get) == NULL) {  		dlog(LOG_ERR, "can't open netlink handler: %s",  		     strerror(errno)); @@ -409,7 +548,12 @@ init(void)  	}  	nfct_callback_register(STATE(get), NFCT_T_ALL, get_handler, NULL); -	STATE(flush) = nfct_open(CONNTRACK, 0); +	if (CONFIG(flags) & CTD_EXPECT) { +		nfexp_callback_register(STATE(get), NFCT_T_ALL, +					exp_get_handler, NULL); +	} + +	STATE(flush) = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (STATE(flush) == NULL) {  		dlog(LOG_ERR, "cannot open flusher handler");  		return -1; @@ -423,6 +567,29 @@ init(void)  		dlog(LOG_NOTICE, "running in polling mode");  	} else {  		init_alarm(&STATE(resync_alarm), NULL, do_overrun_resync_alarm); +		/* +		 * The last nfct handler that we register is the event handler. +		 * The reason to do this is that we may receive events while +		 * populating the internal cache. Thus, we hit ENOBUFS +		 * prematurely. However, if we open the event handler before +		 * populating the internal cache, we may still lose events +		 * that have occured during the population. +		 */ +		STATE(event) = nl_init_event_handler(); +		if (STATE(event) == NULL) { +			dlog(LOG_ERR, "can't open netlink handler: %s", +			     strerror(errno)); +			dlog(LOG_ERR, "no ctnetlink kernel support?"); +			return -1; +		} +		nfct_callback_register2(STATE(event), NFCT_T_ALL, +				        event_handler, NULL); + +		if (CONFIG(flags) & CTD_EXPECT) { +			nfexp_callback_register2(STATE(event), NFCT_T_ALL, +						 exp_event_handler, NULL); +		} +		register_fd(nfct_fd(STATE(event)), STATE(fds));  	}  	/* Signals handling */ @@ -451,7 +618,7 @@ init(void)  	return 0;  } -static void __run(struct timeval *next_alarm) +static void run_events(struct timeval *next_alarm)  {  	int ret;  	fd_set readfds = STATE(fds)->readfds; @@ -473,77 +640,70 @@ static void __run(struct timeval *next_alarm)  	if (FD_ISSET(STATE(local).fd, &readfds))  		do_local_server_step(&STATE(local), NULL, local_handler); -	if (!(CONFIG(flags) & CTD_POLL)) { -		/* conntrack event has happened */ -		if (FD_ISSET(nfct_fd(STATE(event)), &readfds)) { -			ret = nfct_catch(STATE(event)); -			/* reset event iteration limit counter */ -			STATE(event_iterations_limit) = -					CONFIG(event_iterations_limit); -			if (ret == -1) { -			switch(errno) { -			case ENOBUFS: -				/* We have hit ENOBUFS, it's likely that we are -				 * losing events. Two possible situations may -				 * trigger this error: -				 * -				 * 1) The netlink receiver buffer is too small: -				 *    increasing the netlink buffer size should -				 *    be enough. However, some event messages -				 *    got lost. We have to resync ourselves -				 *    with the kernel table conntrack table to -				 *    resolve the inconsistency.  -				 * -				 * 2) The receiver is too slow to process the -				 *    netlink messages so that the queue gets -				 *    full quickly. This generally happens -				 *    if the system is under heavy workload -				 *    (busy CPU). In this case, increasing the -				 *    size of the netlink receiver buffer -				 *    would not help anymore since we would -				 *    be delaying the overrun. Moreover, we -				 *    should avoid resynchronizations. We  -				 *    should do our best here and keep -				 *    replicating as much states as possible. -				 *    If workload lowers at some point, -				 *    we resync ourselves. -				 */ -				nl_resize_socket_buffer(STATE(event)); -				if (CONFIG(nl_overrun_resync) > 0 && -				    STATE(mode)->internal->flags & -				    			INTERNAL_F_RESYNC) { -					add_alarm(&STATE(resync_alarm), -						  CONFIG(nl_overrun_resync),0); -				} -				STATE(stats).nl_catch_event_failed++; -				STATE(stats).nl_overrun++; -				break; -			case ENOENT: -				/* -				 * We received a message from another -				 * netfilter subsystem that we are not -				 * interested in. Just ignore it. -				 */ -				break; -			case EAGAIN: -				break; -			default: -				STATE(stats).nl_catch_event_failed++; -				break; -			} +	/* we have receive an event from ctnetlink */ +	if (FD_ISSET(nfct_fd(STATE(event)), &readfds)) { +		ret = nfct_catch(STATE(event)); +		/* reset event iteration limit counter */ +		STATE(event_iterations_limit) = CONFIG(event_iterations_limit); +		if (ret == -1) { +		switch(errno) { +		case ENOBUFS: +			/* We have hit ENOBUFS, it's likely that we are +			 * losing events. Two possible situations may +			 * trigger this error: +			 * +			 * 1) The netlink receiver buffer is too small: +			 *    increasing the netlink buffer size should +			 *    be enough. However, some event messages +			 *    got lost. We have to resync ourselves +			 *    with the kernel table conntrack table to +			 *    resolve the inconsistency.  +			 * +			 * 2) The receiver is too slow to process the +			 *    netlink messages so that the queue gets +			 *    full quickly. This generally happens +			 *    if the system is under heavy workload +			 *    (busy CPU). In this case, increasing the +			 *    size of the netlink receiver buffer +			 *    would not help anymore since we would +			 *    be delaying the overrun. Moreover, we +			 *    should avoid resynchronizations. We  +			 *    should do our best here and keep +			 *    replicating as much states as possible. +			 *    If workload lowers at some point, +			 *    we resync ourselves. +			 */ +			nl_resize_socket_buffer(STATE(event)); +			if (CONFIG(nl_overrun_resync) > 0 && +			    STATE(mode)->internal->flags & INTERNAL_F_RESYNC) { +				add_alarm(&STATE(resync_alarm), +					  CONFIG(nl_overrun_resync),0);  			} +			STATE(stats).nl_catch_event_failed++; +			STATE(stats).nl_overrun++; +			break; +		case ENOENT: +			/* +			 * We received a message from another +			 * netfilter subsystem that we are not +			 * interested in. Just ignore it. +			 */ +			break; +		case EAGAIN: +			/* No more events to receive, try later. */ +			break; +		default: +			STATE(stats).nl_catch_event_failed++; +			break;  		} -		if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { -			nfct_catch(STATE(resync)); -			if (STATE(mode)->internal->purge) -				STATE(mode)->internal->purge(); -		} -	} else { -		/* using polling mode */ -		if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { -			nfct_catch(STATE(resync));  		}  	} +	/* we previously requested a resync due to buffer overrun. */ +	if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { +		nfct_catch(STATE(resync)); +		if (STATE(mode)->internal->ct.purge) +			STATE(mode)->internal->ct.purge(); +	}  	if (STATE(mode)->run)  		STATE(mode)->run(&readfds); @@ -551,8 +711,40 @@ static void __run(struct timeval *next_alarm)  	sigprocmask(SIG_UNBLOCK, &STATE(block), NULL);  } -void __attribute__((noreturn)) -run(void) +static void run_polling(struct timeval *next_alarm) +{ +	int ret; +	fd_set readfds = STATE(fds)->readfds; + +	ret = select(STATE(fds)->maxfd + 1, &readfds, NULL, NULL, next_alarm); +	if (ret == -1) { +		/* interrupted syscall, retry */ +		if (errno == EINTR) +			return; + +		STATE(stats).select_failed++; +		return; +	} + +	/* signals are racy */ +	sigprocmask(SIG_BLOCK, &STATE(block), NULL); + +	/* order received via UNIX socket */ +	if (FD_ISSET(STATE(local).fd, &readfds)) +		do_local_server_step(&STATE(local), NULL, local_handler); + +	/* we requested a dump from the kernel via polling_alarm */ +	if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) +		nfct_catch(STATE(resync)); + +	if (STATE(mode)->run) +		STATE(mode)->run(&readfds); + +	sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); +} + +static void __attribute__((noreturn)) +do_run(void (*run_step)(struct timeval *next_alarm))  {  	struct timeval next_alarm;   	struct timeval *next = NULL; @@ -567,6 +759,15 @@ run(void)  			next = get_next_alarm_run(&next_alarm);  		sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); -		__run(next); +		run_step(next); +	} +} + +void run(void) +{ +	if (CONFIG(flags) & CTD_POLL) { +		do_run(run_polling); +	} else { +		do_run(run_events);  	}  } diff --git a/src/stats-mode.c b/src/stats-mode.c index 0403ce2..b768033 100644 --- a/src/stats-mode.c +++ b/src/stats-mode.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -37,7 +38,9 @@ static int init_stats(void)  	}  	memset(state.stats, 0, sizeof(struct ct_stats_state)); -	STATE_STATS(cache) = cache_create("stats", NO_FEATURES, NULL); +	STATE_STATS(cache) = cache_create("stats", CACHE_T_CT, +					  NO_FEATURES, NULL, +					  &cache_stats_ct_ops);  	if (!STATE_STATS(cache)) {  		dlog(LOG_ERR, "can't allocate memory for the "  			      "external cache"); @@ -59,14 +62,14 @@ static int local_handler_stats(int fd, int type, void *data)  	int ret = LOCAL_RET_OK;  	switch(type) { -	case DUMP_INTERNAL: +	case CT_DUMP_INTERNAL:  		cache_dump(STATE_STATS(cache), fd, NFCT_O_PLAIN);  		break; -	case DUMP_INT_XML: +	case CT_DUMP_INT_XML:  		cache_dump(STATE_STATS(cache), fd, NFCT_O_XML);  		break; -	case FLUSH_CACHE: -	case FLUSH_INT_CACHE: +	case CT_FLUSH_CACHE: +	case CT_FLUSH_INT_CACHE:  		dlog(LOG_NOTICE, "flushing caches");  		cache_flush(STATE_STATS(cache));  		break; @@ -88,7 +91,7 @@ static int local_handler_stats(int fd, int type, void *data)  	return ret;  } -static void populate_stats(struct nf_conntrack *ct) +static void stats_populate(struct nf_conntrack *ct)  {  	nfct_attr_unset(ct, ATTR_ORIG_COUNTER_BYTES);  	nfct_attr_unset(ct, ATTR_ORIG_COUNTER_PACKETS); @@ -100,7 +103,7 @@ static void populate_stats(struct nf_conntrack *ct)  	cache_update_force(STATE_STATS(cache), ct);  } -static int resync_stats(enum nf_conntrack_msg_type type, +static int stats_resync(enum nf_conntrack_msg_type type,  			struct nf_conntrack *ct,  			void *data)  { @@ -125,23 +128,22 @@ static int purge_step(void *data1, void *data2)  	struct cache_object *obj = data2;  	STATE(get_retval) = 0; -	nl_get_conntrack(STATE(get), obj->ct); /* modifies STATE(get_retval) */ +	nl_get_conntrack(STATE(get), obj->ptr); /* modifies STATE(get_retval) */  	if (!STATE(get_retval)) {  		cache_del(STATE_STATS(cache), obj); -		dlog_ct(STATE(stats_log), obj->ct, NFCT_O_PLAIN); +		dlog_ct(STATE(stats_log), obj->ptr, NFCT_O_PLAIN);  		cache_object_free(obj);  	}  	return 0;  } -static void purge_stats(void) +static void stats_purge(void)  {  	cache_iterate(STATE_STATS(cache), NULL, purge_step);  } -static void -event_new_stats(struct nf_conntrack *ct, int origin) +static void stats_event_new(struct nf_conntrack *ct, int origin)  {  	int id;  	struct cache_object *obj; @@ -162,15 +164,13 @@ event_new_stats(struct nf_conntrack *ct, int origin)  	return;  } -static void -event_update_stats(struct nf_conntrack *ct, int origin) +static void stats_event_upd(struct nf_conntrack *ct, int origin)  {  	nfct_attr_unset(ct, ATTR_TIMEOUT);  	cache_update_force(STATE_STATS(cache), ct);  } -static int -event_destroy_stats(struct nf_conntrack *ct, int origin) +static int stats_event_del(struct nf_conntrack *ct, int origin)  {  	int id;  	struct cache_object *obj; @@ -189,12 +189,14 @@ event_destroy_stats(struct nf_conntrack *ct, int origin)  static struct internal_handler internal_cache_stats = {  	.flags			= INTERNAL_F_POPULATE | INTERNAL_F_RESYNC, -	.populate		= populate_stats, -	.resync			= resync_stats, -	.purge			= purge_stats, -	.new			= event_new_stats, -	.update			= event_update_stats, -	.destroy		= event_destroy_stats +	.ct = { +		.populate		= stats_populate, +		.resync			= stats_resync, +		.purge			= stats_purge, +		.new			= stats_event_new, +		.upd			= stats_event_upd, +		.del			= stats_event_del, +	},  };  struct ct_mode stats_mode = { diff --git a/src/sync-alarm.c b/src/sync-alarm.c index 0fc7943..acaf5e6 100644 --- a/src/sync-alarm.c +++ b/src/sync-alarm.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -28,6 +29,7 @@  struct cache_alarm {  	struct queue_node	qnode; +	struct cache_object	*obj;  	struct alarm_block	alarm;  }; @@ -41,7 +43,7 @@ static void refresher(struct alarm_block *a, void *data)  		  random() % CONFIG(refresh) + 1,  		  ((random() % 5 + 1)  * 200000) - 1); -	alarm_enqueue(obj, NET_T_STATE_UPD); +	alarm_enqueue(obj, NET_T_STATE_CT_UPD);  }  static void cache_alarm_add(struct cache_object *obj, void *data) @@ -49,6 +51,7 @@ static void cache_alarm_add(struct cache_object *obj, void *data)  	struct cache_alarm *ca = data;  	queue_node_init(&ca->qnode, Q_ELEM_OBJ); +	ca->obj = obj;  	init_alarm(&ca->alarm, obj, refresher);  	add_alarm(&ca->alarm,  		  random() % CONFIG(refresh) + 1, @@ -109,9 +112,8 @@ static int alarm_recv(const struct nethdr *net)  static void alarm_enqueue(struct cache_object *obj, int query)  { -	struct cache_alarm *ca = -		cache_get_extra(STATE(mode)->internal->data, obj); -	if (queue_add(STATE_SYNC(tx_queue), &ca->qnode)) +	struct cache_alarm *ca = cache_get_extra(obj); +	if (queue_add(STATE_SYNC(tx_queue), &ca->qnode) > 0)  		cache_object_get(obj);  } @@ -131,15 +133,13 @@ static int tx_queue_xmit(struct queue_node *n, const void *data)  		break;  	case Q_ELEM_OBJ: {  		struct cache_alarm *ca; -		struct cache_object *obj;  		int type;  		ca = (struct cache_alarm *)n; -		obj = cache_data_get_object(STATE(mode)->internal->data, ca); -		type = object_status_to_network_type(obj->status); -		net = BUILD_NETMSG(obj->ct, type); +		type = object_status_to_network_type(ca->obj); +		net = ca->obj->cache->ops->build_msg(ca->obj, type);  		multichannel_send(STATE_SYNC(channel), net); -		cache_object_put(obj); +		cache_object_put(ca->obj);  		break;  	}  	} diff --git a/src/sync-ftfw.c b/src/sync-ftfw.c index 86edeab..1bc2d9f 100644 --- a/src/sync-ftfw.c +++ b/src/sync-ftfw.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2008 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -54,12 +55,14 @@ static int say_hello_back;  struct cache_ftfw {  	struct queue_node	qnode; +	struct cache_object	*obj;  	uint32_t 		seq;  };  static void cache_ftfw_add(struct cache_object *obj, void *data)  {  	struct cache_ftfw *cn = data; +	cn->obj = obj;  	/* These nodes are not inserted in the list */  	queue_node_init(&cn->qnode, Q_ELEM_OBJ);  } @@ -107,7 +110,8 @@ static void tx_queue_add_ctlmsg(uint32_t flags, uint32_t from, uint32_t to)  	ack->from	= from;  	ack->to		= to; -	queue_add(STATE_SYNC(tx_queue), &qobj->qnode); +	if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) +		queue_object_free(qobj);  }  static void tx_queue_add_ctlmsg2(uint32_t flags) @@ -123,7 +127,8 @@ static void tx_queue_add_ctlmsg2(uint32_t flags)  	ctl->type 	= NET_T_CTL;  	ctl->flags	= flags; -	queue_add(STATE_SYNC(tx_queue), &qobj->qnode); +	if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) +		queue_object_free(qobj);  }  /* this function is called from the alarm framework */ @@ -166,14 +171,13 @@ static void ftfw_kill(void)  static int do_cache_to_tx(void *data1, void *data2)  {  	struct cache_object *obj = data2; -	struct cache_ftfw *cn = -		cache_get_extra(STATE(mode)->internal->data, obj); +	struct cache_ftfw *cn = cache_get_extra(obj);  	if (queue_in(rs_queue, &cn->qnode)) {  		queue_del(&cn->qnode);  		queue_add(STATE_SYNC(tx_queue), &cn->qnode);  	} else { -		if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) +		if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0)  			cache_object_get(obj);  	}  	return 0; @@ -225,7 +229,9 @@ static int ftfw_local(int fd, int type, void *data)  		break;  	case SEND_BULK:  		dlog(LOG_NOTICE, "sending bulk update"); -		cache_iterate(STATE(mode)->internal->data, +		cache_iterate(STATE(mode)->internal->ct.data, +			      NULL, do_cache_to_tx); +		cache_iterate(STATE(mode)->internal->exp.data,  			      NULL, do_cache_to_tx);  		break;  	case STATS_RSQUEUE: @@ -300,13 +306,11 @@ static int rs_queue_empty(struct queue_node *n, const void *data)  	}  	case Q_ELEM_OBJ: {  		struct cache_ftfw *cn; -		struct cache_object *obj;  		cn = (struct cache_ftfw *) n;  		if (h == NULL) {  			queue_del(n); -			obj = cache_data_get_object(STATE(mode)->internal->data, cn); -			cache_object_put(obj); +			cache_object_put(cn->obj);  			return 0;  		}  		if (before(cn->seq, h->from)) @@ -316,8 +320,7 @@ static int rs_queue_empty(struct queue_node *n, const void *data)  		dp("queue: deleting from queue (seq=%u)\n", cn->seq);  		queue_del(n); -		obj = cache_data_get_object(STATE(mode)->internal->data, cn); -		cache_object_put(obj); +		cache_object_put(cn->obj);  		break;  	}  	} @@ -349,7 +352,10 @@ static int digest_msg(const struct nethdr *net)  	} else if (IS_RESYNC(net)) {  		dp("RESYNC ALL\n"); -		cache_iterate(STATE(mode)->internal->data, NULL, do_cache_to_tx); +		cache_iterate(STATE(mode)->internal->ct.data, NULL, +			      do_cache_to_tx); +		cache_iterate(STATE(mode)->internal->exp.data, NULL, +			      do_cache_to_tx);  		return MSG_CTL;  	} else if (IS_ALIVE(net)) @@ -463,11 +469,9 @@ static void rs_queue_purge_full(void)  	}  	case Q_ELEM_OBJ: {  		struct cache_ftfw *cn; -		struct cache_object *obj;  		cn = (struct cache_ftfw *)n; -		obj = cache_data_get_object(STATE(mode)->internal->data, cn); -		cache_object_put(obj); +		cache_object_put(cn->obj);  		break;  	}  	} @@ -509,14 +513,12 @@ static int tx_queue_xmit(struct queue_node *n, const void *data)  	}  	case Q_ELEM_OBJ: {  		struct cache_ftfw *cn; -		struct cache_object *obj;  		int type;  		struct nethdr *net;  		cn = (struct cache_ftfw *)n; -		obj = cache_data_get_object(STATE(mode)->internal->data, cn); -		type = object_status_to_network_type(obj->status); -		net = BUILD_NETMSG(obj->ct, type); +		type = object_status_to_network_type(cn->obj); +		net = cn->obj->cache->ops->build_msg(cn->obj, type);  		nethdr_set_hello(net);  		dp("tx_list sq: %u fl:%u len:%u\n", @@ -548,13 +550,12 @@ static void ftfw_xmit(void)  static void ftfw_enqueue(struct cache_object *obj, int type)  { -	struct cache_ftfw *cn = -		cache_get_extra(STATE(mode)->internal->data, obj); +	struct cache_ftfw *cn = cache_get_extra(obj);  	if (queue_in(rs_queue, &cn->qnode)) {  		queue_del(&cn->qnode);  		queue_add(STATE_SYNC(tx_queue), &cn->qnode);  	} else { -		if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) +		if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0)  			cache_object_get(obj);  	}  } diff --git a/src/sync-mode.c b/src/sync-mode.c index ecc2f0d..2505631 100644 --- a/src/sync-mode.c +++ b/src/sync-mode.c @@ -1,6 +1,7 @@  /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -40,11 +41,47 @@  #include <net/if.h>  #include <fcntl.h> +static struct nf_conntrack *msg2ct_alloc(struct nethdr *net, size_t remain) +{ +	struct nf_conntrack *ct; + +	/* TODO: add stats on ENOMEM errors in the future. */ +	ct = nfct_new(); +	if (ct == NULL) +		return NULL; + +	if (msg2ct(ct, net, remain) == -1) { +		STATE_SYNC(error).msg_rcv_malformed++; +		STATE_SYNC(error).msg_rcv_bad_payload++; +		nfct_destroy(ct); +		return NULL; +	} +	return ct; +} + +static struct nf_expect *msg2exp_alloc(struct nethdr *net, size_t remain) +{ +	struct nf_expect *exp; + +	/* TODO: add stats on ENOMEM errors in the future. */ +	exp = nfexp_new(); +	if (exp == NULL) +		return NULL; + +	if (msg2exp(exp, net, remain) == -1) { +		STATE_SYNC(error).msg_rcv_malformed++; +		STATE_SYNC(error).msg_rcv_bad_payload++; +		nfexp_destroy(exp); +		return NULL; +	} +	return exp; +} +  static void  do_channel_handler_step(int i, struct nethdr *net, size_t remain)  { -	char __ct[nfct_maxsize()]; -	struct nf_conntrack *ct = (struct nf_conntrack *)(void*) __ct; +	struct nf_conntrack *ct = NULL; +	struct nf_expect *exp = NULL;  	if (net->version != CONNTRACKD_PROTOCOL_VERSION) {  		STATE_SYNC(error).msg_rcv_malformed++; @@ -74,29 +111,53 @@ do_channel_handler_step(int i, struct nethdr *net, size_t remain)  		STATE_SYNC(error).msg_rcv_bad_type++;  		return;  	} -	memset(ct, 0, sizeof(__ct)); - -	if (parse_payload(ct, net, remain) == -1) { -		STATE_SYNC(error).msg_rcv_malformed++; -		STATE_SYNC(error).msg_rcv_bad_payload++; -		return; -	}  	switch(net->type) { -	case NET_T_STATE_NEW: -		STATE_SYNC(external)->new(ct); +	case NET_T_STATE_CT_NEW: +		ct = msg2ct_alloc(net, remain); +		if (ct == NULL) +			return; +		STATE_SYNC(external)->ct.new(ct); +		break; +	case NET_T_STATE_CT_UPD: +		ct = msg2ct_alloc(net, remain); +		if (ct == NULL) +			return; +		STATE_SYNC(external)->ct.upd(ct);  		break; -	case NET_T_STATE_UPD: -		STATE_SYNC(external)->update(ct); +	case NET_T_STATE_CT_DEL: +		ct = msg2ct_alloc(net, remain); +		if (ct == NULL) +			return; +		STATE_SYNC(external)->ct.del(ct);  		break; -	case NET_T_STATE_DEL: -		STATE_SYNC(external)->destroy(ct); +	case NET_T_STATE_EXP_NEW: +		exp = msg2exp_alloc(net, remain); +		if (exp == NULL) +			return; +		STATE_SYNC(external)->exp.new(exp); +		break; +	case NET_T_STATE_EXP_UPD: +		exp = msg2exp_alloc(net, remain); +		if (exp == NULL) +			return; +		STATE_SYNC(external)->exp.upd(exp); +		break; +	case NET_T_STATE_EXP_DEL: +		exp = msg2exp_alloc(net, remain); +		if (exp == NULL) +			return; +		STATE_SYNC(external)->exp.del(exp);  		break;  	default:  		STATE_SYNC(error).msg_rcv_malformed++;  		STATE_SYNC(error).msg_rcv_bad_type++;  		break;  	} +	if (ct != NULL) +		nfct_destroy(ct); +	if (exp != NULL) +		nfexp_destroy(exp);  }  static char __net[65536];		/* XXX: maximum MTU for IPv4 */ @@ -247,7 +308,7 @@ static void do_reset_cache_alarm(struct alarm_block *a, void *data)  		exit(EXIT_SUCCESS);  	}  	/* this is not required if events don't get lost */ -	STATE(mode)->internal->flush(); +	STATE(mode)->internal->ct.flush();  }  static int init_sync(void) @@ -330,7 +391,7 @@ static int init_sync(void)  							STATE(fds)) == -1)  		return -1; -	STATE_SYNC(commit).h = nfct_open(CONNTRACK, 0); +	STATE_SYNC(commit).h = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (STATE_SYNC(commit).h == NULL) {  		dlog(LOG_ERR, "can't create handler to commit");  		return -1; @@ -346,6 +407,7 @@ static int init_sync(void)  							STATE(fds)) == -1) {  		return -1;  	} +	STATE_SYNC(commit).clientfd = -1;  	init_alarm(&STATE_SYNC(reset_cache_alarm), NULL, do_reset_cache_alarm); @@ -380,8 +442,30 @@ static void run_sync(fd_set *readfds)  		interface_handler();  	if (FD_ISSET(get_read_evfd(STATE_SYNC(commit).evfd), readfds)) { +		int ret; +  		read_evfd(STATE_SYNC(commit).evfd); -		STATE_SYNC(external)->commit(STATE_SYNC(commit).h, 0); + +		ret = STATE_SYNC(commit).rq[0].cb(STATE_SYNC(commit).h, 0); +		if (ret == 0) { +			/* we still have things in the callback queue. */ +			if (STATE_SYNC(commit).rq[1].cb) { +				int fd = STATE_SYNC(commit).clientfd; + +				STATE_SYNC(commit).rq[0].cb = +					STATE_SYNC(commit).rq[1].cb; + +				STATE_SYNC(commit).rq[1].cb = NULL; + +				STATE_SYNC(commit).clientfd = -1; +				STATE_SYNC(commit).rq[0].cb( +					STATE_SYNC(commit).h, fd); +			} else { +				/* Close the client socket now, we're done. */ +				close(STATE_SYNC(commit).clientfd); +				STATE_SYNC(commit).clientfd = -1; +			} +		}  	}  	/* flush pending messages */ @@ -414,9 +498,9 @@ static void dump_stats_sync(int fd)  	char buf[512];  	int size; -	size = sprintf(buf, "message sequence tracking:\n" -			    "%20llu Msgs mfrm " -			    "%20llu Msgs lost\n\n", +	size = sprintf(buf, "message tracking:\n" +			    "%20llu Malformed msgs " +			    "%20llu Lost msgs\n\n",  			(unsigned long long)STATE_SYNC(error).msg_rcv_malformed,  			(unsigned long long)STATE_SYNC(error).msg_rcv_lost); @@ -458,48 +542,62 @@ static void dump_stats_sync_extended(int fd)  	send(fd, buf, size, 0);  } +static int local_commit(int fd) +{ +	int ret; + +	/* delete the reset alarm if any before committing */ +	del_alarm(&STATE_SYNC(reset_cache_alarm)); + +	ret = STATE_SYNC(commit).rq[0].cb(STATE_SYNC(commit).h, fd); +	if (ret == -1) { +		dlog(LOG_NOTICE, "commit already in progress, skipping"); +		ret = LOCAL_RET_OK; +	} else if (ret == 0) { +		/* we've finished the commit. */ +		ret = LOCAL_RET_OK; +	} else { +		/* Keep open the client, we want synchronous commit. */ +		ret = LOCAL_RET_STOLEN; +	} +	return ret; +} +  /* handler for requests coming via UNIX socket */  static int local_handler_sync(int fd, int type, void *data)  {  	int ret = LOCAL_RET_OK;  	switch(type) { -	case DUMP_INTERNAL: -		ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); -		if (ret == 0) { -			STATE(mode)->internal->dump(fd, NFCT_O_PLAIN); +	case CT_DUMP_INTERNAL: +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE(mode)->internal->ct.dump(fd, NFCT_O_PLAIN);  			exit(EXIT_SUCCESS);  		}  		break; -	case DUMP_EXTERNAL: -		ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); -		if (ret == 0) { -			STATE_SYNC(external)->dump(fd, NFCT_O_PLAIN); +	case CT_DUMP_EXTERNAL: +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE_SYNC(external)->ct.dump(fd, NFCT_O_PLAIN);  			exit(EXIT_SUCCESS);  		}   		break; -	case DUMP_INT_XML: -		ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); -		if (ret == 0) { -			STATE(mode)->internal->dump(fd, NFCT_O_XML); +	case CT_DUMP_INT_XML: +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE(mode)->internal->ct.dump(fd, NFCT_O_XML);  			exit(EXIT_SUCCESS);  		}  		break; -	case DUMP_EXT_XML: -		ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); -		if (ret == 0) { -			STATE_SYNC(external)->dump(fd, NFCT_O_XML); +	case CT_DUMP_EXT_XML: +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE_SYNC(external)->ct.dump(fd, NFCT_O_XML);  			exit(EXIT_SUCCESS);  		}  		break; -	case COMMIT: -		/* delete the reset alarm if any before committing */ -		del_alarm(&STATE_SYNC(reset_cache_alarm)); - -		dlog(LOG_NOTICE, "committing external cache"); -		STATE_SYNC(external)->commit(STATE_SYNC(commit).h, fd); -		/* Keep the client socket open, we want synchronous commits. */ -		ret = LOCAL_RET_STOLEN; +	case CT_COMMIT: +		dlog(LOG_NOTICE, "committing conntrack cache"); +		STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->ct.commit; +		STATE_SYNC(commit).rq[1].cb = NULL; +		ret = local_commit(fd);  		break;  	case RESET_TIMERS:  		if (!alarm_pending(&STATE_SYNC(reset_cache_alarm))) { @@ -509,29 +607,29 @@ static int local_handler_sync(int fd, int type, void *data)  				  CONFIG(purge_timeout), 0);  		}  		break; -	case FLUSH_CACHE: +	case CT_FLUSH_CACHE:  		/* inmediate flush, remove pending flush scheduled if any */  		del_alarm(&STATE_SYNC(reset_cache_alarm));  		dlog(LOG_NOTICE, "flushing caches"); -		STATE(mode)->internal->flush(); -		STATE_SYNC(external)->flush(); +		STATE(mode)->internal->ct.flush(); +		STATE_SYNC(external)->ct.flush();  		break; -	case FLUSH_INT_CACHE: +	case CT_FLUSH_INT_CACHE:  		/* inmediate flush, remove pending flush scheduled if any */  		del_alarm(&STATE_SYNC(reset_cache_alarm));  		dlog(LOG_NOTICE, "flushing internal cache"); -		STATE(mode)->internal->flush(); +		STATE(mode)->internal->ct.flush();  		break; -	case FLUSH_EXT_CACHE: +	case CT_FLUSH_EXT_CACHE:  		dlog(LOG_NOTICE, "flushing external cache"); -		STATE_SYNC(external)->flush(); +		STATE_SYNC(external)->ct.flush();  		break;  	case KILL:  		killer(0);  		break;  	case STATS: -		STATE(mode)->internal->stats(fd); -		STATE_SYNC(external)->stats(fd); +		STATE(mode)->internal->ct.stats(fd); +		STATE_SYNC(external)->ct.stats(fd);  		dump_traffic_stats(fd);  		multichannel_stats(STATE_SYNC(channel), fd);  		dump_stats_sync(fd); @@ -541,8 +639,8 @@ static int local_handler_sync(int fd, int type, void *data)  		multichannel_stats(STATE_SYNC(channel), fd);  		break;  	case STATS_CACHE: -		STATE(mode)->internal->stats_ext(fd); -		STATE_SYNC(external)->stats_ext(fd); +		STATE(mode)->internal->ct.stats_ext(fd); +		STATE_SYNC(external)->ct.stats_ext(fd);  		break;  	case STATS_LINK:  		multichannel_stats_extended(STATE_SYNC(channel), @@ -551,6 +649,63 @@ static int local_handler_sync(int fd, int type, void *data)  	case STATS_QUEUE:  		queue_stats_show(fd);  		break; +	case EXP_STATS: +		if (!(CONFIG(flags) & CTD_EXPECT)) +			break; + +		STATE(mode)->internal->exp.stats(fd); +		STATE_SYNC(external)->exp.stats(fd); +		dump_traffic_stats(fd); +		multichannel_stats(STATE_SYNC(channel), fd); +		dump_stats_sync(fd); +		break; +	case EXP_DUMP_INTERNAL: +		if (!(CONFIG(flags) & CTD_EXPECT)) +			break; + +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE(mode)->internal->exp.dump(fd, NFCT_O_PLAIN); +			exit(EXIT_SUCCESS); +		} +		break; +	case EXP_DUMP_EXTERNAL: +		if (!(CONFIG(flags) & CTD_EXPECT)) +			break; + +		if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { +			STATE_SYNC(external)->exp.dump(fd, NFCT_O_PLAIN); +			exit(EXIT_SUCCESS); +		} +		break; +	case EXP_COMMIT: +		if (!(CONFIG(flags) & CTD_EXPECT)) +			break; + +		dlog(LOG_NOTICE, "committing expectation cache"); +		STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->exp.commit; +		STATE_SYNC(commit).rq[1].cb = NULL; +		local_commit(fd); +		break; +	case ALL_FLUSH_CACHE: +		dlog(LOG_NOTICE, "flushing caches"); +		STATE(mode)->internal->ct.flush(); +		STATE_SYNC(external)->ct.flush(); +		if (CONFIG(flags) & CTD_EXPECT) { +			STATE(mode)->internal->exp.flush(); +			STATE_SYNC(external)->exp.flush(); +		} +		break; +	case ALL_COMMIT: +		dlog(LOG_NOTICE, "committing all external caches"); +		STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->ct.commit; +		if (CONFIG(flags) & CTD_EXPECT) { +			STATE_SYNC(commit).rq[1].cb = +				STATE_SYNC(external)->exp.commit; +		} else { +			STATE_SYNC(commit).rq[1].cb = NULL; +		} +		local_commit(fd); +		break;  	default:  		if (STATE_SYNC(sync)->local)  			ret = STATE_SYNC(sync)->local(fd, type, data); diff --git a/src/sync-notrack.c b/src/sync-notrack.c index c4ad941..a7df4e7 100644 --- a/src/sync-notrack.c +++ b/src/sync-notrack.c @@ -1,6 +1,7 @@  /* - * (C) 2008 by Pablo Neira Ayuso <pablo@netfilter.org> - *  + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or @@ -33,12 +34,14 @@ static struct alarm_block alive_alarm;  struct cache_notrack {  	struct queue_node	qnode; +	struct cache_object	*obj;  };  static void cache_notrack_add(struct cache_object *obj, void *data)  {  	struct cache_notrack *cn = data;  	queue_node_init(&cn->qnode, Q_ELEM_OBJ); +	cn->obj = obj;  }  static void cache_notrack_del(struct cache_object *obj, void *data) @@ -68,15 +71,15 @@ static void tx_queue_add_ctlmsg(uint32_t flags, uint32_t from, uint32_t to)  	ack->from	= from;  	ack->to		= to; -	queue_add(STATE_SYNC(tx_queue), &qobj->qnode); +	if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) +		queue_object_free(qobj);  }  static int do_cache_to_tx(void *data1, void *data2)  {  	struct cache_object *obj = data2; -	struct cache_notrack *cn = -		cache_get_extra(STATE(mode)->internal->data, obj); -	if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) +	struct cache_notrack *cn = cache_get_extra(obj); +	if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0)  		cache_object_get(obj);  	return 0;  } @@ -86,7 +89,7 @@ static int kernel_resync_cb(enum nf_conntrack_msg_type type,  {  	struct nethdr *net; -	net = BUILD_NETMSG(ct, NET_T_STATE_NEW); +	net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_NEW);  	multichannel_send(STATE_SYNC(channel), net);  	return NFCT_CB_CONTINUE; @@ -99,7 +102,7 @@ static void kernel_resync(void)  	u_int32_t family = AF_UNSPEC;  	int ret; -	h = nfct_open(CONNTRACK, 0); +	h = nfct_open(CONFIG(netlink).subsys_id, 0);  	if (h == NULL) {  		dlog(LOG_ERR, "can't allocate memory for the internal cache");  		return; @@ -126,7 +129,9 @@ static int notrack_local(int fd, int type, void *data)  		if (CONFIG(sync).internal_cache_disable) {  			kernel_resync();  		} else { -			cache_iterate(STATE(mode)->internal->data, +			cache_iterate(STATE(mode)->internal->ct.data, +				      NULL, do_cache_to_tx); +			cache_iterate(STATE(mode)->internal->exp.data,  				      NULL, do_cache_to_tx);  		}  		break; @@ -147,7 +152,9 @@ static int digest_msg(const struct nethdr *net)  		if (CONFIG(sync).internal_cache_disable) {  			kernel_resync();  		} else { -			cache_iterate(STATE(mode)->internal->data, +			cache_iterate(STATE(mode)->internal->ct.data, +				      NULL, do_cache_to_tx); +			cache_iterate(STATE(mode)->internal->exp.data,  				      NULL, do_cache_to_tx);  		}  		return MSG_CTL; @@ -190,19 +197,17 @@ static int tx_queue_xmit(struct queue_node *n, const void *data2)  		break;  	}  	case Q_ELEM_OBJ: { -		struct cache_ftfw *cn; -		struct cache_object *obj; +		struct cache_notrack *cn;  		int type;  		struct nethdr *net; -		cn = (struct cache_ftfw *)n; -		obj = cache_data_get_object(STATE(mode)->internal->data, cn); -		type = object_status_to_network_type(obj->status);; -		net = BUILD_NETMSG(obj->ct, type); +		cn = (struct cache_notrack *)n; +		type = object_status_to_network_type(cn->obj); +		net = cn->obj->cache->ops->build_msg(cn->obj, type);  		multichannel_send(STATE_SYNC(channel), net);  		queue_del(n); -		cache_object_put(obj); +		cache_object_put(cn->obj);  		break;  	}  	} @@ -217,9 +222,8 @@ static void notrack_xmit(void)  static void notrack_enqueue(struct cache_object *obj, int query)  { -	struct cache_notrack *cn = -		cache_get_extra(STATE(mode)->internal->data, obj); -	if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) +	struct cache_notrack *cn = cache_get_extra(obj); +	if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0)  		cache_object_get(obj);  } @@ -236,7 +240,8 @@ static void tx_queue_add_ctlmsg2(uint32_t flags)  	ctl->type	= NET_T_CTL;  	ctl->flags	= flags; -	queue_add(STATE_SYNC(tx_queue), &qobj->qnode); +	if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) +		queue_object_free(qobj);  }  static void do_alive_alarm(struct alarm_block *a, void *data)  | 
