Mercurial > flash_v2
changeset 151:25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
line wrap: on
line diff
--- a/host/ChangeLog +++ b/host/ChangeLog @@ -1,3 +1,7 @@ +2001-01-29 Andreas Schuldei <andreas@schuldei.org> + + * acinclude.m4 (CYG_AC_PATH_TCL): Simplify Tcl installation searching + 2000-10-23 Jesper Skov <jskov@redhat.com> * configure: Disable ser_filter magic for now - properly this time!
--- a/host/acinclude.m4 +++ b/host/acinclude.m4 @@ -245,6 +245,29 @@ fi ]) +dnl ==================================================================== +dnl Inspired by KDE's autoconfig +dnl This macro takes three Arguments like this: +dnl AC_FIND_FILE(foo.h, $incdirs, incdir) +dnl the filename to look for, the list of paths to check and +dnl the variable with the result. + +AC_DEFUN(AC_FIND_FILE, +[ +$3=NO +for i in $2; +do + for j in $1; + do + if test -r "$i/$j"; then + $3=$i + break 2 + fi + done +done +]) + + dnl -------------------------------------------------------------------- dnl Convert a cygwin pathname to something acceptable to VC++ (but dnl still invoked from bash and cygwin's make). This means using @@ -321,29 +344,15 @@ AC_SUBST(cyg_ac_tcl_version) dnl Where is the Tcl installation? By default assume Tcl is already dnl installed in the same place as the eCos host-side. + AC_ARG_WITH(tcl,[ --with-tcl-header=<path> location of Tcl header]) AC_ARG_WITH(tcl,[ --with-tcl-lib=<path> location of Tcl libraries]) +AC_ARG_WITH(tcl,[ --with-tcl=<path> location of Tcl header and libraries]) AC_MSG_CHECKING(for Tcl installation) -AC_ARG_WITH(tcl,[ --with-tcl=<path> location of Tcl header and libraries],[ - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib -],[ - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi -]) -AC_MSG_RESULT(${cyg_ac_tcl_libdir}) +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" +AC_FIND_FILE(tcl.h, $tcl_incdirs, cyg_ac_tcl_incdir) dnl Sanity check, make sure that there is a tcl.h header file. dnl If not then there is no point in proceeding. @@ -351,6 +360,11 @@ if test \! -r ${cyg_ac_tcl_incdir}/tcl.h AC_MSG_ERROR(unable to locate Tcl header file tcl.h) fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" +AC_FIND_FILE(tclConfig.sh, $tcl_libdirs, cyg_ac_tcl_libdir) + +AC_MSG_RESULT(${cyg_ac_tcl_libdir}) + dnl If using VC++ then there is no tclConfig.sh file, so the dnl library information has to be hard-wired. Otherwise ther dnl should be a tclConfig.sh file containing the necessary information.
--- a/host/aclocal.m4 +++ b/host/aclocal.m4 @@ -257,6 +257,29 @@ fi ]) +dnl ==================================================================== +dnl Inspired by KDE's autoconfig +dnl This macro takes three Arguments like this: +dnl AC_FIND_FILE(foo.h, $incdirs, incdir) +dnl the filename to look for, the list of paths to check and +dnl the variable with the result. + +AC_DEFUN(AC_FIND_FILE, +[ +$3=NO +for i in $2; +do + for j in $1; + do + if test -r "$i/$j"; then + $3=$i + break 2 + fi + done +done +]) + + dnl -------------------------------------------------------------------- dnl Convert a cygwin pathname to something acceptable to VC++ (but dnl still invoked from bash and cygwin's make). This means using @@ -333,29 +356,15 @@ AC_SUBST(cyg_ac_tcl_version) dnl Where is the Tcl installation? By default assume Tcl is already dnl installed in the same place as the eCos host-side. + AC_ARG_WITH(tcl,[ --with-tcl-header=<path> location of Tcl header]) AC_ARG_WITH(tcl,[ --with-tcl-lib=<path> location of Tcl libraries]) +AC_ARG_WITH(tcl,[ --with-tcl=<path> location of Tcl header and libraries]) AC_MSG_CHECKING(for Tcl installation) -AC_ARG_WITH(tcl,[ --with-tcl=<path> location of Tcl header and libraries],[ - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib -],[ - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi -]) -AC_MSG_RESULT(${cyg_ac_tcl_libdir}) +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" +AC_FIND_FILE(tcl.h, $tcl_incdirs, cyg_ac_tcl_incdir) dnl Sanity check, make sure that there is a tcl.h header file. dnl If not then there is no point in proceeding. @@ -363,6 +372,11 @@ if test \! -r ${cyg_ac_tcl_incdir}/tcl.h AC_MSG_ERROR(unable to locate Tcl header file tcl.h) fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" +AC_FIND_FILE(tclConfig.sh, $tcl_libdirs, cyg_ac_tcl_libdir) + +AC_MSG_RESULT(${cyg_ac_tcl_libdir}) + dnl If using VC++ then there is no tclConfig.sh file, so the dnl library information has to be hard-wired. Otherwise ther dnl should be a tclConfig.sh file containing the necessary information.
--- a/host/configure +++ b/host/configure @@ -57,7 +57,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -172,7 +171,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -343,11 +341,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -513,16 +506,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -587,7 +576,7 @@ else { echo "configure: error: can not r fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:591: checking host system type" >&5 +echo "configure:580: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -619,7 +608,7 @@ echo "$ac_t""$host" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:623: checking for a BSD compatible install" >&5 +echo "configure:612: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -672,7 +661,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:676: checking whether build environment is sane" >&5 +echo "configure:665: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -729,7 +718,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:733: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:722: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -768,7 +757,7 @@ fi missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:772: checking for working aclocal" >&5 +echo "configure:761: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -781,7 +770,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:785: checking for working autoconf" >&5 +echo "configure:774: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -794,7 +783,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:798: checking for working automake" >&5 +echo "configure:787: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -807,7 +796,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:811: checking for working autoheader" >&5 +echo "configure:800: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -820,7 +809,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:824: checking for working makeinfo" >&5 +echo "configure:813: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -834,7 +823,7 @@ fi echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:838: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:827: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -858,7 +847,7 @@ fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:862: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:851: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -885,12 +874,12 @@ else fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:889: checking for Cygwin environment" >&5 +echo "configure:878: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 894 "configure" +#line 883 "configure" #include "confdefs.h" int main() { @@ -901,7 +890,7 @@ int main() { return __CYGWIN__; ; return 0; } EOF -if { (eval echo configure:905: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:894: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -920,7 +909,7 @@ test "$ac_cv_cygwin" = yes && CYGWIN=yes # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:924: checking for $ac_word" >&5 +echo "configure:913: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -950,7 +939,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:954: checking for $ac_word" >&5 +echo "configure:943: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1001,7 +990,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1005: checking for $ac_word" >&5 +echo "configure:994: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1033,7 +1022,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1037: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1026: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1044,12 +1033,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1048 "configure" +#line 1037 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1053: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1075,12 +1064,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1079: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1068: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1084: checking whether we are using GNU C" >&5 +echo "configure:1073: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1089,7 +1078,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1108,7 +1097,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1112: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1101: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1144,7 +1133,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1148: checking for $ac_word" >&5 +echo "configure:1137: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1176,7 +1165,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1180: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1169: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1187,12 +1176,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1191 "configure" +#line 1180 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1185: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1218,12 +1207,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1222: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1211: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1227: checking whether we are using GNU C++" >&5 +echo "configure:1216: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1232,7 +1221,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1236: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1225: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1251,7 +1240,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1255: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1244: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1283,13 +1272,13 @@ else fi echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:1287: checking for object suffix" >&5 +echo "configure:1276: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:1293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1282: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1307,19 +1296,19 @@ OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1311: checking for mingw32 environment" >&5 +echo "configure:1300: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1316 "configure" +#line 1305 "configure" #include "confdefs.h" int main() { return __MINGW32__; ; return 0; } EOF -if { (eval echo configure:1323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1312: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1338,7 +1327,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=y echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1342: checking for executable suffix" >&5 +echo "configure:1331: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1348,10 +1337,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -1373,7 +1362,7 @@ ac_exeext=$EXEEXT echo $ac_n "checking "for Visual C++"""... $ac_c" 1>&6 -echo "configure:1377: checking "for Visual C++"" >&5 +echo "configure:1366: checking "for Visual C++"" >&5 MSVC="no"; if test "${CC}" = "cl" ; then MSVC="yes" @@ -1399,7 +1388,7 @@ fi echo $ac_n "checking "the default compiler flags"""... $ac_c" 1>&6 -echo "configure:1403: checking "the default compiler flags"" >&5 +echo "configure:1392: checking "the default compiler flags"" >&5 cygflags_enable_debug="no" # Check whether --enable-debug or --disable-debug was given. @@ -1593,7 +1582,7 @@ fi echo $ac_n "checking for Tcl version""... $ac_c" 1>&6 -echo "configure:1597: checking for Tcl version" >&5 +echo "configure:1586: checking for Tcl version" >&5 # Check whether --with-tcl-version or --without-tcl-version was given. if test "${with_tcl_version+set}" = set; then withval="$with_tcl_version" @@ -1617,6 +1606,13 @@ fi echo "$ac_t""${cyg_ac_tcl_version}" 1>&6 + +# Check whether --with-tcl or --without-tcl was given. +if test "${with_tcl+set}" = set; then + withval="$with_tcl" + : +fi + # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" @@ -1631,38 +1627,44 @@ fi echo $ac_n "checking for Tcl installation""... $ac_c" 1>&6 -echo "configure:1635: checking for Tcl installation" >&5 -# Check whether --with-tcl or --without-tcl was given. -if test "${with_tcl+set}" = set; then - withval="$with_tcl" - - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib +echo "configure:1631: checking for Tcl installation" >&5 + +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" -else - - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi +cyg_ac_tcl_incdir=NO +for i in $tcl_incdirs; +do + for j in tcl.h; + do + if test -r "$i/$j"; then + cyg_ac_tcl_incdir=$i + break 2 + fi + done +done - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi - -fi - -echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 if test \! -r ${cyg_ac_tcl_incdir}/tcl.h ; then { echo "configure: error: unable to locate Tcl header file tcl.h" 1>&2; exit 1; } fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" + +cyg_ac_tcl_libdir=NO +for i in $tcl_libdirs; +do + for j in tclConfig.sh; + do + if test -r "$i/$j"; then + cyg_ac_tcl_libdir=$i + break 2 + fi + done +done + + +echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 + if test "${MSVC}" = "yes" ; then cyg_ac_tcl_libs="tcl${cyg_ac_tcl_version}.lib"
--- a/host/infra/configure +++ b/host/infra/configure @@ -45,7 +45,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -160,7 +159,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -331,11 +329,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -501,16 +494,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -577,7 +566,7 @@ else { echo "configure: error: can not r fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:581: checking host system type" >&5 +echo "configure:570: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -610,7 +599,7 @@ echo "$ac_t""$host" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:614: checking for a BSD compatible install" >&5 +echo "configure:603: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -663,7 +652,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:667: checking whether build environment is sane" >&5 +echo "configure:656: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -720,7 +709,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:724: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:713: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -759,7 +748,7 @@ fi missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:763: checking for working aclocal" >&5 +echo "configure:752: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -772,7 +761,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:776: checking for working autoconf" >&5 +echo "configure:765: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -785,7 +774,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:789: checking for working automake" >&5 +echo "configure:778: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -798,7 +787,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:802: checking for working autoheader" >&5 +echo "configure:791: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -811,7 +800,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:815: checking for working makeinfo" >&5 +echo "configure:804: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -833,7 +822,7 @@ EOF echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:837: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:826: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -857,7 +846,7 @@ fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:861: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:850: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -886,7 +875,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:890: checking for $ac_word" >&5 +echo "configure:879: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -916,7 +905,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:920: checking for $ac_word" >&5 +echo "configure:909: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -967,7 +956,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:971: checking for $ac_word" >&5 +echo "configure:960: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -999,7 +988,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1003: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:992: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1010,12 +999,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1014 "configure" +#line 1003 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1041,12 +1030,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1045: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1034: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1050: checking whether we are using GNU C" >&5 +echo "configure:1039: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1055,7 +1044,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1059: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1074,7 +1063,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1078: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1067: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1110,7 +1099,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1114: checking for $ac_word" >&5 +echo "configure:1103: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1142,7 +1131,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1146: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1135: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1153,12 +1142,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1157 "configure" +#line 1146 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1184,12 +1173,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1188: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1177: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1193: checking whether we are using GNU C++" >&5 +echo "configure:1182: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1198,7 +1187,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1202: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1217,7 +1206,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1221: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1210: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1251,7 +1240,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1255: checking for $ac_word" >&5 +echo "configure:1244: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1279,13 +1268,13 @@ else fi echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:1283: checking for object suffix" >&5 +echo "configure:1272: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:1289: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1303,12 +1292,12 @@ OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1307: checking for Cygwin environment" >&5 +echo "configure:1296: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1312 "configure" +#line 1301 "configure" #include "confdefs.h" int main() { @@ -1319,7 +1308,7 @@ int main() { return __CYGWIN__; ; return 0; } EOF -if { (eval echo configure:1323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1312: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1336,19 +1325,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1340: checking for mingw32 environment" >&5 +echo "configure:1329: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1345 "configure" +#line 1334 "configure" #include "confdefs.h" int main() { return __MINGW32__; ; return 0; } EOF -if { (eval echo configure:1352: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1367,7 +1356,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=y echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1371: checking for executable suffix" >&5 +echo "configure:1360: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1377,10 +1366,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -1402,7 +1391,7 @@ ac_exeext=$EXEEXT echo $ac_n "checking "for Visual C++"""... $ac_c" 1>&6 -echo "configure:1406: checking "for Visual C++"" >&5 +echo "configure:1395: checking "for Visual C++"" >&5 MSVC="no"; if test "${CC}" = "cl" ; then MSVC="yes" @@ -1427,7 +1416,7 @@ fi echo $ac_n "checking "the default compiler flags"""... $ac_c" 1>&6 -echo "configure:1431: checking "the default compiler flags"" >&5 +echo "configure:1420: checking "the default compiler flags"" >&5 cygflags_enable_debug="no" # Check whether --enable-debug or --disable-debug was given. @@ -1473,14 +1462,14 @@ fi echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:1477: checking whether byte ordering is bigendian" >&5 +echo "configure:1466: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext <<EOF -#line 1484 "configure" +#line 1473 "configure" #include "confdefs.h" #include <sys/types.h> #include <sys/param.h> @@ -1491,11 +1480,11 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:1495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1484: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext <<EOF -#line 1499 "configure" +#line 1488 "configure" #include "confdefs.h" #include <sys/types.h> #include <sys/param.h> @@ -1506,7 +1495,7 @@ int main() { #endif ; return 0; } EOF -if { (eval echo configure:1510: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1499: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else @@ -1526,7 +1515,7 @@ if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <<EOF -#line 1530 "configure" +#line 1519 "configure" #include "confdefs.h" main () { /* Are we little or big endian? From Harbison&Steele. */ @@ -1539,7 +1528,7 @@ main () { exit (u.c[sizeof (long) - 1] == 1); } EOF -if { (eval echo configure:1543: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else @@ -1568,7 +1557,7 @@ fi echo $ac_n "checking "for a 64 bit data type"""... $ac_c" 1>&6 -echo "configure:1572: checking "for a 64 bit data type"" >&5 +echo "configure:1561: checking "for a 64 bit data type"" >&5 if eval "test \"`echo '$''{'cyg_ac_cv_type_64bit'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1586,7 +1575,7 @@ cross_compiling=$ac_cv_prog_cc_cross ctype_64bit="long long" else cat > conftest.$ac_ext <<EOF -#line 1590 "configure" +#line 1579 "configure" #include "confdefs.h" main() { @@ -1594,7 +1583,7 @@ else } EOF -if { (eval echo configure:1598: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1587: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ctype_64bit=$type else @@ -1617,7 +1606,7 @@ cross_compiling=$ac_cv_prog_cxx_cross cxxtype_64bit="long long" else cat > conftest.$ac_ext <<EOF -#line 1621 "configure" +#line 1610 "configure" #include "confdefs.h" #ifdef __cplusplus extern "C" void exit(int); @@ -1628,7 +1617,7 @@ extern "C" void exit(int); } EOF -if { (eval echo configure:1632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then cxxtype_64bit=$type else @@ -1673,7 +1662,7 @@ EOF echo $ac_n "checking size of int *""... $ac_c" 1>&6 -echo "configure:1677: checking size of int *" >&5 +echo "configure:1666: checking size of int *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1681,7 +1670,7 @@ else { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <<EOF -#line 1685 "configure" +#line 1674 "configure" #include "confdefs.h" #include <stdio.h> main() @@ -1692,7 +1681,7 @@ main() exit(0); } EOF -if { (eval echo configure:1696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int_p=`cat conftestval` else @@ -1712,7 +1701,7 @@ EOF echo $ac_n "checking size of long""... $ac_c" 1>&6 -echo "configure:1716: checking size of long" >&5 +echo "configure:1705: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1720,7 +1709,7 @@ else { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <<EOF -#line 1724 "configure" +#line 1713 "configure" #include "confdefs.h" #include <stdio.h> main() @@ -1731,7 +1720,7 @@ main() exit(0); } EOF -if { (eval echo configure:1735: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else @@ -1756,7 +1745,7 @@ EOF echo $ac_n "checking "for __PRETTY_FUNCTION__ support"""... $ac_c" 1>&6 -echo "configure:1760: checking "for __PRETTY_FUNCTION__ support"" >&5 +echo "configure:1749: checking "for __PRETTY_FUNCTION__ support"" >&5 if eval "test \"`echo '$''{'cyg_ac_cv_c_pretty_function'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1770,14 +1759,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <<EOF -#line 1774 "configure" +#line 1763 "configure" #include "confdefs.h" #include <stdio.h> int main() { puts(__PRETTY_FUNCTION__); ; return 0; } EOF -if { (eval echo configure:1781: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1770: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* c_ok="yes" else @@ -1796,14 +1785,14 @@ ac_link='${CXX-g++} -o conftest${ac_exee cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext <<EOF -#line 1800 "configure" +#line 1789 "configure" #include "confdefs.h" #include <cstdio> int main() { puts(__PRETTY_FUNCTION__); ; return 0; } EOF -if { (eval echo configure:1807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* cxx_ok="yes" else @@ -1843,7 +1832,7 @@ EOF echo $ac_n "checking for Tcl version""... $ac_c" 1>&6 -echo "configure:1847: checking for Tcl version" >&5 +echo "configure:1836: checking for Tcl version" >&5 # Check whether --with-tcl-version or --without-tcl-version was given. if test "${with_tcl_version+set}" = set; then withval="$with_tcl_version" @@ -1867,6 +1856,13 @@ fi echo "$ac_t""${cyg_ac_tcl_version}" 1>&6 + +# Check whether --with-tcl or --without-tcl was given. +if test "${with_tcl+set}" = set; then + withval="$with_tcl" + : +fi + # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" @@ -1881,38 +1877,44 @@ fi echo $ac_n "checking for Tcl installation""... $ac_c" 1>&6 -echo "configure:1885: checking for Tcl installation" >&5 -# Check whether --with-tcl or --without-tcl was given. -if test "${with_tcl+set}" = set; then - withval="$with_tcl" - - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib +echo "configure:1881: checking for Tcl installation" >&5 + +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" -else - - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi +cyg_ac_tcl_incdir=NO +for i in $tcl_incdirs; +do + for j in tcl.h; + do + if test -r "$i/$j"; then + cyg_ac_tcl_incdir=$i + break 2 + fi + done +done - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi - -fi - -echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 if test \! -r ${cyg_ac_tcl_incdir}/tcl.h ; then { echo "configure: error: unable to locate Tcl header file tcl.h" 1>&2; exit 1; } fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" + +cyg_ac_tcl_libdir=NO +for i in $tcl_libdirs; +do + for j in tclConfig.sh; + do + if test -r "$i/$j"; then + cyg_ac_tcl_libdir=$i + break 2 + fi + done +done + + +echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 + if test "${MSVC}" = "yes" ; then cyg_ac_tcl_libs="tcl${cyg_ac_tcl_version}.lib"
--- a/host/libcdl/configure +++ b/host/libcdl/configure @@ -59,7 +59,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -174,7 +173,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -345,11 +343,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -515,16 +508,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -591,7 +580,7 @@ else { echo "configure: error: can not r fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:595: checking host system type" >&5 +echo "configure:584: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -624,7 +613,7 @@ echo "$ac_t""$host" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:628: checking for a BSD compatible install" >&5 +echo "configure:617: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -677,7 +666,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:681: checking whether build environment is sane" >&5 +echo "configure:670: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -734,7 +723,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:738: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:727: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -780,7 +769,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:784: checking for working aclocal" >&5 +echo "configure:773: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -793,7 +782,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:797: checking for working autoconf" >&5 +echo "configure:786: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -806,7 +795,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:810: checking for working automake" >&5 +echo "configure:799: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -819,7 +808,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:823: checking for working autoheader" >&5 +echo "configure:812: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -832,7 +821,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:836: checking for working makeinfo" >&5 +echo "configure:825: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -854,7 +843,7 @@ EOF echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:858: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:847: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -878,7 +867,7 @@ fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:882: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:871: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -907,7 +896,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:911: checking for $ac_word" >&5 +echo "configure:900: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -937,7 +926,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:941: checking for $ac_word" >&5 +echo "configure:930: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -988,7 +977,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:992: checking for $ac_word" >&5 +echo "configure:981: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1020,7 +1009,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1024: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1013: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1031,12 +1020,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1035 "configure" +#line 1024 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1062,12 +1051,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1066: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1055: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1071: checking whether we are using GNU C" >&5 +echo "configure:1060: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1076,7 +1065,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1080: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1069: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1095,7 +1084,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1099: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1088: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1131,7 +1120,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1135: checking for $ac_word" >&5 +echo "configure:1124: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1163,7 +1152,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1167: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1156: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1174,12 +1163,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1178 "configure" +#line 1167 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1205,12 +1194,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1209: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1198: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1214: checking whether we are using GNU C++" >&5 +echo "configure:1203: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1219,7 +1208,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1223: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1212: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1238,7 +1227,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1242: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1231: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1272,7 +1261,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1276: checking for $ac_word" >&5 +echo "configure:1265: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1300,13 +1289,13 @@ else fi echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:1304: checking for object suffix" >&5 +echo "configure:1293: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:1310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1299: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1324,12 +1313,12 @@ OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1328: checking for Cygwin environment" >&5 +echo "configure:1317: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1333 "configure" +#line 1322 "configure" #include "confdefs.h" int main() { @@ -1340,7 +1329,7 @@ int main() { return __CYGWIN__; ; return 0; } EOF -if { (eval echo configure:1344: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1333: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1357,19 +1346,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1361: checking for mingw32 environment" >&5 +echo "configure:1350: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1366 "configure" +#line 1355 "configure" #include "confdefs.h" int main() { return __MINGW32__; ; return 0; } EOF -if { (eval echo configure:1373: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1362: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1388,7 +1377,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=y echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1392: checking for executable suffix" >&5 +echo "configure:1381: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1398,10 +1387,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1402: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -1423,7 +1412,7 @@ ac_exeext=$EXEEXT echo $ac_n "checking "for Visual C++"""... $ac_c" 1>&6 -echo "configure:1427: checking "for Visual C++"" >&5 +echo "configure:1416: checking "for Visual C++"" >&5 MSVC="no"; if test "${CC}" = "cl" ; then MSVC="yes" @@ -1448,7 +1437,7 @@ fi echo $ac_n "checking "the default compiler flags"""... $ac_c" 1>&6 -echo "configure:1452: checking "the default compiler flags"" >&5 +echo "configure:1441: checking "the default compiler flags"" >&5 cygflags_enable_debug="no" # Check whether --enable-debug or --disable-debug was given. @@ -1644,7 +1633,7 @@ fi echo $ac_n "checking for Tcl version""... $ac_c" 1>&6 -echo "configure:1648: checking for Tcl version" >&5 +echo "configure:1637: checking for Tcl version" >&5 # Check whether --with-tcl-version or --without-tcl-version was given. if test "${with_tcl_version+set}" = set; then withval="$with_tcl_version" @@ -1668,6 +1657,13 @@ fi echo "$ac_t""${cyg_ac_tcl_version}" 1>&6 + +# Check whether --with-tcl or --without-tcl was given. +if test "${with_tcl+set}" = set; then + withval="$with_tcl" + : +fi + # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" @@ -1682,38 +1678,44 @@ fi echo $ac_n "checking for Tcl installation""... $ac_c" 1>&6 -echo "configure:1686: checking for Tcl installation" >&5 -# Check whether --with-tcl or --without-tcl was given. -if test "${with_tcl+set}" = set; then - withval="$with_tcl" - - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib +echo "configure:1682: checking for Tcl installation" >&5 + +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" -else - - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi +cyg_ac_tcl_incdir=NO +for i in $tcl_incdirs; +do + for j in tcl.h; + do + if test -r "$i/$j"; then + cyg_ac_tcl_incdir=$i + break 2 + fi + done +done - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi - -fi - -echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 if test \! -r ${cyg_ac_tcl_incdir}/tcl.h ; then { echo "configure: error: unable to locate Tcl header file tcl.h" 1>&2; exit 1; } fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" + +cyg_ac_tcl_libdir=NO +for i in $tcl_libdirs; +do + for j in tclConfig.sh; + do + if test -r "$i/$j"; then + cyg_ac_tcl_libdir=$i + break 2 + fi + done +done + + +echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 + if test "${MSVC}" = "yes" ; then cyg_ac_tcl_libs="tcl${cyg_ac_tcl_version}.lib" @@ -1749,7 +1751,7 @@ fi echo $ac_n "checking for infrastructure files""... $ac_c" 1>&6 -echo "configure:1753: checking for infrastructure files" >&5 +echo "configure:1755: checking for infrastructure files" >&5 # Check whether --with-infra or --without-infra was given. if test "${with_infra+set}" = set; then withval="$with_infra"
--- a/host/tools/Utils/common/configure +++ b/host/tools/Utils/common/configure @@ -35,7 +35,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -150,7 +149,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -321,11 +319,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -491,16 +484,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -567,7 +556,7 @@ else { echo "configure: error: can not r fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:571: checking host system type" >&5 +echo "configure:560: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -600,7 +589,7 @@ echo "$ac_t""$host" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:604: checking for a BSD compatible install" >&5 +echo "configure:593: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -653,7 +642,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:657: checking whether build environment is sane" >&5 +echo "configure:646: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -710,7 +699,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:714: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:703: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -756,7 +745,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:760: checking for working aclocal" >&5 +echo "configure:749: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -769,7 +758,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:773: checking for working autoconf" >&5 +echo "configure:762: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -782,7 +771,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:786: checking for working automake" >&5 +echo "configure:775: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -795,7 +784,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:799: checking for working autoheader" >&5 +echo "configure:788: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -808,7 +797,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:812: checking for working makeinfo" >&5 +echo "configure:801: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -822,7 +811,7 @@ fi echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:826: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:815: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -846,7 +835,7 @@ fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:850: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:839: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -875,7 +864,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:879: checking for $ac_word" >&5 +echo "configure:868: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -905,7 +894,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:909: checking for $ac_word" >&5 +echo "configure:898: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -956,7 +945,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:960: checking for $ac_word" >&5 +echo "configure:949: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -988,7 +977,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:992: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:981: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -999,12 +988,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1003 "configure" +#line 992 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1030,12 +1019,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1034: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1023: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1039: checking whether we are using GNU C" >&5 +echo "configure:1028: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1044,7 +1033,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1037: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1063,7 +1052,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1067: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1056: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1099,7 +1088,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1103: checking for $ac_word" >&5 +echo "configure:1092: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1131,7 +1120,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1135: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1124: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1142,12 +1131,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1146 "configure" +#line 1135 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1140: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1173,12 +1162,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1177: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1166: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1182: checking whether we are using GNU C++" >&5 +echo "configure:1171: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1187,7 +1176,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1180: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1206,7 +1195,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1210: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1199: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1240,7 +1229,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1244: checking for $ac_word" >&5 +echo "configure:1233: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1268,13 +1257,13 @@ else fi echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:1272: checking for object suffix" >&5 +echo "configure:1261: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:1278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1267: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1292,12 +1281,12 @@ OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1296: checking for Cygwin environment" >&5 +echo "configure:1285: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1301 "configure" +#line 1290 "configure" #include "confdefs.h" int main() { @@ -1308,7 +1297,7 @@ int main() { return __CYGWIN__; ; return 0; } EOF -if { (eval echo configure:1312: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1301: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1325,19 +1314,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1329: checking for mingw32 environment" >&5 +echo "configure:1318: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1334 "configure" +#line 1323 "configure" #include "confdefs.h" int main() { return __MINGW32__; ; return 0; } EOF -if { (eval echo configure:1341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1330: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1356,7 +1345,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=y echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1360: checking for executable suffix" >&5 +echo "configure:1349: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1366,10 +1355,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1359: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -1391,7 +1380,7 @@ ac_exeext=$EXEEXT echo $ac_n "checking "for Visual C++"""... $ac_c" 1>&6 -echo "configure:1395: checking "for Visual C++"" >&5 +echo "configure:1384: checking "for Visual C++"" >&5 MSVC="no"; if test "${CC}" = "cl" ; then MSVC="yes" @@ -1416,7 +1405,7 @@ fi echo $ac_n "checking "the default compiler flags"""... $ac_c" 1>&6 -echo "configure:1420: checking "the default compiler flags"" >&5 +echo "configure:1409: checking "the default compiler flags"" >&5 cygflags_enable_debug="no" # Check whether --enable-debug or --disable-debug was given.
--- a/host/tools/configtool/standalone/common/configure +++ b/host/tools/configtool/standalone/common/configure @@ -43,7 +43,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -158,7 +157,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -329,11 +327,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -499,16 +492,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -580,7 +569,7 @@ ac_configure=$ac_aux_dir/configure # Thi # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:584: checking for a BSD compatible install" >&5 +echo "configure:573: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -633,7 +622,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:637: checking whether build environment is sane" >&5 +echo "configure:626: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -690,7 +679,7 @@ test "$program_suffix" != NONE && test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:694: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:683: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -736,7 +725,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:740: checking for working aclocal" >&5 +echo "configure:729: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -749,7 +738,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:753: checking for working autoconf" >&5 +echo "configure:742: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -762,7 +751,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:766: checking for working automake" >&5 +echo "configure:755: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -775,7 +764,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:779: checking for working autoheader" >&5 +echo "configure:768: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -788,7 +777,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:792: checking for working makeinfo" >&5 +echo "configure:781: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -802,7 +791,7 @@ fi echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:806: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo "configure:795: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -832,7 +821,7 @@ else { echo "configure: error: can not r fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:836: checking host system type" >&5 +echo "configure:825: checking host system type" >&5 host_alias=$host case "$host_alias" in @@ -855,7 +844,7 @@ echo "$ac_t""$host" 1>&6 # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:859: checking for $ac_word" >&5 +echo "configure:848: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -885,7 +874,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:889: checking for $ac_word" >&5 +echo "configure:878: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -936,7 +925,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:940: checking for $ac_word" >&5 +echo "configure:929: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -968,7 +957,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:972: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:961: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -979,12 +968,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 983 "configure" +#line 972 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1010,12 +999,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1014: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1003: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1019: checking whether we are using GNU C" >&5 +echo "configure:1008: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1024,7 +1013,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1028: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1017: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1043,7 +1032,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1047: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1036: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1079,7 +1068,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1083: checking for $ac_word" >&5 +echo "configure:1072: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1111,7 +1100,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1115: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1104: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1122,12 +1111,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1126 "configure" +#line 1115 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1153,12 +1142,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1157: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1146: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1162: checking whether we are using GNU C++" >&5 +echo "configure:1151: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1167,7 +1156,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1171: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1160: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1186,7 +1175,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1190: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1179: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1218,13 +1207,13 @@ else fi echo $ac_n "checking for object suffix""... $ac_c" 1>&6 -echo "configure:1222: checking for object suffix" >&5 +echo "configure:1211: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext -if { (eval echo configure:1228: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1217: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; @@ -1242,12 +1231,12 @@ OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:1246: checking for Cygwin environment" >&5 +echo "configure:1235: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1251 "configure" +#line 1240 "configure" #include "confdefs.h" int main() { @@ -1258,7 +1247,7 @@ int main() { return __CYGWIN__; ; return 0; } EOF -if { (eval echo configure:1262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1251: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1275,19 +1264,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 -echo "configure:1279: checking for mingw32 environment" >&5 +echo "configure:1268: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1284 "configure" +#line 1273 "configure" #include "confdefs.h" int main() { return __MINGW32__; ; return 0; } EOF -if { (eval echo configure:1291: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else @@ -1306,7 +1295,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=y echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:1310: checking for executable suffix" >&5 +echo "configure:1299: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1316,10 +1305,10 @@ else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= - if { (eval echo configure:1320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + if { (eval echo configure:1309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in - *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done @@ -1341,7 +1330,7 @@ ac_exeext=$EXEEXT echo $ac_n "checking "for Visual C++"""... $ac_c" 1>&6 -echo "configure:1345: checking "for Visual C++"" >&5 +echo "configure:1334: checking "for Visual C++"" >&5 MSVC="no"; if test "${CC}" = "cl" ; then MSVC="yes" @@ -1366,7 +1355,7 @@ fi echo $ac_n "checking "the default compiler flags"""... $ac_c" 1>&6 -echo "configure:1370: checking "the default compiler flags"" >&5 +echo "configure:1359: checking "the default compiler flags"" >&5 cygflags_enable_debug="no" # Check whether --enable-debug or --disable-debug was given. @@ -1418,7 +1407,7 @@ fi echo $ac_n "checking for Tcl version""... $ac_c" 1>&6 -echo "configure:1422: checking for Tcl version" >&5 +echo "configure:1411: checking for Tcl version" >&5 # Check whether --with-tcl-version or --without-tcl-version was given. if test "${with_tcl_version+set}" = set; then withval="$with_tcl_version" @@ -1442,6 +1431,13 @@ fi echo "$ac_t""${cyg_ac_tcl_version}" 1>&6 + +# Check whether --with-tcl or --without-tcl was given. +if test "${with_tcl+set}" = set; then + withval="$with_tcl" + : +fi + # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" @@ -1456,38 +1452,44 @@ fi echo $ac_n "checking for Tcl installation""... $ac_c" 1>&6 -echo "configure:1460: checking for Tcl installation" >&5 -# Check whether --with-tcl or --without-tcl was given. -if test "${with_tcl+set}" = set; then - withval="$with_tcl" - - cyg_ac_tcl_incdir=${with_tcl}/include - cyg_ac_tcl_libdir=${with_tcl}/lib +echo "configure:1456: checking for Tcl installation" >&5 + +tcl_incdirs="${with_tcl_header} ${with_tcl}/include ${prefix}/include /usr/include/tcl$cyg_ac_tcl_version /usr/include" -else - - if test "${with_tcl_header}" = "no"; then - cyg_ac_tcl_incdir=${prefix}/include - else - with_tcl=yes - cyg_ac_tcl_incdir=${with_tcl_header}/include - fi +cyg_ac_tcl_incdir=NO +for i in $tcl_incdirs; +do + for j in tcl.h; + do + if test -r "$i/$j"; then + cyg_ac_tcl_incdir=$i + break 2 + fi + done +done - if test "${with_tcl_lib}" = "no"; then - cyg_ac_tcl_libdir=${prefix}/lib - else - with_tcl=yes - cyg_ac_tcl_libdir=${with_tcl_lib}/lib - fi - -fi - -echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 if test \! -r ${cyg_ac_tcl_incdir}/tcl.h ; then { echo "configure: error: unable to locate Tcl header file tcl.h" 1>&2; exit 1; } fi +tcl_libdirs="${with_tcl_lib} ${with_tcl}/lib ${prefix}/lib /usr/lib/tcl$cyg_ac_tcl_version /usr/lib" + +cyg_ac_tcl_libdir=NO +for i in $tcl_libdirs; +do + for j in tclConfig.sh; + do + if test -r "$i/$j"; then + cyg_ac_tcl_libdir=$i + break 2 + fi + done +done + + +echo "$ac_t""${cyg_ac_tcl_libdir}" 1>&6 + if test "${MSVC}" = "yes" ; then cyg_ac_tcl_libs="tcl${cyg_ac_tcl_version}.lib" @@ -1523,7 +1525,7 @@ fi echo $ac_n "checking for host-side infrastructure""... $ac_c" 1>&6 -echo "configure:1527: checking for host-side infrastructure" >&5 +echo "configure:1529: checking for host-side infrastructure" >&5 cyg_ac_infra_incdir=../../../../infra cyg_ac_infra_libdir=../../../../infra if test "${MSVC}" = "yes" ; then @@ -1556,7 +1558,7 @@ fi echo "$ac_t""-I${cyg_ac_infra_incdir} -L${cyg_ac_infra_libdir} libraries ${cyg_ac_infra_libraries}" 1>&6 echo $ac_n "checking for libcdl""... $ac_c" 1>&6 -echo "configure:1560: checking for libcdl" >&5 +echo "configure:1562: checking for libcdl" >&5 cyg_ac_cdl_incdir=${srcdir}/../../../../libcdl cyg_ac_cdl_libdir=../../../../libcdl if test "${MSVC}" = "yes" ; then
--- a/packages/ChangeLog +++ b/packages/ChangeLog @@ -1,3 +1,14 @@ +2001-02-09 Jonathan Larmour <jlarmour@redhat.com> + + * pkgconf/rules.mak: Revert below change for now until we work + out something better. + +2001-02-06 Jonathan Larmour <jlarmour@redhat.com> + + * pkgconf/rules.mak: When generating dependencies, accomodate + new gcc dependency output format (and preserve compatibility + with the old - it just generates a redundant dependency). + 2001-01-25 Jesper Skov <jskov@redhat.com> * ecos.db: Added generic i82559 ethernet driver. @@ -8,6 +19,12 @@ 2000-11-25 Jonathan Larmour <jlarmour@ * pkgconf/rules.mak (mlt_headers): Rewrite to work under Solaris, and without excessive rebuilds. +2000-11-21 Bart Veer <bartv@redhat.com> + + * ecos.db: + * customers: + Added USB support + 2000-11-16 Jesper Skov <jskov@redhat.com> * ecos.db: Added intel flash driver. Going to use it as a test to
--- a/packages/NEWS +++ b/packages/NEWS @@ -1,3 +1,13 @@ +* Added support for USB slave devices. This includes generic USB slave + support, a device driver for the SA11x0 on-chip USB device, and an + additional support package for developing USB-ethernet and similar + peripherals. +* Added POSIX cancellation points for the sigwait family of functions, + pthread_join, pthread_cond_wait, pthread_cond_timedwait, sleep and + nanosleep +* Virtual vectors initialization can now be configured with a finer + granularity. Diagnostic output should also appear on the same channel + (possibly ethernet) as the application was launched from. * Added cyg_pci_find_matching() to PCI library API to allow more generalized matching on device properties. * ARM EBSA285 now configured to use virtual vectors all the time. Users with
--- a/packages/compat/posix/current/ChangeLog +++ b/packages/compat/posix/current/ChangeLog @@ -1,3 +1,32 @@ +2001-02-11 Jonathan Larmour <jlarmour@redhat.com> + + * include/pthread.h: Add new pthread_testcancel_unlock and + pthread_canceled functions as eCos extensions. + Rename existing pthread_canceled variable to pthread_cancelled_dummy_var + + * src/pthread.cxx (pthread_canceled): New function to interrogate if + current thread has deferred cancel pending + (pthread_testcancel_unlock): New function. Like testcancel, but unlocks + a mutex before exitting the thread. + (checkforcancel): New internal function + (pthread_join): Add thread cancellation checks. + (pthread_cond_wait): Ditto. + (pthread_cond_timedwait): Ditto. + (pthread_testcancel): Use checkforcancel() + + * src/sem.cxx (sem_wait): Add thread cancellation checks + * src/signal.cxx (sigtimedwait): Ditto. + Also make compilation of this file conditional on CYGPKG_POSIX_SIGNALS + * src/time.cxx (nanosleep): Ditto. + Also make compilation of this file conditional on CYGPKG_POSIX_TIMERS + + * cdl/posix.cdl (CYGPKG_POSIX_TIMERS): Implements POSIX timer ops. + Add explicit kernel and pthread dependencies. + + * tests/sigsetjmp.c (pthread_entry1): Fix incorrect thread no. output + + * tests/pthread3.c: Add deferred cancellation test. + 2001-01-11 Nick Garnett <nickg@cygnus.co.uk> * src/pthread.cxx (pthread_testcancel): Added test for self !=
--- a/packages/compat/posix/current/cdl/posix.cdl +++ b/packages/compat/posix/current/cdl/posix.cdl @@ -114,10 +114,14 @@ cdl_package CYGPKG_POSIX { default_value 1 implements CYGINT_ISO_POSIX_TIMER_TYPES implements CYGINT_ISO_POSIX_TIMERS + implements CYGINT_ISO_POSIX_TIMER_OPS requires { CYGBLD_ISO_POSIX_TIMER_TYPES_HEADER == \ "<cyg/posix/time.h>" } requires { CYGBLD_ISO_POSIX_TIMERS_HEADER == \ "<cyg/posix/time.h>" } + requires CYGPKG_KERNEL + requires CYGVAR_KERNEL_COUNTERS_CLOCK + requires CYGPKG_POSIX_PTHREAD description "This component provides configuration controls for the POSIX timers." } @@ -194,6 +198,8 @@ cdl_package CYGPKG_POSIX { flavor bool default_value 1 requires CYGPKG_KERNEL_EXCEPTIONS + requires CYGPKG_POSIX_PTHREAD + requires CYGPKG_POSIX_TIMERS implements CYGINT_POSIX_REALTIME_SIGNALS description "This component provides configuration controls for the POSIX signals."
--- a/packages/compat/posix/current/include/pthread.h +++ b/packages/compat/posix/current/include/pthread.h @@ -352,9 +352,9 @@ struct pthread_cleanup_buffer // location we define we can ensure that it differs from NULL and any // other valid pointer (as required by the standard). -externC int pthread_canceled; +externC int pthread_canceled_dummy_var; -#define PTHREAD_CANCELED ((void *)(&pthread_canceled)) +#define PTHREAD_CANCELED ((void *)(&pthread_canceled_dummy_var)) //----------------------------------------------------------------------------- // Cancelability enable and type @@ -383,6 +383,15 @@ externC int pthread_cancel (pthread_t th // the thread if there is one. externC void pthread_testcancel (void); +// eCos extension: +// Test for a pending cancellation for the current thread and terminate +// the thread if there is one, unlocking the supplied mutex first. +externC void pthread_testcancel_unlock ( pthread_mutex_t *__mut ); + +// eCos extension: +// Test for a pending cancellation for the current thread and return +// non-zero if this thread has a deferred cancellation pending +externC int pthread_canceled (void); // Install a cleanup routine. // Note that pthread_cleanup_push() and pthread_cleanup_pop() are macros that
--- a/packages/compat/posix/current/src/pthread.cxx +++ b/packages/compat/posix/current/src/pthread.cxx @@ -164,7 +164,7 @@ static pthread_t main_thread; //============================================================================= // Exported variables -int pthread_canceled; // pointed to by PTHREAD_CANCELED +int pthread_canceled_dummy_var; // pointed to by PTHREAD_CANCELED //============================================================================= // Internal functions @@ -271,6 +271,27 @@ static void *call_main( void * ) } //----------------------------------------------------------------------------- +// Check whether there is a cancel pending and if so, whether +// cancellations are enabled. We do it in this order to reduce the +// number of tests in the common case - when no cancellations are +// pending. +// We make this inline so it can be called directly below for speed + +static __inline__ int +checkforcancel( void ) +{ + pthread_info *self = pthread_self_info(); + + if( self != NULL && + self->cancelpending && + self->cancelstate == PTHREAD_CANCEL_ENABLE ) + return 1; + else + return 0; +} + + +//----------------------------------------------------------------------------- // POSIX ASR // This is installed as the ASR for all POSIX threads. @@ -763,6 +784,9 @@ externC int pthread_join (pthread_t thre { PTHREAD_ENTRY(); + // check for cancellation first. + pthread_testcancel(); + pthread_mutex.lock(); // Dispose of any dead threads @@ -787,8 +811,11 @@ externC int pthread_join (pthread_t thre { case PTHREAD_STATE_RUNNING: // The thread is still running, we must wait for it. - while( joinee->state == PTHREAD_STATE_RUNNING ) + while( joinee->state == PTHREAD_STATE_RUNNING ) { joinee->joiner->wait(); + // check if we were woken because we were being cancelled + pthread_testcancel_unlock( (pthread_mutex_t *)&pthread_mutex); + } // check that the thread is still joinable if( joinee->state == PTHREAD_STATE_JOIN ) @@ -1641,11 +1668,17 @@ externC int pthread_cond_wait (pthread_c { PTHREAD_ENTRY(); + // check for cancellation first. + pthread_testcancel(); + PTHREAD_CHECK( cond ); PTHREAD_CHECK( mutex ); ((Cyg_Condition_Variable *)cond)->wait( *(Cyg_Mutex *)mutex ); + // check if we were woken because we were being cancelled + pthread_testcancel(); + PTHREAD_RETURN(0); } @@ -1658,6 +1691,9 @@ externC int pthread_cond_timedwait (pthr { PTHREAD_ENTRY(); + // check for cancellation first. + pthread_testcancel(); + PTHREAD_CHECK( cond ); PTHREAD_CHECK( mutex ); PTHREAD_CHECK( abstime ); @@ -1673,6 +1709,9 @@ externC int pthread_cond_timedwait (pthr ((Cyg_Condition_Variable *)cond)->wait( *(Cyg_Mutex *)mutex, ticks ); + // check if we were woken because we were being cancelled + pthread_testcancel(); + PTHREAD_RETURN(0); } @@ -1920,20 +1959,31 @@ externC int pthread_cancel (pthread_t th th->cancelpending = true; - if( th->cancelstate == PTHREAD_CANCEL_ENABLE && - th->canceltype == PTHREAD_CANCEL_ASYNCHRONOUS ) + if ( th->cancelstate == PTHREAD_CANCEL_ENABLE ) { - // If the thread has cancellation enabled, and it is in - // asynchronous mode, set the eCos thread's ASR pending to - // deal with it when the thread wakes up. We also release the - // thread out of any current wait to make it wake up. + if ( th->canceltype == PTHREAD_CANCEL_ASYNCHRONOUS ) + { + // If the thread has cancellation enabled, and it is in + // asynchronous mode, set the eCos thread's ASR pending to + // deal with it when the thread wakes up. We also release the + // thread out of any current wait to make it wake up. - th->thread->set_asr_pending(); - th->thread->release(); + th->thread->set_asr_pending(); + th->thread->release(); + } + else if ( th->canceltype == PTHREAD_CANCEL_DEFERRED ) + { + // If the thread has cancellation enabled, and it is in + // deferred mode, wake the thread up so that cancellation + // points can test for cancellation. + th->thread->release(); + } + else + CYG_FAIL("Unknown cancellation type"); } - // Otherwise the thread either has cancellation disabled, or is - // in deferred mode. In either case it is up to the thread to - // get into a state to deal with the pending cancellation. + + // Otherwise the thread has cancellation disabled, in which case + // it is up to the thread to enable cancellation pthread_mutex.unlock(); @@ -1942,6 +1992,42 @@ externC int pthread_cancel (pthread_t th } //----------------------------------------------------------------------------- +// eCos extension: +// Test for a pending cancellation for the current thread and return +// non-zero if this thread has a deferred cancellation pending + +externC int pthread_canceled(void) +{ + PTHREAD_ENTRY(); + PTHREAD_RETURN( checkforcancel() ); +} + +//----------------------------------------------------------------------------- +// eCos extension: +// Test for a pending cancellation for the current thread and terminate +// the thread if there is one, unlocking the supplied mutex first. + +externC void pthread_testcancel_unlock( pthread_mutex_t *__mut ) +{ + PTHREAD_ENTRY_VOID(); + + if( checkforcancel() ) + { + Cyg_Mutex *mut = (Cyg_Mutex *)__mut; + mut->unlock(); + + // If we have cancellation enabled, and there is a cancellation + // pending, then go ahead and do the deed. + + // Exit now with special retval. pthread_exit() calls the + // cancellation handlers implicitly. + pthread_exit(PTHREAD_CANCELED); + } + + PTHREAD_RETURN_VOID; +} + +//----------------------------------------------------------------------------- // Test for a pending cancellation for the current thread and terminate // the thread if there is one. @@ -1949,17 +2035,7 @@ externC void pthread_testcancel (void) { PTHREAD_ENTRY_VOID(); - pthread_info *self = pthread_self_info(); - - // Check whether there is a cancel pending and if so, whether - // cancellations are enabled. We do it in this order to reduce the - // number of tests in the common case - when no cancellations are - // pending. - - if( self != NULL && - self->cancelpending && - self->cancelstate == PTHREAD_CANCEL_ENABLE ) - + if( checkforcancel() ) { // If we have cancellation enabled, and there is a cancellation // pending, then go ahead and do the deed.
--- a/packages/compat/posix/current/src/sem.cxx +++ b/packages/compat/posix/current/src/sem.cxx @@ -135,10 +135,20 @@ externC int sem_wait (sem_t *sem) SEMA_ENTRY(); +#ifdef CYGPKG_POSIX_PTHREAD + // check for cancellation first. + pthread_testcancel(); +#endif + Cyg_Counting_Semaphore *sema = (Cyg_Counting_Semaphore *)sem; if( !sema->wait() ) retval = EINTR; +#ifdef CYGPKG_POSIX_PTHREAD + // check if we were woken because we were being cancelled + pthread_testcancel(); +#endif + SEMA_RETURN(retval); }
--- a/packages/compat/posix/current/src/signal.cxx +++ b/packages/compat/posix/current/src/signal.cxx @@ -44,9 +44,12 @@ // //========================================================================== +#include <pkgconf/posix.h> + +#ifdef CYGPKG_POSIX_SIGNALS + #include <pkgconf/hal.h> #include <pkgconf/kernel.h> -#include <pkgconf/posix.h> #include <pkgconf/isoinfra.h> #include <cyg/kernel/ktypes.h> // base kernel types @@ -769,6 +772,9 @@ externC int sigtimedwait (const sigset_ { SIGNAL_ENTRY(); + // check for cancellation first. + pthread_testcancel(); + int err = 0; cyg_tick_count ticks; @@ -792,6 +798,9 @@ externC int sigtimedwait (const sigset_ { if( ticks == 0 || !signal_sigwait.wait(ticks) ) { + // first check we weren't woken up to be cancelled + pthread_testcancel_unlock( (pthread_mutex_t *)&signal_mutex ); + // If the timeout is actually zero, or we have waited and // timed out, then we must quit with an error. err = EAGAIN; @@ -803,6 +812,9 @@ externC int sigtimedwait (const sigset_ // Special case check for SIGALRM since the fact SIGALRM is masked // would have prevented it being set pending in the alarm handler. check_sigalarm(); + + // check we weren't woken up to be cancelled + pthread_testcancel_unlock( (pthread_mutex_t *)&signal_mutex ); } if( err == 0 ) @@ -1125,5 +1137,7 @@ externC int raise(int sig) } +#endif // ifdef CYGPKG_POSIX_SIGNALS + // ------------------------------------------------------------------------- // EOF signal.cxx
--- a/packages/compat/posix/current/src/time.cxx +++ b/packages/compat/posix/current/src/time.cxx @@ -44,9 +44,12 @@ // //========================================================================== +#include <pkgconf/posix.h> + +#ifdef CYGPKG_POSIX_TIMERS + #include <pkgconf/hal.h> #include <pkgconf/kernel.h> -#include <pkgconf/posix.h> #include <cyg/kernel/ktypes.h> // base kernel types #include <cyg/infra/cyg_trac.h> // tracing macros @@ -605,6 +608,9 @@ externC int nanosleep( const struct time TIME_ENTRY(); + // check for cancellation first. + pthread_testcancel(); + // Fail an invalid timespec if( !valid_timespec( rqtp ) ) TIME_RETURN(EINVAL); @@ -623,8 +629,10 @@ externC int nanosleep( const struct time // Do the delay, keeping track of how long we actually slept for. then = Cyg_Clock::real_time_clock->current_value(); - + self->thread->delay( ticks ); + // check if we were woken up because we were cancelled. + pthread_testcancel(); now = Cyg_Clock::real_time_clock->current_value(); @@ -644,5 +652,7 @@ externC int nanosleep( const struct time TIME_RETURN(0); } +#endif // ifdef CYGPKG_POSIX_TIMERS + // ------------------------------------------------------------------------- // EOF time.cxx
--- a/packages/compat/posix/current/tests/pthread3.c +++ b/packages/compat/posix/current/tests/pthread3.c @@ -32,7 +32,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): nickg -// Contributors: nickg +// Contributors: nickg, jlarmour // Date: 2000-04-10 // Description: Tests POSIX cancellation. // @@ -41,13 +41,14 @@ #include <sys/types.h> #include <pthread.h> +#include <unistd.h> // sleep() #include <cyg/infra/testcase.h> //-------------------------------------------------------------------------- // Thread info -#define NTHREADS 2 +#define NTHREADS 3 char thread_stack[NTHREADS][PTHREAD_STACK_MIN*2]; @@ -55,11 +56,13 @@ pthread_t thread[NTHREADS]; void *pthread_entry1( void *arg); void *pthread_entry2( void *arg); +void *pthread_entry3( void *arg); void *(*pthread_entry[NTHREADS])(void *) = { pthread_entry1, - pthread_entry2 + pthread_entry2, + pthread_entry3 }; //-------------------------------------------------------------------------- @@ -67,6 +70,7 @@ void *(*pthread_entry[NTHREADS])(void *) volatile cyg_bool cancel_handler1_called = false; volatile cyg_bool cancel_handler2_called = false; volatile cyg_bool cancel_handler3_called = false; +volatile cyg_bool thread_ready[NTHREADS]; //-------------------------------------------------------------------------- @@ -129,6 +133,8 @@ void *pthread_entry1( void *arg) pthread_cleanup_push( cancel_handler1, arg ); + thread_ready[0] = true; + function1(); pthread_cleanup_pop( 0 ); @@ -148,6 +154,8 @@ void *pthread_entry2( void *arg) pthread_cleanup_push( cancel_handler3, arg ); + thread_ready[1] = true; + for(;;) sched_yield(); pthread_cleanup_pop( 0 ); @@ -157,6 +165,24 @@ void *pthread_entry2( void *arg) //-------------------------------------------------------------------------- +void *pthread_entry3( void *arg) +{ + int retval = 1; + + CYG_TEST_INFO( "pthread_entry3 entered"); + + pthread_setcanceltype( PTHREAD_CANCEL_DEFERRED, NULL ); + + thread_ready[2] = true; + + // stop in a cancellation point + sleep( 99999 ); + + pthread_exit( (void *)retval ); +} + +//-------------------------------------------------------------------------- + int main(int argc, char **argv) { int i; @@ -182,9 +208,10 @@ int main(int argc, char **argv) } // Let the threads get going - sched_yield(); - sched_yield(); - sched_yield(); + for ( i = 0; i < NTHREADS ; i++ ) { + while ( thread_ready[i] == false ) + sched_yield(); + } // Now cancel them for( i = 0; i < NTHREADS; i++ ) @@ -197,14 +224,13 @@ int main(int argc, char **argv) // check retvals for( i = 0; i < NTHREADS; i++ ) - if( retval[0] != PTHREAD_CANCELED ) - CYG_TEST_FAIL_FINISH( "pthread3" ); + CYG_TEST_CHECK( retval[i] == PTHREAD_CANCELED, + "thread didn't exit with PTHREAD_CANCELED" ); - if( !cancel_handler1_called ) CYG_TEST_FAIL_FINISH( "pthread3" ); - if( !cancel_handler2_called ) CYG_TEST_FAIL_FINISH( "pthread3" ); - if( !cancel_handler3_called ) CYG_TEST_FAIL_FINISH( "pthread3" ); + CYG_TEST_CHECK( cancel_handler1_called, "cancel_handler1 not called" ); + CYG_TEST_CHECK( cancel_handler2_called, "cancel_handler2 not called" ); + CYG_TEST_CHECK( cancel_handler3_called, "cancel_handler3 not called" ); - CYG_TEST_PASS_FINISH( "pthread3" ); }
--- a/packages/compat/posix/current/tests/sigsetjmp.c +++ b/packages/compat/posix/current/tests/sigsetjmp.c @@ -145,7 +145,7 @@ void *pthread_entry1( void *arg) CYG_TEST_INFO( "Thread1: calling pause()"); pause(); - CYG_TEST_INFO( "Thread2: pause() returned"); + CYG_TEST_INFO( "Thread1: pause() returned"); } while(1); CYG_TEST_INFO( "Thread1: calling pthread_exit()");
--- a/packages/devs/eth/arm/edb7xxx/current/ChangeLog +++ b/packages/devs/eth/arm/edb7xxx/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-30 Gary Thomas <gthomas@redhat.com> + + * src/if_edb7xxx.c: New RedBoot config data layout. + 2001-01-01 David Geng <deli.geng@ncl.ac.uk> * src/if_edb7xxx.c (cs8900_start): Set 'txbusy' false after reset
--- a/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c +++ b/packages/devs/eth/arm/edb7xxx/current/src/if_edb7xxx.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -78,7 +78,7 @@ RedBoot_config_option("Network hardware address [MAC]", edb7xxx_esa, ALWAYS_ENABLED, true, - CONFIG_ESA + CONFIG_ESA, 0 ); #endif #endif
--- a/packages/devs/eth/intel/i82559/current/ChangeLog +++ b/packages/devs/eth/intel/i82559/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/if_i82559.c: Added FIXME for promisuous mode. + 2001-01-25 Jesper Skov <jskov@redhat.com> * src/if_i82559.c: Replace CYGNUM_HAL_INTERRUPT_PCI_IRQ with
--- a/packages/devs/eth/intel/i82559/current/src/if_i82559.c +++ b/packages/devs/eth/intel/i82559/current/src/if_i82559.c @@ -75,6 +75,8 @@ // some tweaking - config bits differ slightly but // crucially. // FIXME: EEPROM code not tested on a BE system. +// FIXME: Apparently promiscuous mode cannot be disabled (on +// BE systems?) // //####DESCRIPTIONEND#### //
--- a/packages/devs/eth/powerpc/quicc/current/ChangeLog +++ b/packages/devs/eth/powerpc/quicc/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-30 Gary Thomas <gthomas@redhat.com> + + * src/if_quicc.c: New RedBoot config data layout. + 2001-01-03 Gary Thomas <gthomas@redhat.com> * src/if_quicc.c: Add support in RedBoot to keep ESA (since
--- a/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c +++ b/packages/devs/eth/powerpc/quicc/current/src/if_quicc.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -89,7 +89,7 @@ static unsigned char enaddr[] = { 0x08, RedBoot_config_option("Network hardware address [MAC]", quicc_esa, ALWAYS_ENABLED, true, - CONFIG_ESA + CONFIG_ESA, 0 ); #endif #endif
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/ChangeLog @@ -0,0 +1,128 @@ +2001-02-02 Bart Veer <bartv@redhat.com> + + * cdl/usbs_sa11x0.cdl: + Add doc property to the html + + * doc/usbs_sa11x0.sgml, devs-usbs-sa11x0.html: + Incorporate changes from docs department, regenerate html + +2001-01-25 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0_data.cxx: + * cdl/usbs_sa11x0.cdl: + Devtab entries were never actually being built - and did not + build... + + * cdl/usbs_sa11x0.cdl: + Sort out the dependencies for minimal environments such as + RedBoot. + +2001-01-24 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Invoke additional platform-specific initialization, if defined + via <cyg/hal/hal_io.h> and CYGBLD_HAL_PLATFORM_IO_H + +2001-01-22 Bart Veer <bartv@redhat.com> + + * doc/usbs_sa11x0.sgml, doc/makefile: + Added documentation. + +2001-01-16 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Make sure that the resume interrupt source is enabled, + even when the USB bus is not suspended. For some reason + this makes it possible to disconnect and reconnect. + +2001-01-16 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Use the HAL macros for virtual->physical address translation + Update poll() and start() to match the documentation + Fix the handling of control messages affecting endpoints 1 and 2 + if those endpoints are not currently configured. + + +2001-01-02 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Change ep2_tx_packet() to start the DMA operation after the + UDC packet-complete bit has been set. This avoids a very high + error rate. Add some scheduler locking to eliminate a resulting + race condition, and sort out the error handling to match. + Comment out some assertions relating to spurious interrupts, which + have been observed. Instead the code now recovers from these. + +2000-12-15 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Add debug code for tracking stats and simulating failures. + Change the EP1 code to switch between DMA channels A and B as + required, rather than always using channel A. This is more robust + and was needed for the failure simulation. + + Make the ep1 packet processing code robust in case an unexpected + failure occurs during its invocation. It is not clear how this + can ever happen, but on a couple of occasions it did and caused an + infinite loop. + +2000-11-30 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Fix DMA_CONTROL_CLEAR_ALL constant, it was ignoring START_B + In ep2_init(), separate out the fifo write and the IN_SIZE + write to avoid a hardware problem. + +2000-11-29 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Disable some debugging features and add retries when manipulating + certain DMA registers - needed with some Silicon revisions. + +2000-11-28 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + More rewriting, plus implementing the endpoint halt support. + +2000-11-24 Bart Veer <bartv@redhat.com> + + * src/usbs_sa11x0.c: + Clean up some of the debugging. + Largely rewrite the endpoint 2 support to try and get it working + Transmit a runt packet during initialization to work around + hardware problem. + +2000-11-22 Bart Veer <bartv@redhat.com> + + * include/usbs_sa11x0.h: Fix nested #include protection + +2000-11-21 Bart Veer <bartv@redhat.com> + + * First check-in of eCos USB support. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//===========================================================================
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/cdl/usbs_sa11x0.cdl @@ -0,0 +1,194 @@ +# ==================================================================== +# +# usbs_sa11x0.cdl +# +# SA11X0 USB support. +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): bartv +# Original data: bartv +# Contributors: +# Date: 2000-10-04 +# +#####DESCRIPTIONEND#### +# ==================================================================== + +cdl_package CYGPKG_DEVS_USB_SA11X0 { + display "SA11X0 USB Device Driver" + include_dir "cyg/io/usb" + parent CYGPKG_USB + implements CYGHWR_IO_USB_SLAVE + doc devs-usb-sa11x0.html + + # Make sure that we are running on the right hardware. + requires CYGPKG_HAL_ARM + requires CYGPKG_HAL_ARM_SA11X0 + + + description " + The on-chip serial port 0 on the SA11X0 implements a USB + device controller, facilitating the use of this processor + in USB peripherals. This package provides a suitable eCos + device driver." + + + cdl_option CYGFUN_DEVS_USB_SA11X0_EP0 { + display "Support the control endpoint 0" + default_value CYGINT_IO_USB_SLAVE_CLIENTS + # And the USB support packages + requires CYGPKG_IO_USB CYGPKG_IO_USB_SLAVE + compile usbs_sa11x0.c + compile -library=libextras.a usbs_sa11x0_data.cxx + description " + Enable support for endpoint 0. If this support is disabled + then the entire USB port is unusable." + } + + cdl_option CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY { + display "Provide a devtab entry for endpoint 0" + default_value CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES + requires CYGPKG_IO + description " + If endpoint 0 will only be accessed via the low-level + USB-specific calls then there is no need for an entry + in the device table, saving some memory. If the + application intends to access the endpoint by means + of open and ioctl calls then a devtab entry is needed. + " + } + + cdl_component CYGPKG_DEVS_USB_SA11X0_EP1 { + display "Support endpoint 1, used for host->slave communications" + implements CYGHWR_IO_USB_SLAVE_OUT_ENDPOINTS + requires CYGFUN_DEVS_USB_SA11X0_EP0 + default_value CYGFUN_DEVS_USB_SA11X0_EP0 + description " + In the SA11X0 USB implementation endpoint 1 can only be + used for host->slave communication. If the intended application + only involves slave->host transfers then the support for + endpoint 1 can be disabled. Note that this does not affect + control messages which always go via endpoint 0." + + cdl_option CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL { + display "Control DMA usage for endpoint 1" + flavor booldata + legal_values 0 to 5 + default_value 4 + description " + In the SA11X0 USB implementation endpoint 1 only has + a 20-byte fifo. If the application only involves + small transfers then this may prove sufficient, but + for larger transfers the use of a DMA engine is + mandated. This configuration option allows the + use of DMA engine to be disabled or enabled, and the + specific DMA channel to be selected. The SA11X0 + supports 6 DMA channels numbered 0 to 5. If DMA + is enabled for endpoint 1 then the selected channel + cannot be used by any other code." + } + + cdl_option CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY { + display "Provide a devtab entry for endpoint 1" + default_value CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES + requires CYGPKG_IO + description " + If endpoint 1 will only be accessed via the low-level + USB-specific calls then there is no need for an entry + in the device table, saving some memory. If the + application intends to access the endpoint by means + of open and read calls then a devtab entry is needed. + " + } + } + + cdl_component CYGPKG_DEVS_USB_SA11X0_EP2 { + display "Support endpoint 2, used for slave->host communications" + implements CYGHWR_IO_USB_SLAVE_IN_ENDPOINTS + requires CYGFUN_DEVS_USB_SA11X0_EP0 + default_value CYGFUN_DEVS_USB_SA11X0_EP0 + description " + In the SA11X0 USB implementation endpoint 2 can only be + used for slave->host communication. If the intended application + only involves host->slave transfers then the support for + endpoint 2 can be disabled. Note that this does not affect + control messages which always go via endpoint 0." + + cdl_option CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL { + display "Control DMA usage for endpoint 2" + flavor booldata + legal_values 0 to 5 + default_value 5 + description " + In the SA11X0 USB implementation endpoint 2 only has + a 16-byte fifo. If the application only involves + small transfers then this may prove sufficient, but + for larger transfers the use of a DMA engine is + mandated. This configuration option allows the + use of DMA engine to be disabled or enabled, and the + specific DMA channel to be selected. The SA11X0 + supports 6 DMA channels numbered 0 to 5. If DMA + is enabled for endpoint 2 then the selected channel + cannot be used by any other code." + } + + cdl_option CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY { + display "Provide a devtab entry for endpoint 2" + default_value CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES + requires CYGPKG_IO + description " + If endpoint 2 will only be accessed via the low-level + USB-specific calls then there is no need for an entry + in the device table, saving some memory. If the + application intends to access the endpoint by means + of open and write calls then a devtab entry is needed. + " + } + } + + cdl_option CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME { + display "Base name for devtab entries" + flavor data + active_if { CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY || + CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY || + CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY + } + default_value { "\"/dev/usbs\"" } + description " + If the SA11X0 USB device driver package provides devtab + entries for any of the endpoints then this option gives + control over the names of these entries. By default the + endpoints will be called \"/dev/usbs0c\", \"/dev/usbs1r\" + and \"/dev/usbs2w\" (assuming all three endpoints are + enabled. The common part \"/dev/usbs\" is determined + by this configuration option. It may be necessary to + change this if there are multiple USB slave-side + devices on the target hardware to prevent a name clash. + " + } +}
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/doc/devs-usb-sa11x0.html @@ -0,0 +1,341 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +SA11X0 USB Device Driver</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<H1> +<A +NAME="DEVS-USB-SA11X0"> +SA11X0 USB Device Driver</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN4"> +</A> +<H2> +Name</H2> +SA11X0 USB Support -- Device driver for the on-chip SA11X0 USB device</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN7"> +</A> +<H2> +SA11X0 USB Hardware</H2> +<P> +The Intel StrongARM SA11x0 family of processors is supplied with an +on-chip USB slave device, the UDC (USB Device Controller). This +supports three endpoints. Endpoint 0 can only be used for control +messages. Endpoint 1 can only be used for bulk transfers from host to +peripheral. Endpoint 2 can only be used for bulk transfers from +peripheral to host. Isochronous and interrupt transfers are not +supported.</P> +<DIV +CLASS="CAUTION"> +<P> +</P> +<TABLE +CLASS="CAUTION" +BORDER="1" +WIDTH="100%"> +<TR> +<TD +ALIGN="CENTER"> +<B> +Caution</B> +</TD> +</TR> +<TR> +<TD +ALIGN="LEFT"> +<P> +Different revisions of the SA11x0 silicon have had various problems +with the USB support. The device driver has been tested primarily +against stepping B4 of the SA1110 processor, and may not function as +expected with other revisions. Application developers should obtain +the manufacturer's current errata sheets and specification updates. +The B4 stepping still has a number of problems, but the device driver +can work around these. However there is a penalty in terms of extra +code, extra cpu cycles, and increased dispatch latency because extra +processing is needed at DSR level. Interrupt latency should not be +affected.</P> +<P> +There is one specific problem inherent in the UDC design of which +application developers should be aware: the hardware cannot fully +implement the USB standard for bulk transfers. A bulk transfer +typically consists of some number of full-size 64-byte packets and is +terminated by a packet less than the full size. If the amount of data +transferred is an exact multiple of 64 bytes then this requires a +terminating packet of 0 bytes of data (plus header and checksum). The +SA11x0 USB hardware does not allow a 0-byte packet to be transmitted, +so the device driver is forced to substitute a 1-byte packet and the +host receives more data than expected. Protocol support is needed so +that the appropriate host-side device driver can allow buffer space +for the extra byte, detect when it gets sent, and discard it. +Consequently certain standard USB class protocols cannot be +implemented using the SA11x0, and therefore custom host-side device +drivers will generally have to be provided, rather than re-using +existing ones that understand the standard protocol.</P> +</TD> +</TR> +</TABLE> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN13"> +</A> +<H2> +Endpoint Data Structures</H2> +<P> +The SA11x0 USB device driver can provide up to three data structures +corresponding to the three endpoints: a +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + structure +<TT +CLASS="LITERAL"> +usbs_sa11x0_ep0</TT> +; a +<SPAN +CLASS="STRUCTNAME"> +usbs_rx_endpoint</SPAN> + +<TT +CLASS="LITERAL"> +usbs_sa11x0_ep1</TT> +; and a +<SPAN +CLASS="STRUCTNAME"> +usbs_tx_endpoint</SPAN> + +<TT +CLASS="LITERAL"> +usbs_sa11x0_ep2</TT> +. The header file +<TT +CLASS="FILENAME"> +cyg/io/usb/usbs_sa11x0.h</TT> + +provides declarations for these.</P> +<P> +Not all applications will require support for all the endpoints. For +example, if the intended use of the UDC only involves peripheral to +host transfers then <TT +CLASS="LITERAL"> +usbs_sa11x0_ep1</TT> + is redundant. +The device driver provides configuration options to control the +presence of each endpoint:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +Endpoint 0 is controlled by +<TT +CLASS="LITERAL"> +CYGFUN_DEVS_USB_SA11X0_EP0</TT> +. This defaults to +enabled if there are any higher-level packages that require USB +hardware or if the global preference +<TT +CLASS="LITERAL"> +CYGGLO_IO_USB_SLAVE_APPLICATION</TT> + is enabled, +otherwise it is disabled. Usually this has the desired effect. It may +be necessary to override this in special circumstances, for example if +the target board uses an external USB chip in preference to the UDC +and it is that external chip's device driver that should be used +rather than the on-chip UDC. It is not possible to disable endpoint 0 +and at the same time enable one or both of the other endpoints, since +a USB device is only usable if it can process the standard control +messages.</P> +</LI> +<LI> +<P> +Endpoint 1 is controlled by +<TT +CLASS="LITERAL"> +CYGPKG_DEVS_USB_SA11X0_EP1</TT> +. By default it is +enabled whenever endpoint 0 is enabled, but it can be disabled +manually when not required.</P> +</LI> +<LI> +<P> +Similarly endpoint 2 is controlled by +<TT +CLASS="LITERAL"> +CYGPKG_DEVS_USB_SA11X0_EP2</TT> +. This is also enabled by +default whenever endpoint 0 is enabled, but it can be disabled manually.</P> +</LI> +</OL> +<P> +The SA11X0 USB device driver implements the interface specified by the +common eCos USB Slave Support package. The documentation for that +package should be consulted for further details. There is only one +major deviation: when there is a peripheral to host transfer on +endpoint 2 which is an exact multiple of the bulk transfer packet size +(usually 64 bytes) the device driver has to pad the transfer with one +extra byte. This is because of a hardware limitation: the UDC is +incapable of transmitting 0-byte packets as required by the USB +specification. Higher-level code, including the host-side device +driver, needs to be aware of this and adapt accordingly.</P> +<P> +The device driver assumes a bulk packet size of 64 bytes, so this +value should be used in the endpoint descriptors in the enumeration +data provided by application code. There is experimental code +for running with <A +HREF="devs-usb-sa11x0.html#AEN58"> +DMA disabled</A> +, +in which case the packet size will be 16 bytes rather than 64.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN39"> +</A> +<H2> +Devtab Entries</H2> +<P> +In addition to the endpoint data structures the SA11X0 USB device +driver can also provide devtab entries for each endpoint. This allows +higher-level code to use traditional I/O operations such as +<TT +CLASS="FUNCTION"> +open</TT> +/<TT +CLASS="FUNCTION"> +read</TT> +/<TT +CLASS="FUNCTION"> +write</TT> + +rather than the USB-specific non-blocking functions like +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +. These devtab entries are +optional since they are not always required. The relevant +configuration options are +<TT +CLASS="LITERAL"> +CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY</TT> +, +<TT +CLASS="LITERAL"> +CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY</TT> + and +<TT +CLASS="LITERAL"> +CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY</TT> +. By default +these devtab entries are provided if the global preference +<TT +CLASS="LITERAL"> +CYGGLO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES</TT> + is enabled, +which is usually the case. Obviously a devtab entry for a given +endpoint will only be provided if the underlying endpoint is enabled. +For example, there will not be a devtab entry for endpoint 1 if +<TT +CLASS="LITERAL"> +CYGPKG_DEVS_USB_SA11X0_EP1</TT> + is disabled.</P> +<P> +The names for the three devtab entries are determined by using a +configurable base name and appending <TT +CLASS="LITERAL"> +0c</TT> +, +<TT +CLASS="LITERAL"> +1r</TT> + or <TT +CLASS="LITERAL"> +2w</TT> +. The base name is +determined by the configuration option +<TT +CLASS="LITERAL"> +CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME</TT> + and has a +default value of <TT +CLASS="LITERAL"> +/dev/usbs</TT> +, so the devtab entry for +endpoint 1 would default to <TT +CLASS="LITERAL"> +/dev/usbs1r</TT> +. If the +target hardware involves multiple USB devices then application +developers may have to change the base name to prevent a name clash.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN58"> +</A> +<H2> +DMA Engines</H2> +<P> +The SA11X0 UDC provides only limited fifos for bulk transfers on +endpoints 1 and 2; smaller than the normal 64-byte bulk packet size. +Therefore a typical transfer requires the use of DMA engines. The +SA11x0 provides six DMA engines that can be used for this, and the +endpoints require one each (assuming both endpoints are enabled). At +the time of writing there is no arbitration mechanism to control +access to the DMA engines. By default the device driver will use +DMA engine 4 for endpoint 1 and DMA engine 5 for endpoint 2, and it +assumes that no other code uses these particular engines.</P> +<P> +The exact DMA engines that will be used are determined by the +configuration options +<TT +CLASS="LITERAL"> +CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL</TT> + and +<TT +CLASS="LITERAL"> +CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL</TT> +. These +options have the booldata flavor, allowing the use of DMA to be +disabled completely in addition to controlling which DMA engines are +used. If DMA is disabled then the device driver will attempt to +work purely using the fifos, and the packet size will be limited to +only 16 bytes. This limit should be reflected in the appropriate +endpoint descriptors in the enumeration data. The code for driving the +endpoints without DMA should be considered experimental. At best it +will be suitable only for applications where the amount of data +transferred is relatively small, because four times as many interrupts +will be raised and performance will suffer accordingly.</P> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/doc/usbs_sa11x0.sgml @@ -0,0 +1,233 @@ +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> + +<!-- {{{ Banner --> + +<!-- =============================================================== --> +<!-- --> +<!-- usbs_sa11x0.sgml --> +<!-- --> +<!-- Documentation for the SA11x0 USB Device Driver. --> +<!-- --> +<!-- =============================================================== --> +<!-- ####COPYRIGHTBEGIN#### --> +<!-- --> +<!-- =============================================================== --> +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<!-- =============================================================== --> +<!-- --> +<!-- ####COPYRIGHTEND#### --> +<!-- =============================================================== --> +<!-- #####DESCRIPTIONBEGIN#### --> +<!-- --> +<!-- Author(s): bartv --> +<!-- Contact(s): bartv --> +<!-- Date: 2001/01/11 --> +<!-- Version: 0.01 --> +<!-- --> +<!-- ####DESCRIPTIONEND#### --> +<!-- =============================================================== --> + +<!-- }}} --> + +<refentry id="devs-usb-sa11x0"> +<refmeta> +<refentrytitle>SA11X0 USB Device Driver</refentrytitle> +</refmeta> +<refnamediv> +<refname>SA11X0 USB Support</refname> +<refpurpose>Device driver for the on-chip SA11X0 USB device</refpurpose> +</refnamediv> + +<refsect1><title>SA11X0 USB Hardware</title> +<para> +The Intel StrongARM SA11x0 family of processors is supplied with an +on-chip USB slave device, the UDC (USB Device Controller). This +supports three endpoints. Endpoint 0 can only be used for control +messages. Endpoint 1 can only be used for bulk transfers from host to +peripheral. Endpoint 2 can only be used for bulk transfers from +peripheral to host. Isochronous and interrupt transfers are not +supported. +</para> +<caution> +<para> +Different revisions of the SA11x0 silicon have had various problems +with the USB support. The device driver has been tested primarily +against stepping B4 of the SA1110 processor, and may not function as +expected with other revisions. Application developers should obtain +the manufacturer's current errata sheets and specification updates. +The B4 stepping still has a number of problems, but the device driver +can work around these. However there is a penalty in terms of extra +code, extra cpu cycles, and increased dispatch latency because extra +processing is needed at DSR level. Interrupt latency should not be +affected. +</para> +<para> +There is one specific problem inherent in the UDC design of which +application developers should be aware: the hardware cannot fully +implement the USB standard for bulk transfers. A bulk transfer +typically consists of some number of full-size 64-byte packets and is +terminated by a packet less than the full size. If the amount of data +transferred is an exact multiple of 64 bytes then this requires a +terminating packet of 0 bytes of data (plus header and checksum). The +SA11x0 USB hardware does not allow a 0-byte packet to be transmitted, +so the device driver is forced to substitute a 1-byte packet and the +host receives more data than expected. Protocol support is needed so +that the appropriate host-side device driver can allow buffer space +for the extra byte, detect when it gets sent, and discard it. +Consequently certain standard USB class protocols cannot be +implemented using the SA11x0, and therefore custom host-side device +drivers will generally have to be provided, rather than re-using +existing ones that understand the standard protocol. +</para> +</caution> +</refsect1> + +<refsect1><title>Endpoint Data Structures</title> +<para> +The SA11x0 USB device driver can provide up to three data structures +corresponding to the three endpoints: a +<structname>usbs_control_endpoint</structname> structure +<literal>usbs_sa11x0_ep0</literal>; a +<structname>usbs_rx_endpoint</structname> +<literal>usbs_sa11x0_ep1</literal>; and a +<structname>usbs_tx_endpoint</structname> +<literal>usbs_sa11x0_ep2</literal>. The header file +<filename class="headerfile">cyg/io/usb/usbs_sa11x0.h</filename> +provides declarations for these. +</para> +<para> +Not all applications will require support for all the endpoints. For +example, if the intended use of the UDC only involves peripheral to +host transfers then <literal>usbs_sa11x0_ep1</literal> is redundant. +The device driver provides configuration options to control the +presence of each endpoint: +</para> +<orderedlist> +<listitem> +<para> +Endpoint 0 is controlled by +<literal>CYGFUN_DEVS_USB_SA11X0_EP0</literal>. This defaults to +enabled if there are any higher-level packages that require USB +hardware or if the global preference +<literal>CYGGLO_IO_USB_SLAVE_APPLICATION</literal> is enabled, +otherwise it is disabled. Usually this has the desired effect. It may +be necessary to override this in special circumstances, for example if +the target board uses an external USB chip in preference to the UDC +and it is that external chip's device driver that should be used +rather than the on-chip UDC. It is not possible to disable endpoint 0 +and at the same time enable one or both of the other endpoints, since +a USB device is only usable if it can process the standard control +messages. +</para> +</listitem> +<listitem> +<para> +Endpoint 1 is controlled by +<literal>CYGPKG_DEVS_USB_SA11X0_EP1</literal>. By default it is +enabled whenever endpoint 0 is enabled, but it can be disabled +manually when not required. +</para> +</listitem> +<listitem> +<para> +Similarly endpoint 2 is controlled by +<literal>CYGPKG_DEVS_USB_SA11X0_EP2</literal>. This is also enabled by +default whenever endpoint 0 is enabled, but it can be disabled manually. +</para> +</listitem> +</orderedlist> +<para> +The SA11X0 USB device driver implements the interface specified by the +common eCos USB Slave Support package. The documentation for that +package should be consulted for further details. There is only one +major deviation: when there is a peripheral to host transfer on +endpoint 2 which is an exact multiple of the bulk transfer packet size +(usually 64 bytes) the device driver has to pad the transfer with one +extra byte. This is because of a hardware limitation: the UDC is +incapable of transmitting 0-byte packets as required by the USB +specification. Higher-level code, including the host-side device +driver, needs to be aware of this and adapt accordingly. +</para> +<para> +The device driver assumes a bulk packet size of 64 bytes, so this +value should be used in the endpoint descriptors in the enumeration +data provided by application code. There is experimental code +for running with <link linkend="usbs-sa11x0-dma">DMA disabled</link>, +in which case the packet size will be 16 bytes rather than 64. +</para> +</refsect1> + +<refsect1><title>Devtab Entries</title> +<para> +In addition to the endpoint data structures the SA11X0 USB device +driver can also provide devtab entries for each endpoint. This allows +higher-level code to use traditional I/O operations such as +<function>open</function>/<function>read</function>/<function>write</function> +rather than the USB-specific non-blocking functions like +<function>usbs_start_rx_buffer</function>. These devtab entries are +optional since they are not always required. The relevant +configuration options are +<literal>CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY</literal>, +<literal>CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY</literal> and +<literal>CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY</literal>. By default +these devtab entries are provided if the global preference +<literal>CYGGLO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES</literal> is enabled, +which is usually the case. Obviously a devtab entry for a given +endpoint will only be provided if the underlying endpoint is enabled. +For example, there will not be a devtab entry for endpoint 1 if +<literal>CYGPKG_DEVS_USB_SA11X0_EP1</literal> is disabled. +</para> +<para> +The names for the three devtab entries are determined by using a +configurable base name and appending <literal>0c</literal>, +<literal>1r</literal> or <literal>2w</literal>. The base name is +determined by the configuration option +<literal>CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME</literal> and has a +default value of <literal>/dev/usbs</literal>, so the devtab entry for +endpoint 1 would default to <literal>/dev/usbs1r</literal>. If the +target hardware involves multiple USB devices then application +developers may have to change the base name to prevent a name clash. +</para> +</refsect1> + +<refsect1><title id="usbs-sa11x0-dma">DMA Engines</title> +<para> +The SA11X0 UDC provides only limited fifos for bulk transfers on +endpoints 1 and 2; smaller than the normal 64-byte bulk packet size. +Therefore a typical transfer requires the use of DMA engines. The +SA11x0 provides six DMA engines that can be used for this, and the +endpoints require one each (assuming both endpoints are enabled). At +the time of writing there is no arbitration mechanism to control +access to the DMA engines. By default the device driver will use +DMA engine 4 for endpoint 1 and DMA engine 5 for endpoint 2, and it +assumes that no other code uses these particular engines. +</para> +<para> +The exact DMA engines that will be used are determined by the +configuration options +<literal>CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL</literal> and +<literal>CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL</literal>. These +options have the booldata flavor, allowing the use of DMA to be +disabled completely in addition to controlling which DMA engines are +used. If DMA is disabled then the device driver will attempt to +work purely using the fifos, and the packet size will be limited to +only 16 bytes. This limit should be reflected in the appropriate +endpoint descriptors in the enumeration data. The code for driving the +endpoints without DMA should be considered experimental. At best it +will be suitable only for applications where the amount of data +transferred is relatively small, because four times as many interrupts +will be raised and performance will suffer accordingly. +</para> +</refsect1> + +</refentry> \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/include/usbs_sa11x0.h @@ -0,0 +1,65 @@ +#ifndef CYGONCE_USBS_SA11X0_H +# define CYGONCE_USBS_SA11X0_H +//========================================================================== +// +// include/usbs_sa11x0.h +// +// The interface exported by the SA11X0 USB device driver +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// Purpose: +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <cyg/io/usb/usbs.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The SA11x0 family comes with on-chip USB slave support. This + * provides three endpoints. Endpoint 0 can only be used for control + * messages. Endpoints 1 and 2 can only be used for bulk transfers, + * host->slave for endpoint 1 and slave->host for endpoint 2. + */ +extern usbs_control_endpoint usbs_sa11x0_ep0; +extern usbs_rx_endpoint usbs_sa11x0_ep1; +extern usbs_tx_endpoint usbs_sa11x0_ep2; + +#ifdef __cplusplus +} /* extern "C" { */ +#endif + + +#endif /* CYGONCE_USBS_SA11X0_H */
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/src/usbs_sa11x0.c @@ -0,0 +1,2420 @@ +//========================================================================== +// +// usbs_sa11x0.c +// +// Device driver for the SA11x0 USB port. +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +// This code implements support for the on-chip USB port on the SA11x0 +// family of processors. The code has been developed on the SA1110 and +// may or may not work on other members of the SA11x0 family. There +// have problems with the USB support on certain revisions of the silicon, +// so the errata sheet appropriate to the specific processor being used +// should be consulted. There also appear to be problems which do not +// appear on any errata, which this code attempts to work around. +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> +#include <cyg/infra/cyg_trac.h> +#include <cyg/infra/diag.h> + +#include <pkgconf/hal_arm.h> +#include <pkgconf/devs_usb_sa11x0.h> + +#include <cyg/hal/drv_api.h> +#include <cyg/hal/hal_arch.h> +#include <cyg/hal/hal_io.h> +#include <cyg/hal/hal_cache.h> +#include <cyg/hal/hal_sa11x0.h> +#include <cyg/error/codes.h> + +#include <cyg/io/usb/usb.h> +#include <cyg/io/usb/usbs.h> + +// Debugging support. By default this driver operates mostly at +// DSR level, with the ISR doing a minimal amount of processing. +// However is also possible to run most of the code at thread-level, +// This is subject to some restrictions because the USB standard +// imposes timing constraints, e.g. some control operations such +// as SET-ADDRESS have to complete within 50ms. However it is +// very useful for debugging, specifically it allows you to put +// printf()'s in various places. +// +// Right now these configuration options are not exported to the +// user because running at DSR level is likely to be good enough +// for everybody not actively debugging this code. The options +// could be exported if necessary. +//#define CYGPKG_DEVS_USB_SA11X0_THREAD +#undef CYGPKG_DEVS_USB_SA11X0_THREAD +#ifdef CYGPKG_DEVS_USB_SA11X0_THREAD + // Default stack size should be CYGNUM_HAL_STACK_SIZE_TYPICAL +# define CYGNUM_DEVS_USB_SA11X0_THREAD_STACK_SIZE 4096 +# define CYGNUM_DEVS_USB_SA11X0_THREAD_PRIORITY 7 +# include <cyg/kernel/kapi.h> +#endif + +#if 0 +# define DBG(a) diag_printf a +#else +# define DBG(a) +#endif + +#undef FAILURES +#ifdef FAILURES +static volatile int ep1_failure = 7; +#endif + +#undef STATS +#ifdef STATS +int ep1_receives = 0; +int ep1_errors = 0; +int ep2_transmits = 0; +int ep2_errors = 0; +# define INCR_STAT(a) (a) += 1 +# define SET_STAT(a, b) (a) = (b) +#else +# define INCR_STAT(a) +# define SET_STAT(a, b) +#endif + +// ---------------------------------------------------------------------------- +// Serial port 0 on the SA11x0 provides a USB slave connection (aka a +// USB device controller or UDC). The functionality is somewhat +// limited, there are just three endpoints. +// +// Endpoint 0 can only be used for control messages. It has an 8 byte +// fifo which cannot be connected to a DMA engine. Hence incoming +// control packets have to be limited to 8 bytes by the enumeration +// data. The endpoint has to be managed at a low-level, i.e. the +// incoming request has to be extracted from the fifo, processed, and +// any response put back into the fifo within the permitted USB +// response times. +// +// Endpoint 1 can only be used for host->slave bulk OUT transfers. It +// has a 20 byte receive fifo, and it can be hooked up to any of the +// six DMA engines. Since bulk transfers will typically involve 64 +// byte packets, most applications will require the use of DMA. +// +// Endpoint 2 can only be used for slave-host bulk IN transfers. There +// is a 16 byte transmit fifo so small messages can be transferred in +// software. The fifo can also be hooked up to DMA, which is a more +// likely scenario. +// +// Start with definitions of the hardware. The use of a structure and +// a const base pointer should allow the compiler to do base/offset +// addressing and keep the hardware base address in a register. This +// is better than defining each hardware register via a separate +// address. Although the registers are only a byte wide, the peripheral +// bus only supports word accesses. +// +// The USBS_CONTROL etc. macros allow for an alternative way of +// accessing the hardware if a better approach is presented, without +// having to rewrite all the code. Macros that correspond to registers +// are actually addresses, making it easier in the code to distinguish +// them from bit values: the & and * operators will just cancel out. + +typedef struct usbs_sa11x0_hardware { + volatile int control; + volatile int address; + volatile int out_size; + volatile int in_size; + volatile int ep0_control; + volatile int ep1_control; + volatile int ep2_control; + volatile int ep0_data; + volatile int ep0_write_count; + int dummy1; + volatile int fifo; + int dummy2; + volatile int status; +} usbs_sa11x0_hardware; + +static usbs_sa11x0_hardware* const usbs_sa11x0_base = (usbs_sa11x0_hardware* const) 0x80000000; +#define USBS_CONTROL (&(usbs_sa11x0_base->control)) +#define USBS_ADDRESS (&(usbs_sa11x0_base->address)) +#define USBS_OUT_SIZE (&(usbs_sa11x0_base->out_size)) +#define USBS_IN_SIZE (&(usbs_sa11x0_base->in_size)) +#define EP0_CONTROL (&(usbs_sa11x0_base->ep0_control)) +#define EP1_CONTROL (&(usbs_sa11x0_base->ep1_control)) +#define EP2_CONTROL (&(usbs_sa11x0_base->ep2_control)) +#define EP0_DATA (&(usbs_sa11x0_base->ep0_data)) +#define EP0_WRITE_COUNT (&(usbs_sa11x0_base->ep0_write_count)) +#define EP1_DATA (&(usbs_sa11x0_base->fifo)) +#define EP2_DATA (&(usbs_sa11x0_base->fifo)) +#define USBS_STATUS (&(usbs_sa11x0_base->status)) + +#define CONTROL_DISABLE (1 << 0) +#define CONTROL_ACTIVE (1 << 1) +// The meaning of bit 2 changed, see errata +#define CONTROL_RESUME_INTR (1 << 2) +#define CONTROL_EP0_INTR (1 << 3) +#define CONTROL_EP1_INTR (1 << 4) +#define CONTROL_EP2_INTR (1 << 5) +// The meaning of bit 6 also changed, see errata +#define CONTROL_SUSPEND_INTR (1 << 6) +#define CONTROL_RESET_INTR (1 << 7) + +// Getting the control register settings right is a little bit tricky. +// Bit 0 is the disable bit so touching that is dangerous, and the +// other bits have inverted meanings i.e. 0 enables interrupts. The +// following macro encapsulates this. +#define CONTROL_ALL_INTR 0x00FC +#define CONTROL_INTR_ENABLE(bits) ((~(bits)) & CONTROL_ALL_INTR) +#define CONTROL_INTR_CLEAR(bits) ((bits) & CONTROL_ALL_INTR) + +// All the endpoint interrupt numbers can be handled en masse, +// but some of the endpoints may be disabled. +#if defined(CYGPKG_DEVS_USB_SA11X0_EP1) && defined(CYGPKG_DEVS_USB_SA11X0_EP2) +# define CONTROL_EP_INTR_BITS (CONTROL_EP0_INTR | CONTROL_EP1_INTR | CONTROL_EP2_INTR) +#elif defined(CYGPKG_DEVS_USB_SA11X0_EP1) +# define CONTROL_EP_INTR_BITS (CONTROL_EP0_INTR | CONTROL_EP1_INTR) +#elif defined(CYGPKG_DEVS_USB_SA11X0_EP2) +# define CONTROL_EP_INTR_BITS (CONTROL_EP0_INTR | CONTROL_EP2_INTR) +#else +# define CONTROL_EP_INTR_BITS (CONTROL_EP0_INTR) +#endif + +#define EP0_OUT_READY (1 << 0) +#define EP0_IN_READY (1 << 1) +#define EP0_SENT_STALL (1 << 2) +#define EP0_FORCE_STALL (1 << 3) +#define EP0_DATA_END (1 << 4) +#define EP0_SETUP_END (1 << 5) +#define EP0_SERVICED_OPR (1 << 6) +#define EP0_SERVICED_SETUP_END (1 << 7) + +#define EP1_FIFO_SERVICE (1 << 0) +#define EP1_PACKET_COMPLETE (1 << 1) +#define EP1_PACKET_ERROR (1 << 2) +#define EP1_SENT_STALL (1 << 3) +#define EP1_FORCE_STALL (1 << 4) +#define EP1_FIFO_NOT_EMPTY (1 << 5) + +#define EP2_FIFO_SERVICE (1 << 0) +#define EP2_PACKET_COMPLETE (1 << 1) +#define EP2_PACKET_ERROR (1 << 2) +#define EP2_PACKET_UNDERRUN (1 << 3) +#define EP2_SENT_STALL (1 << 4) +#define EP2_FORCE_STALL (1 << 5) + +#define STATUS_EP0_INTR (1 << 0) +#define STATUS_EP1_INTR (1 << 1) +#define STATUS_EP2_INTR (1 << 2) +#define STATUS_SUSPEND_INTR (1 << 3) +#define STATUS_RESUME_INTR (1 << 4) +#define STATUS_RESET_INTR (1 << 5) + +#define EP0_FIFO_SIZE 8 +#define EP0_MTU 8 + +#define EP1_FIFO_SIZE 20 +#ifdef CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL +# define EP1_MTU 64 +#else +# define EP1_MTU 16 +#endif + +#define EP2_FIFO_SIZE 16 +#ifdef CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL +# define EP2_MTU 64 +#else +# define EP2_MTU 16 +#endif + +#if defined(CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL) || defined(CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL) +typedef struct usbs_sa11x0_dma { + volatile int address; + volatile int control_set; + volatile int control_clear; + volatile int status; + volatile int buf_a_address; // Absolute, not remapped + volatile int buf_a_size; + volatile int buf_b_address; // Absolute, not remapped + volatile int buf_b_size; +} usbs_sa11x0_dma; + +#define DMA_CONTROL_RUN (1 << 0) +#define DMA_CONTROL_INTR_ENABLE (1 << 1) +#define DMA_STATUS_ERROR (1 << 2) +#define DMA_STATUS_DONE_A (1 << 3) +#define DMA_CONTROL_START_A (1 << 4) +#define DMA_STATUS_DONE_B (1 << 5) +#define DMA_CONTROL_START_B (1 << 6) +#define DMA_STATUS_BUFFER_IN_USE (1 << 7) +// All the bits that are useful to clear. BUFFER_IN_USE is read-only. +#define DMA_CONTROL_CLEAR_ALL (DMA_CONTROL_RUN | DMA_CONTROL_INTR_ENABLE | DMA_STATUS_ERROR | \ + DMA_STATUS_DONE_A | DMA_CONTROL_START_A | DMA_STATUS_DONE_B | DMA_CONTROL_START_B) + +// The DMA engines operate eight-bytes at a time. This affects issues +// such as alignment. +#define DMA_BURST_SIZE 8 + +// The DMA engines bypass the cache and MMU, accessing physical +// memory directly. Newer HALS should provide appropriate macros. +#ifndef HAL_VIRT_TO_PHYS_ADDRESS +# error HAL macros for translating between virtual and physical memory are required. +#endif + +// Make absolutely sure that the two endpoints use different +// DMA channels. Right now this check cannot be done easily +// at the CDL level. +# if defined(CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL) && defined(CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL) +# if (CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL == CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL) +# error Different DMA channels must be selected for the two endpoints. +# endif +# endif + +# ifdef CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL +static usbs_sa11x0_dma* const ep1_dma_base = (usbs_sa11x0_dma* const)(0xB0000000 | (0x20 * CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL)); +# define EP1_DMA_ADDRESS (&(ep1_dma_base->address)) +# define EP1_DMA_CONTROL_SET (&(ep1_dma_base->control_set)) +# define EP1_DMA_CONTROL_CLEAR (&(ep1_dma_base->control_clear)) +# define EP1_DMA_STATUS (&(ep1_dma_base->status)) +# define EP1_DMA_BUF_A_ADDRESS (&(ep1_dma_base->buf_a_address)) +# define EP1_DMA_BUF_A_SIZE (&(ep1_dma_base->buf_a_size)) +# define EP1_DMA_BUF_B_ADDRESS (&(ep1_dma_base->buf_b_address)) +# define EP1_DMA_BUF_B_SIZE (&(ep1_dma_base->buf_b_size)) + +// The correct value for the DMA address register is fixed for USB transfers +// See table 11.6 of the SA1110 Advanced Developer's Manual +// Device datum width == 1 byte +// Device burst size == 8 bytes +// Device transfer direction == read (device->memory) +// Endianness is controlled by the ARM architectural HAL package +# ifdef CYGHWR_HAL_ARM_BIGENDIAN +# define EP1_DMA_ADDRESS_VALUE (0x80000A00 | 0x10 | 0x0 | 0x4 | 0x2 | 0x1) +# else +# define EP1_DMA_ADDRESS_VALUE (0x80000A00 | 0x10 | 0x0 | 0x4 | 0x0 | 0x1) +# endif +# endif // EP1_DMA + +# ifdef CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL + +static usbs_sa11x0_dma* const ep2_dma_base = (usbs_sa11x0_dma* const)(0xB0000000 | (0x20 * CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL)); +# define EP2_DMA_ADDRESS (&(ep2_dma_base->address)) +# define EP2_DMA_CONTROL_SET (&(ep2_dma_base->control_set)) +# define EP2_DMA_CONTROL_CLEAR (&(ep2_dma_base->control_clear)) +# define EP2_DMA_STATUS (&(ep2_dma_base->status)) +# define EP2_DMA_BUF_A_ADDRESS (&(ep2_dma_base->buf_a_address)) +# define EP2_DMA_BUF_A_SIZE (&(ep2_dma_base->buf_a_size)) +# define EP2_DMA_BUF_B_ADDRESS (&(ep2_dma_base->buf_b_address)) +# define EP2_DMA_BUF_B_SIZE (&(ep2_dma_base->buf_b_size)) + +# ifdef CYGHWR_HAL_ARM_BIGENDIAN +# define EP2_DMA_ADDRESS_VALUE (0x80000A00 | 0x00 | 0x0 | 0x4 | 0x2 | 0x0) +# else +# define EP2_DMA_ADDRESS_VALUE (0x80000A00 | 0x00 | 0x0 | 0x4 | 0x0 | 0x0) +# endif +# endif // EP2_DMA + +#endif // EP1_DMA || EP2_DMA + +// ---------------------------------------------------------------------------- +// Static data. There is a data structure for each endpoint. The +// implementation is essentially a private class that inherits from +// common classes for control and data endpoints, but device drivers +// are supposed to be written in C so some ugliness is required. +// +// Devtab entries are defined in usbs_sa11x0_data.cxx to make sure +// that the linker does not garbage-collect them. + +// Support for the interrupt handling code. +static cyg_interrupt usbs_sa11x0_intr_data; +static cyg_handle_t usbs_sa11x0_intr_handle; +static volatile int isr_status_bits = 0; + +// Endpoint 0 is always present, this module would not get compiled +// otherwise. +static void usbs_sa11x0_ep0_start(usbs_control_endpoint*); +static void usbs_sa11x0_poll(usbs_control_endpoint*); + +typedef enum ep0_state { + EP0_STATE_IDLE = 0, + EP0_STATE_IN = 1, + EP0_STATE_OUT = 2 +} ep0_state; + +typedef struct ep0_impl { + usbs_control_endpoint common; + ep0_state ep_state; + int length; + int transmitted; +} ep0_impl; + +static ep0_impl ep0 = { + common: + { + state: USBS_STATE_POWERED, // The hardware does not distinguish between detached, attached and powered. + enumeration_data: (usbs_enumeration_data*) 0, + start_fn: &usbs_sa11x0_ep0_start, + poll_fn: &usbs_sa11x0_poll, + interrupt_vector: SA11X0_IRQ_USB_SERVICE_REQUEST, + control_buffer: { 0, 0, 0, 0, 0, 0, 0, 0 }, + state_change_fn: (void (*)(usbs_control_endpoint*, void*, usbs_state_change, int)) 0, + state_change_data: (void*) 0, + standard_control_fn: (usbs_control_return (*)(usbs_control_endpoint*, void*)) 0, + standard_control_data: (void*) 0, + class_control_fn: (usbs_control_return (*)(usbs_control_endpoint*, void*)) 0, + class_control_data: (void*) 0, + vendor_control_fn: (usbs_control_return (*)(usbs_control_endpoint*, void*)) 0, + vendor_control_data: (void*) 0, + reserved_control_fn: (usbs_control_return (*)(usbs_control_endpoint*, void*)) 0, + reserved_control_data: (void*) 0, + buffer: (unsigned char*) 0, + buffer_size: 0, + fill_buffer_fn: (void (*)(usbs_control_endpoint*)) 0, + fill_data: (void*) 0, + fill_index: 0, + complete_fn: (usbs_control_return (*)(usbs_control_endpoint*, int)) 0 + }, + ep_state: EP0_STATE_IDLE, + length: 0, + transmitted: 0 +}; + +extern usbs_control_endpoint usbs_sa11x0_ep0 __attribute__((alias ("ep0"))); + +// Endpoint 1 is optional. If the application only involves control +// messages or only slave->host transfers then the endpoint 1 +// support can be disabled. +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + +typedef struct ep1_impl { + usbs_rx_endpoint common; + int fetched; + cyg_bool using_buf_a; +} ep1_impl; + +static void ep1_start_rx(usbs_rx_endpoint*); +static void ep1_set_halted(usbs_rx_endpoint*, cyg_bool); + +static ep1_impl ep1 = { + common: { + start_rx_fn: &ep1_start_rx, + set_halted_fn: &ep1_set_halted, + complete_fn: (void (*)(void*, int)) 0, + complete_data: (void*) 0, + buffer: (unsigned char*) 0, + buffer_size: 0, + halted: 0, + }, + fetched: 0, + using_buf_a: 0 +}; + +extern usbs_rx_endpoint usbs_sa11x0_ep1 __attribute__((alias ("ep1"))); +#endif + +// Endpoint 2 is optional. If the application only involves control +// messages or only host->slave transfers then the endpoint 2 support +// can be disabled. +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + +typedef struct ep2_impl { + usbs_tx_endpoint common; + int transmitted; + int pkt_size; +} ep2_impl; + +static void ep2_start_tx(usbs_tx_endpoint*); +static void ep2_set_halted(usbs_tx_endpoint*, cyg_bool); + +static ep2_impl ep2 = { + common: { + start_tx_fn: &ep2_start_tx, + set_halted_fn: &ep2_set_halted, + complete_fn: (void (*)(void*, int)) 0, + complete_data: (void*) 0, + buffer: (const unsigned char*) 0, + buffer_size: 0, + halted: 0, + }, + transmitted: 0, + pkt_size: 0 +}; + +extern usbs_tx_endpoint usbs_sa11x0_ep2 __attribute__ ((alias ("ep2"))); + +#endif + +// ---------------------------------------------------------------------------- +// Hardware problem: experiments indicate that manipulating the USB +// controller registers does not always work as expected. The control +// fifo is especially badly affected, with e.g. writes just being lost +// completely. It is necessary to work around these problems using +// retry loops. MAX_RETRIES controls the total number of attempts to +// access a register. MAX_CHECKS controls the number of times a +// register is checked to determine whether or not the attempt has +// been succesful. These constants are used to access the data fifo, +// so MAX_RETRIES has to be > 20 bytes. +#define MAX_RETRIES 32 +#define MAX_CHECKS 8 + +// Write one or more bits to a register. This should result in some +// bits ending up set and other bits ending up clear. Some register +// bits are write-1-to-clear or may have side effects. +static cyg_bool +usbs_sa11x0_poke(volatile int* addr, int value, int should_be_set, int should_be_clear) +{ + cyg_bool result = false; + int retries, checks; + + for (retries = 0; !result && (retries < MAX_RETRIES); retries++) { + *addr = value; + (void) *addr; // The first read is always invalid. + for (checks = 0; !result && (checks < MAX_CHECKS); checks++) { + int current_value = *addr; + if (should_be_set != (should_be_set & current_value)) { + continue; + } + if ((0 != should_be_clear) && (0 != (should_be_clear & current_value))) { + continue; + } + result = true; + } + } + if (!result) { + DBG(("usbs_sa11x0_poke failed: addr %x, value %x, should_be_set %x, should_be_clear %x, actual %x\n", \ + (int) addr, value, should_be_set, should_be_clear, *addr)); + } + return result; +} + +// Write a whole value to a register, rather than just manipulating +// individual bits. +static cyg_bool +usbs_sa11x0_poke_value(volatile int* addr, int value) +{ + cyg_bool result = false; + int retries, checks; + + for (retries = 0; !result && (retries < MAX_RETRIES); retries++) { + *addr = value; + (void) *addr; // The first read is always invalid. + for (checks = 0; !result && (checks < MAX_CHECKS); checks++) { + if (value == *addr) { + result = true; + } + } + } + if (!result) { + DBG(("usbs_sa11x0_poke_value failed: addr %x, value %x, actual %x\n", (int) addr, value, *addr)); + } + return result; +} + + +// ---------------------------------------------------------------------------- +// Control transfers +// +// Endpoint 0 is rather more complicated than the others. This is +// partly due to the nature of the control protocol, for example it is +// bidirectional and transfer sizes are unpredictable. +// +// The USB standard imposes some timing constraints on endpoint 0, see +// section 9.2.6 of the spec. For example the set-address operation is +// supposed to take at most 50ms. In general the timings are reasonably +// generous so no special action is taken here. There could be problems +// when debugging, but that is pretty much inevitable. +// +// It is necessary to maintain a state for the control endpoint, the +// default state being idle. Control operations involve roughly the +// following sequence of events: +// +// 1) the host transmits a special setup token, indicating the start +// of a control operation and possibly cancelling any existing control +// operation that may be in progress. USB peripherals cannot NAK this +// even if they are busy. +// +// 2) the setup operation is followed by an eight-byte packet from the host +// that describes the specific control operation. This fits into the +// SA11X0's eight-byte control fifo. There will be an endpoint 0 +// interrupt with the out-packet-ready bit set. If the setup token +// was sent while a previous control operation was also in progress +// then the setup-end bit will be set as well. +// +// 3) the eight-byte packet is described in section 9.3 of the USB spec. +// The first byte holds three fields, with the top bit indicating the +// direction of subsequent data transfer. There are also two bytes +// specifying the size of the subsequent transfer. Obviously the +// packet also contains information such as the request type. +// +// If the specified size is zero then the endpoint will remain in +// its idle state. Otherwise the endpoint will switch to either +// IN or OUT state, depending on the direction of subsequent +// transfers. +// +// 4) some standard control operations can be handled by the code +// here. Set-address involves poking the address register and +// a change of state. Set-feature and clear-feature on the +// data endpoints can be used in conjunction with endpoint-halt. +// Get-status on the data endpoints tests the halt condition. +// It is also possible for the hardware-specific code to +// implement set-feature, clear-feature and get-status +// for the device as a whole since the SA11x0 always has to +// be self-powered and is incapable of initiating a remote +// wakeup. +// +// Other standard control operations will be handled by the +// application-specific installed handler, if any, or by the +// default handler usbs_handle_standard_control(). Class-specific +// and vendor-specific functions require appropriate handlers to be +// installed as well, If a particular request is not recognized +// then a stall condition should be raised. This will not prevent +// subsequent control operations, just the current one. +// +// Data transfers on endpoint 0 involve at most eight bytes at +// a time. More data will only be accepted if the out-packet-ready +// bit has been cleared via the serviced-opr bit, with the +// hardware nak'ing OUT requests. To send data back to the host +// the FIFO should be filled and then the in-packet-ready bit +// should be set. +// +// It looks like processing all control packets at DSR level should be +// sufficient. During the data phase the hardware will NAK IN and +// OUT requests if the fifo is still empty/full, so timing is not +// an issue. Timing after receipt of the initial control message +// may be more important, e.g. the 50ms upper limit on processing +// the set-address control message, but this should still be ok. +// This decision may have to be re-examined in the light of +// experience. + +// Init may get called during system startup or following a reset. +// During startup no work is needed since the hardware will +// have been reset and everything should be fine. After a reset +// the hardware will also be ok but there may be state information +// in ep0 that needs to be reset. +static void +usbs_sa11x0_ep0_init(void) +{ + if ((EP0_STATE_IDLE != ep0.ep_state) && + ((usbs_control_return (*)(usbs_control_endpoint*, int)) 0 != ep0.common.complete_fn)) { + (*ep0.common.complete_fn)(&ep0.common, -EPIPE); + } + ep0.common.state = USBS_STATE_POWERED; + memset(ep0.common.control_buffer, 0, 8); + ep0.common.buffer = (unsigned char*) 0; + ep0.common.buffer_size = 0; + ep0.common.fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + ep0.common.fill_data = (void*) 0; + ep0.common.fill_index = 0; + ep0.common.complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, int)) 0; + ep0.ep_state = EP0_STATE_IDLE; + ep0.length = 0; + ep0.transmitted = 0; +} + +// The start function is called by higher-level code when things have +// been set up, i.e. the enumeration data is available, appropriate +// handlers have been installed for the different types of control +// messages, and communication with the host is allowed to start. The +// next event that should happen is a reset operation from the host, +// so all other interrupts should be blocked. However it is likely +// that the hardware will detect a suspend state before the reset +// arrives, and hence the reset will act as a resume as well as a +// reset. +static void +usbs_sa11x0_ep0_start(usbs_control_endpoint* endpoint) +{ + CYG_ASSERT( endpoint == &ep0.common, "USB startup involves the wrong endpoint"); + + // Activate the hardware. Write a 0 to the enable/disable bit 0. + // Bit 1 is read-only. The other bits are set to 1 to disable + // the corresponding interrupt source. + usbs_sa11x0_poke(USBS_CONTROL, CONTROL_ALL_INTR, CONTROL_ALL_INTR, 0); + + // If there is additional platform-specific initialization to + // perform, do it now. This macro can come from the platform HAL. +#ifdef SA11X0_USB_PLATFORM_INIT + SA11X0_USB_PLATFORM_INIT; +#endif + + // Clear any pending interrupts. There should not be any, but just + // in case. Note: passing 0x00FF as the should_be_clear argument + // is a race condition, an external event can happen at any time, + // so we may loop unnecessarily and lose an interrupt. However + // the initial reset should last for 10ms. + usbs_sa11x0_poke(USBS_STATUS, 0x00FF, 0x00, 0x00FF); + + // The only interrupt really of interest right now is reset, but + // it is likely to be preceded by a resume. + usbs_sa11x0_poke(USBS_CONTROL, + CONTROL_INTR_ENABLE(CONTROL_RESET_INTR | CONTROL_RESUME_INTR), + 0, + CONTROL_INTR_CLEAR(CONTROL_RESET_INTR | CONTROL_RESUME_INTR)); +} + + +// Filling the fifo with a reply to the host. This can be called +// immediately at the end of a control message, to prepare for +// the next IN token. It will also get called after each subsequent +// IN operation when the fifo has been emptied. +// +// Experiments have indicated serious problems with the control fifo: +// some writes to the fifo just get lost completely. The failure rate +// is sufficiently high that more often than not the host will be +// unable to read all the enumeration data. However, the write-count +// register appears to give a valid indication of the current fifo +// contents. This means the code can retry stuffing a particular byte +// into the fifo until the write-count goes up. + +static void +usbs_sa11x0_ep0_fill_fifo(void) +{ + cyg_bool ok = true; + int filled = 0; + int max; + int fifo_count = *EP0_WRITE_COUNT; + + // The host can interrupt the current control message at any time + // with a new one. In practice this is unlikely, things could get + // rather confused on the host side. However if a control message + // has been received then the fifo should obviously not be filled. + // A new control message is indicated by the SETUP_END bit. + // + // The hardware design means that there is a race condition: the + // new control message can come in at any time, even in the middle + // of filling the fifo. Checking the SETUP_END more often would + // reduce the probability of things getting messed up, but not + // eliminate it. + // + // There is a check for SETUP_END at the start of the DSR, so + // the setting of this bit should have resulted in another ISR + // and another DSR being scheduled. Hence there is no need for + // special action here. + if (0 != (*EP0_CONTROL & EP0_SETUP_END)) { + DBG(("EP0_fill_fifo(), interrupted by SETUP_END\n")); + return; + } + + // There should never be any data in the fifo. Any such data could + // be the remnant of a previous transfer to the host, but that + // should all have gone out already. Alternatively it could be + // incoming data, but that means a new control message. + if (0 != fifo_count) { + DBG(("EP0_fill_fifo(), fifo already contains %d bytes", fifo_count)); + return; + } + + // The IN_READY bit should never be set on entry. It can only get + // set by a previous call to fill_fifo(), and the data should + // have gone out before we get back here. + if (0 != (*EP0_CONTROL & EP0_IN_READY)) { + DBG(("EP0 fill_fifo(), in-packet-ready bit already set, state %x\n", *EP0_CONTROL)); + return; + } + + // Now put up to another eight bytes into the fifo. + max = ((ep0.length - ep0.transmitted) > EP0_FIFO_SIZE) ? EP0_FIFO_SIZE : (ep0.length - ep0.transmitted); + while (ok && (filled < max)) { + if (0 != ep0.common.buffer_size) { + int datum; + int retries, checks; + cyg_bool written; + + datum = *ep0.common.buffer++; + ep0.common.buffer_size--; + written = false; + + for (retries = 0; ok && !written && (retries < MAX_RETRIES); retries++) { + if (filled != *EP0_WRITE_COUNT) { + DBG(("EP0 fill_fifo, inconsistency, written %d but write count %d\n", filled, *EP0_WRITE_COUNT)); + ok = false; + } + *EP0_DATA = datum; + // The write-count may take a few cycles to settle down. + for (checks = 0; !written && (checks < MAX_CHECKS); checks++) { + if (filled < *EP0_WRITE_COUNT) { + filled++; + written = true; + // DBG(("Transferred %d byte (%x) after %d checks, %d retries\n", filled - 1, datum, checks, retries)); + } + } + } + } else if ((void (*)(usbs_control_endpoint*))0 != ep0.common.fill_buffer_fn) { + (*ep0.common.fill_buffer_fn)(&ep0.common); + } else { + break; + } + } + + // At this point either it has proved impossible to fill the fifo, + // e.g. because of a new control message, or up to another eight + // bytes have been sent. + if (!ok) { + if (0 == (EP0_SETUP_END & *EP0_CONTROL)) { + // There is something seriously wrong. + DBG(("ep0_fill_fifo(), failed, only filled %d bytes, status %x\n", filled, *EP0_CONTROL)); + usbs_sa11x0_poke(EP0_CONTROL, EP0_FORCE_STALL, EP0_FORCE_STALL, 0); + } + return; + } + + // The following conditions are possible: + // 1) amount transferred == amount requested, transfer complete. + // 2) amount transferred < amount requested, this fill involved + // <eight bytes, transfer complete by definition of the protocol. + // 3) amount transferred < amount requested but exactly eight + // bytes were sent this time. It will be necessary to send + // another packet of zero bytes to complete the transfer. + ep0.transmitted += filled; + if ((ep0.transmitted == ep0.length) || (filled < EP0_FIFO_SIZE)) { + + ep0.ep_state = EP0_STATE_IDLE; + if ((usbs_control_return (*)(usbs_control_endpoint*, int))0 != ep0.common.complete_fn) { + (void) (*ep0.common.complete_fn)(&ep0.common, 0); + } + ep0.common.buffer = (unsigned char*) 0; + ep0.common.buffer_size = 0; + ep0.common.fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + + // This informs the hardware that the control message has been + // handled. + usbs_sa11x0_poke(EP0_CONTROL, EP0_DATA_END, EP0_DATA_END, 0); + } + // This allows another IN operation to empty the fifo. + usbs_sa11x0_poke(EP0_CONTROL, EP0_IN_READY, EP0_IN_READY, 0); +} + +// Another utility function to empty the fifo. This involves similar +// hardware problems to writing, it is possible to read a byte without +// changing the fifo state so that next time the same byte would be +// read again. Again there is a possible race condition if another +// control message arrives while emptying the fifo. +static int +usbs_sa11x0_ep0_empty_fifo(unsigned char* buf) +{ + int count = *EP0_WRITE_COUNT & 0x00FF; + int emptied = 0; + cyg_bool ok = true; + + CYG_ASSERT( (count >= 0) & (count <= 8), "EP0 write count must be in range"); + + while (ok && (emptied < count)) { + int retries, checks; + cyg_bool read = false; + + for (retries = 0; !read && (retries < MAX_RETRIES); retries++) { + if ((count - emptied) != *EP0_WRITE_COUNT) { + DBG(("EP0_empty_fifo, inconsistency, read %d bytes of %d, but fifo count %d\n", emptied, count, *EP0_WRITE_COUNT)); + ok = false; + } else { + buf[emptied] = *EP0_DATA; + for (checks = 0; !read && (checks < MAX_CHECKS); checks++) { + if ((count - emptied) > *EP0_WRITE_COUNT) { + //DBG(("Read %d byte (%x) after %d checks, %d retries\n", emptied, buf[emptied], checks, retries)); + read = true; + emptied++; + } + } + } + } + if (ok && !read) { + DBG(("EP0 empty fifo, failed to read byte from fifo\n")); + ok = false; + } + } + + return emptied; +} + +// This is where all the hard work happens. It is a very large routine +// for a DSR, but in practice nearly all of it is nested if's and very +// little code actually gets executed. Note that there may be +// invocations of callback functions and the driver has no control +// over how much time those will take, but those callbacks should be +// simple. +static void +usbs_sa11x0_ep0_dsr(void) +{ + int hw_state = *EP0_CONTROL; + + // Handle the stall bits. + // + // Force-stall should not be a problem. It is set by the code here + // if the host needs to be told that the control message was + // unacceptable and is cleared automatically by the hardware after + // the stall is sent. + // + // Sent-stall is set by the hardware following a protocol + // violation, e.g. if there is an IN token when a new control + // message is expected. There is nothing the software can do about + // this. However if we are in the middle of an IN or OUT transfer + // then those are not going to complete successfully. + if (0 != (hw_state & EP0_SENT_STALL)) { + if (EP0_STATE_IDLE != ep0.ep_state) { + if ((usbs_control_return (*)(usbs_control_endpoint*, int))0 != ep0.common.complete_fn) { + (*ep0.common.complete_fn)(&ep0.common, -EIO); + } + ep0.ep_state = EP0_STATE_IDLE; + ep0.common.buffer = (unsigned char*) 0; + ep0.common.buffer_size = 0; + ep0.common.fill_buffer_fn = 0; + ep0.common.complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, int)) 0; + } + usbs_sa11x0_poke(EP0_CONTROL, EP0_SENT_STALL, 0, EP0_SENT_STALL); + } // STALL condition + + // Next, check whether we have received a new control message + // while still busy processing an old one. + if (0 != (hw_state & EP0_SETUP_END)) { + if (EP0_STATE_IDLE != ep0.ep_state) { + if ((usbs_control_return (*)(usbs_control_endpoint*, int)) 0 != ep0.common.complete_fn) { + (*ep0.common.complete_fn)(&ep0.common, -EIO); + } + ep0.ep_state = EP0_STATE_IDLE; + ep0.common.buffer = (unsigned char*) 0; + ep0.common.buffer_size = 0; + ep0.common.fill_buffer_fn = 0; + ep0.common.complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, int)) 0; + } + // We are now back in idle state so the control message will be + // extracted and processed. + usbs_sa11x0_poke(EP0_CONTROL, EP0_SERVICED_SETUP_END, 0, EP0_SETUP_END); + } // Interrupted control transaction + + // The endpoint can be in one of three states: IN, OUT, or IDLE. + // For the first two it should mean that there is more data to be + // transferred, which is pretty straightforward. IDLE means + // that a new control message has arrived. + if ((EP0_STATE_IN == ep0.ep_state) && (0 == (EP0_IN_READY & hw_state))) { + + usbs_sa11x0_ep0_fill_fifo(); + + } else if ((EP0_STATE_OUT == ep0.ep_state) && (0 != (EP0_OUT_READY & hw_state))) { + + // A host->device transfer. Higher level code must have + // provided a suitable buffer. + CYG_ASSERT( (unsigned char*)0 != ep0.common.buffer, "A receive buffer should have been provided" ); + + ep0.transmitted += usbs_sa11x0_ep0_empty_fifo(ep0.common.buffer + ep0.transmitted); + + if (ep0.transmitted != ep0.length) { + // The host is not allowed to send more data than it + // indicated in the original control message, and all + // messages until the last one should be full size. + CYG_ASSERT( ep0.transmitted < ep0.length, "The host must not send more data than expected"); + CYG_ASSERT( 0 == (ep0.transmitted % EP0_FIFO_SIZE), "All OUT packets until the last one should be full-size"); + + usbs_sa11x0_poke(EP0_CONTROL, EP0_SERVICED_OPR, 0, EP0_OUT_READY); + } else { + // The whole transfer is now complete. Invoke the + // completion function, and based on its return value + // either generate a stall or complete the message. + usbs_control_return result; + + CYG_ASSERT( (usbs_control_return (*)(usbs_control_endpoint*, int))0 != ep0.common.complete_fn, \ + "A completion function should be provided for OUT control messages"); + + result = (*ep0.common.complete_fn)(&ep0.common, 0); + ep0.common.buffer = (unsigned char*) 0; + ep0.common.buffer_size = 0; + ep0.common.complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, int)) 0; + + if (USBS_CONTROL_RETURN_HANDLED == result) { + usbs_sa11x0_poke(EP0_CONTROL, + EP0_SERVICED_OPR | EP0_DATA_END, + EP0_DATA_END, + EP0_OUT_READY); + } else { + usbs_sa11x0_poke(EP0_CONTROL, + EP0_SERVICED_OPR | EP0_DATA_END | EP0_FORCE_STALL, + EP0_FORCE_STALL, + EP0_OUT_READY); + } + } + + } else if (0 != (EP0_OUT_READY & hw_state)) { + + int emptied = usbs_sa11x0_ep0_empty_fifo(ep0.common.control_buffer); + + if (8 != emptied) { + // This indicates a serious problem somewhere. Respond by + // stalling. Hopefully the host will take some action that + // sorts out the mess. + usbs_sa11x0_poke(EP0_CONTROL, + EP0_SERVICED_OPR | EP0_DATA_END | EP0_FORCE_STALL, + EP0_FORCE_STALL, + EP0_OUT_READY); + + } else { + usbs_control_return result = USBS_CONTROL_RETURN_UNKNOWN; + usb_devreq* req = (usb_devreq*) ep0.common.control_buffer; + int length, direction, protocol, recipient; + + // Now we need to do some decoding of the data. A non-zero + // length field indicates that there will be a subsequent + // IN or OUT phase. The direction is controlled by the + // top bit of the first byte. The protocol is determined + // by other bits of the top byte. + length = (req->length_hi << 8) | req->length_lo; + direction = req->type & USB_DEVREQ_DIRECTION_MASK; + protocol = req->type & USB_DEVREQ_TYPE_MASK; + recipient = req->type & USB_DEVREQ_RECIPIENT_MASK; + +#if 0 + DBG(("ep0, new control request: type %x, code %x\n", req->type, req->request)); + DBG((" %s, length %d, value hi %x lo %x, index hi %x lo %x\n", + (USB_DEVREQ_DIRECTION_OUT == direction) ? "out" : "in", + length, req->value_hi, req->value_lo, req->index_hi, req->index_lo)); +#endif + if (0 != length){ + // Clear the fifo straightaway. There is no harm in + // doing this here. It may or may not do some good. + usbs_sa11x0_poke(EP0_CONTROL, EP0_SERVICED_OPR, 0, EP0_OUT_READY); + } + + if (USB_DEVREQ_TYPE_STANDARD == protocol) { + + // First see if the request can be handled entirely in + // this module. + if (USB_DEVREQ_SET_ADDRESS == req->request) { + // The USB device address should be in value_lo. + // No more data is expected. + int address = req->value_lo; + if ((0 != length) || (address > 127)) { + result = USBS_CONTROL_RETURN_STALL; + } else { + // poke_value() cannot be used here because + // setting the address does not take effect + // until the status phase. + *USBS_ADDRESS = address; + result = USBS_CONTROL_RETURN_HANDLED; + } + } else if (USB_DEVREQ_GET_STATUS == req->request) { + // GET_STATUS on the device as a whole is used to + // check the remote-wakeup and self-powered bits. + // GET_STATUS on an endpoint is used to determine + // the halted condition. + // GET_STATUS on anything else has to be left to + // other code. + if (USB_DEVREQ_RECIPIENT_DEVICE == recipient) { + // The host should expect two bytes back. + if ((2 == length) && (USB_DEVREQ_DIRECTION_IN == direction)) { + ep0.common.control_buffer[0] = 0; // Not self-powered, no remote wakeup + ep0.common.control_buffer[1] = 0; + ep0.common.buffer = ep0.common.control_buffer; + ep0.common.buffer_size = 2; + result = USBS_CONTROL_RETURN_HANDLED; + } else { + result = USBS_CONTROL_RETURN_STALL; + } + + } else if (USB_DEVREQ_RECIPIENT_ENDPOINT == recipient) { + if ((2 == length) && (USB_DEVREQ_DIRECTION_IN == direction)) { + int endpoint = req->index_lo; + if (0 == endpoint) { + // get-status on endpoint 0 is either undefined or always valid. + // endpoint 0 is always up. + ep0.common.control_buffer[0] = 0; + result = USBS_CONTROL_RETURN_HANDLED; + } +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + else if (((USB_DEVREQ_INDEX_DIRECTION_OUT | 1) == endpoint) && + (USBS_STATE_CONFIGURED == (ep0.common.state & USBS_STATE_MASK))) { + + ep0.common.control_buffer[0] = ep1.common.halted; + result = USBS_CONTROL_RETURN_HANDLED; + + } +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + else if (((USB_DEVREQ_INDEX_DIRECTION_IN | 2) == endpoint) && + (USBS_STATE_CONFIGURED == (ep0.common.state & USBS_STATE_MASK))) { + + ep0.common.control_buffer[0] = ep2.common.halted; + result = USBS_CONTROL_RETURN_HANDLED; + + } +#endif + else { + // An invalid endpoint has been specified or the + // endpoint can only be examined in configured state. + result = USBS_CONTROL_RETURN_STALL; + } + if (USBS_CONTROL_RETURN_HANDLED == result) { + ep0.common.control_buffer[1] = 0; + ep0.common.buffer = ep0.common.control_buffer; + ep0.common.buffer_size = 2; + } + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } // Endpoint or device get-status + + } else if (USB_DEVREQ_CLEAR_FEATURE == req->request) { + + // CLEAR_FEATURE operates in much the same way as + // GET_STATUS + if (USB_DEVREQ_RECIPIENT_DEVICE == recipient) { + + // No data should be transferred, and only remote-wakeup can be cleared. + if ((0 != length) || (USB_DEVREQ_FEATURE_DEVICE_REMOTE_WAKEUP != req->value_lo)) { + result = USBS_CONTROL_RETURN_STALL; + } else { + // Clearing remote-wakeup is a no-op. + result = USBS_CONTROL_RETURN_HANDLED; + } + + } else if (USB_DEVREQ_RECIPIENT_ENDPOINT == recipient) { + // The only feature that can be cleared is endpoint-halt, no data should be transferred. + if ((0 != length) || (USB_DEVREQ_FEATURE_ENDPOINT_HALT != req->value_lo)) { + result = USBS_CONTROL_RETURN_STALL; + } else { + int endpoint = req->index_lo; + if (0 == endpoint) { + // Clearing halt on endpoint 0 is always a no-op since that endpoint cannot be halted + } +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + else if (((USB_DEVREQ_INDEX_DIRECTION_OUT | 1) == endpoint) && + (USBS_STATE_CONFIGURED == (ep0.common.state & USBS_STATE_MASK))) { + ep1_set_halted(&ep1.common, false); + result = USBS_CONTROL_RETURN_HANDLED; + + } +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + else if (((USB_DEVREQ_INDEX_DIRECTION_IN | 2) == endpoint) && + (USBS_STATE_CONFIGURED == (ep0.common.state & USBS_STATE_MASK))) { + ep2_set_halted(&ep2.common, false); + result = USBS_CONTROL_RETURN_HANDLED; + + } +#endif + else { + // Invalid endpoint or not in configured state. + result = USBS_CONTROL_RETURN_STALL; + } + } + } // Endpoing or device clear-feature + + } else if (USB_DEVREQ_SET_FEATURE == req->request) { + + // SET_FEATURE also operates in much the same way as + // GET_STATUS + if (USB_DEVREQ_RECIPIENT_DEVICE == recipient) { + + // The only valid feature that can be set is remote-wakeup, + // which is not supported by the hardware. + result = USBS_CONTROL_RETURN_STALL; + + } else if (USB_DEVREQ_RECIPIENT_ENDPOINT == recipient) { + + // Only the halt condition can be set, and no data should be transferred. + // Halting endpoint 0 should probably be disallowed although the + // standard does not explicitly say so. + if ((0 != length) || + (USB_DEVREQ_FEATURE_ENDPOINT_HALT != req->value_lo) || + (USBS_STATE_CONFIGURED != (ep0.common.state & USBS_STATE_MASK))) { + + result = USBS_CONTROL_RETURN_STALL; + + } else { + int endpoint = req->index_lo; + if (0) { + } +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + else if ((USB_DEVREQ_INDEX_DIRECTION_OUT | 1) == endpoint) { + ep1_set_halted(&ep1.common, true); + result = USBS_CONTROL_RETURN_HANDLED; + } +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + else if ((USB_DEVREQ_INDEX_DIRECTION_IN | 2) == endpoint) { + ep2_set_halted(&ep2.common, true); + result = USBS_CONTROL_RETURN_HANDLED; + } +#endif + else { + result = USBS_CONTROL_RETURN_STALL; + } + } + } // Endpoing or device set-feature + } + + // If the result has not been handled yet, pass it to + // the install callback function (if any). + if (USBS_CONTROL_RETURN_UNKNOWN == result) { + if ((usbs_control_return (*)(usbs_control_endpoint*, void*))0 != ep0.common.standard_control_fn) { + result = (*ep0.common.standard_control_fn)(&ep0.common, ep0.common.standard_control_data); + } + } + + // If the result has still not been handled, leave it to + // the default implementation in the USB slave common place. + if (USBS_CONTROL_RETURN_UNKNOWN == result) { + result = usbs_handle_standard_control(&ep0.common); + } + + } else { + // The other three types of control message can be + // handled by similar code. + usbs_control_return (*callback_fn)(usbs_control_endpoint*, void*); + void* callback_arg; + //DBG(("non-standard control request %x", req->request)); + + if (USB_DEVREQ_TYPE_CLASS == protocol) { + callback_fn = ep0.common.class_control_fn; + callback_arg = ep0.common.class_control_data; + } else if (USB_DEVREQ_TYPE_VENDOR == protocol) { + callback_fn = ep0.common.vendor_control_fn; + callback_arg = ep0.common.vendor_control_data; + } else { + callback_fn = ep0.common.reserved_control_fn; + callback_arg = ep0.common.reserved_control_data; + } + + if ((usbs_control_return (*)(usbs_control_endpoint*, void*)) 0 == callback_fn) { + result = USBS_CONTROL_RETURN_STALL; + } else { + result = (*callback_fn)(&ep0.common, callback_arg); + } + } + //DBG(("Control request done, %d\n", result)); + + if (USBS_CONTROL_RETURN_HANDLED != result) { + // This control request cannot be handled. Generate a stall. + usbs_sa11x0_poke(EP0_CONTROL, + EP0_FORCE_STALL | EP0_SERVICED_OPR | EP0_DATA_END, + EP0_FORCE_STALL, + EP0_OUT_READY); + } else { + // The control request has been handled. Is there any more + // data to be transferred? + if (0 == length) { + usbs_sa11x0_poke(EP0_CONTROL, + EP0_SERVICED_OPR | EP0_DATA_END, + EP0_DATA_END, + EP0_OUT_READY); + } else { + // The endpoint should now go into IN or OUT mode while the + // remaining data is transferred. + ep0.transmitted = 0; + ep0.length = length; + if (USB_DEVREQ_DIRECTION_OUT == direction) { + // Wait for the next packet from the host. + ep0.ep_state = EP0_STATE_OUT; + CYG_ASSERT( (unsigned char*) 0 != ep0.common.buffer, "A receive buffer should have been provided"); + CYG_ASSERT( (usbs_control_return (*)(usbs_control_endpoint*, int))0 != ep0.common.complete_fn, \ + "A completion function should be provided for OUT control messages"); + } else { + ep0.ep_state = EP0_STATE_IN; + usbs_sa11x0_ep0_fill_fifo(); + } + } + } // Control message handled + } // Received 8-byte control message + } // Idle state, i.e. control message +} // ep0_dsr + +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 +// ---------------------------------------------------------------------------- +// Endpoint 1 is used for OUT transfers, i.e. receive operations. Only +// the bulk protocol is supported by the hardware. The semantics allow +// for two different modes of operation: higher-level code can ask for +// exactly one or more bulk packets of 64 bytes each, allowing buffer +// requirements to be determined from a header; alternatively the +// rx request can just supply a large buffer. Processing the first +// packet of a larger transfer separately does not introduce any +// special problems at the protocol level. +// +// It is not legal to receive just part of a packet and expect the +// hardware or the driver to buffer the rest. Not all hardware will +// be capable of doing this buffering, and there should not be +// a driver design requirement to provide buffering space. +// +// +// The hardware design for endpoint 1 is flawed in a number of +// respects. The receive fifo is only 20 bytes, less than the packet +// size, so it is essential to use DMA (there is a configuration +// option to allow for communication protocols where packets will +// never exceed 16 bytes, but that is not the normal case). The DMA +// engine is triggered by a receive-fifo-service high-water mark +// bit. DMA transfers operate in bursts of eight bytes. Therefore +// it would make sense if the high-water mark was set when the +// receive fifo contained eight bytes or more. +// +// Instead the high-water mark is set when the fifo contains twelve +// bytes or more. Worse, there is no way of measuring how many bytes +// there are left in the fifo without actually extracting those bytes. +// +// For a full-size 64-byte packet, the first 56 bytes will be +// transferred by DMA and the remainder will remain in the fifo. For a +// partial packet of between 56 and 63 bytes, the first 56 bytes will +// be transferred by DMA and the remainder will remain in the fifo. There +// is no way to distinguish between these scenarios without emptying +// the fifo. +// +// The result is that there is never any point in attempting a DMA +// transfer of more than 56 bytes, and for every endpoint 1 interrupt +// it is necessary to read the remainder from the fifo. This adds +// a lot of software overhead, and it is not clear that DMA is +// particularly useful. It is still necessary because of the limited +// fifo size. +// +// +// Because DMA involves the use of physical rather than virtual +// memory, there are also cache interaction problems. Specifically it +// would be necessary to invalidate cache lines after a DMA transfer +// has completed, but that only works sensibly if the buffer is +// aligned to a cache-line boundary and is a multiple of the +// cache-line size. Imposing such restrictions on higher-level code +// is undesirable. Also the DMA engines have an apparently undocumented +// restriction that the buffer must be eight-byte aligned. +// +// To work around all these problems, the receive code works in terms +// of a small private buffer. After a packet has been received, data +// will be copied from this private buffer to the destination. Obviously +// this copy operation is overhead and, because the code is expected +// to run at DSR level, However the copy operation is limited to at +// most 64 bytes, which is not good but not disastrous either. +// +// For data transfers the entry points are: +// +// 1) ep1_start_rx_packet() - prepare to receive another packet from +// the host. +// 2) ep1_clear_error() - an error condition has occurred (CRC, +// bit-stuffing, fifo overrun). It appears that the only way +// to clear this is to clear the receive-packet-complete bit, +// which unfortunately allows in another packet from the host +// before we are ready for it. Doing anything else while +// the error bit is set does not work, for example it is not +// possible to empty the fifo by hand. +// 3) ep1_process_packet() - a whole packet has been received +// and now needs to be moved into application space. +// +// These three routines are called by the start_rx() routine and +// by the DSR. There are different implementations for DMA and +// non-DMA. +// +// There is another hardware problem: the receive-packet-complete bit +// comes up with the wrong default value, allowing the host to start +// transmitting before the target is ready to receive. Unfortunately +// there is not much that can be done about this: the +// receive-packet-complete bit cannot be set by software and the OUT +// max register has a minimum size of eight bytes. Fortunately for +// many protocols the target-side code has a chance to start a receive +// before the host is allowed to send, so this problem is ignored for +// now. +// +// Another potential problem arises if the host sends more data than +// is expected for a given transfer. It would be possible to address +// this by manipulating the OUT max packet register and getting the +// hardware to generate protocol violation stalls. This would also +// eliminate the need to test for buffer overflows. For now it is +// left to higher-level code to sort it all out. + +#ifdef CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL + +// DMA needs an area of physical memory. To avoid conflicts with +// the cached shadow of this memory, this area needs to start at +// a cache line boundary and there must be padding at the end +// to the next cache line boundary, thus ensuring that the +// processor will not accidentally overwrite the physical +// memory because it is manipulating some other variable. +// +// NOTE: at the time of writing the toolchain has a problem with +// the aligned attribute, so instead the start alignment has +// to be handled in software. + +# define EP1_DMA_MTU 56 +# define EP1_DMA_BUFSIZE ((EP1_DMA_MTU + HAL_DCACHE_LINE_SIZE - 1) - \ + ((EP1_DMA_MTU + HAL_DCACHE_LINE_SIZE - 1) % HAL_DCACHE_LINE_SIZE)) +# define EP1_DMA_ALLOCSIZE (EP1_DMA_BUFSIZE + HAL_DCACHE_LINE_SIZE - 1) + +static unsigned char ep1_dma_data[EP1_DMA_ALLOCSIZE]; + +// This variable cannot be initialized statically, instead it is +// set by ep1_init(). It corresponds to the physical address +// for the buffer. +static unsigned char* ep1_dma_buf; + +static void +ep1_start_rx_packet(void) +{ + int dma_size = EP1_DMA_MTU; + + // This assertion does not always hold: clearing an error condition + // involves the packet-complete bit so another message may have + // started to arrive. + // CYG_ASSERT( 0 == (EP1_FIFO_NOT_EMPTY & *EP1_CONTROL), "The receive fifo should be empty"); + + CYG_ASSERT( 0 == ((DMA_CONTROL_RUN | DMA_CONTROL_START_A) & *EP1_DMA_STATUS), "EP1 DMA should be inactive"); + +#ifdef FAILURES + ep1_failure = (ep1_failure + 1) % 32; + if (0 == ep1_failure) { + dma_size = 8; + } +#endif + + // The full flexibility of the DMA engines is not required here, + // specifically the automatic chaining between buffers A and B. + // Instead always using buffer A is sufficient. To avoid the + // hardware switching to buffer B, an excessive size field is + // used, EP1_MTU rather than EP1_DMA_MTU, and hence the + // DMA transfer will never complete. + // + // With some silicon revisions writing to the DMA registers does + // not always work either, so a retry is in order. Possibly + // some short delays immediately after the clear and before the + // set would be sufficient. + *EP1_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + if (0 == (DMA_STATUS_BUFFER_IN_USE & *EP1_DMA_STATUS)) { + ep1.using_buf_a = true; + usbs_sa11x0_poke_value(EP1_DMA_BUF_A_ADDRESS, (unsigned int) ep1_dma_buf); + usbs_sa11x0_poke_value(EP1_DMA_BUF_A_SIZE, dma_size); + *EP1_DMA_CONTROL_SET = DMA_CONTROL_RUN | DMA_CONTROL_START_A; + } else { + ep1.using_buf_a = false; + usbs_sa11x0_poke_value(EP1_DMA_BUF_B_ADDRESS, (unsigned int) ep1_dma_buf); + usbs_sa11x0_poke_value(EP1_DMA_BUF_B_SIZE, dma_size); + *EP1_DMA_CONTROL_SET = DMA_CONTROL_RUN | DMA_CONTROL_START_B; + } + + // This should not be necessary, but occasionally the equivalent + // operation during ep1_init() fails. Strictly speaking it should + // be calling poke_value(), but the added overheads for that are + // not worthwhile. + *USBS_OUT_SIZE = EP1_MTU - 1; + + // Now allow the host to send the packet. + usbs_sa11x0_poke(EP1_CONTROL, EP1_PACKET_COMPLETE | EP1_SENT_STALL, 0, + EP1_PACKET_COMPLETE | EP1_SENT_STALL | EP1_FORCE_STALL); +} + +// Clear an error condition following a CRC, bit stuffing or overrun +// error. The only reliable way to do this is to halt DMA and clear +// the packet-complete bit. Unfortunately this allows the host to send +// another packet immediately, before start_rx_packet can be called, +// introducing another race condition. The hardware does not appear +// to offer any alternatives. +static void +ep1_clear_error(void) +{ + *EP1_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + usbs_sa11x0_poke(EP1_CONTROL, EP1_PACKET_COMPLETE | EP1_SENT_STALL, 0, + EP1_PACKET_COMPLETE | EP1_PACKET_ERROR | EP1_SENT_STALL | EP1_FORCE_STALL | EP1_FIFO_NOT_EMPTY); + + // Clearing the packet-complete bit may cause the host to send + // another packet, immediately causing another error, so this + // assertion does not hold. + // CYG_ASSERT( 0 == (*EP1_CONTROL & (EP1_PACKET_ERROR | EP1_FIFO_NOT_EMPTY)), "Receive error should have been cleared"); +} + +// A packet has been received. Some of it may still be in the fifo +// and must be extracted by hand. The data then has to copied to +// a higher-level buffer. +static void +ep1_process_packet(void) +{ + // First, work out how much data has been processed by the DMA + // engine. This is the amount originally poked into the size + // register minus its current value. + int pkt_size; + + *EP1_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + if (ep1.using_buf_a) { + pkt_size = EP1_DMA_MTU - *EP1_DMA_BUF_A_SIZE; + } else { + pkt_size = EP1_DMA_MTU - *EP1_DMA_BUF_B_SIZE; + } + + CYG_ASSERT( 0 == (pkt_size % DMA_BURST_SIZE), "DMA transfers must be in multiples of the burst size"); + + // Move these bytes from physical memory to the target buffer. + if ((pkt_size > 0) && ((ep1.fetched + pkt_size) < ep1.common.buffer_size)) { + memcpy(ep1.common.buffer + ep1.fetched, ep1_dma_buf, pkt_size); + } + ep1.fetched += pkt_size; + + // Copy remaining bytes into the target buffer directly. + // The DMA buffer could be used instead, moving the memcpy() + // down and avoiding the need for a buffer overflow check + // inside the loop, but at the cost of accessing physical + // memory every time. That cost is too high. + while (1) { + int status = *EP1_CONTROL; + if ((EP1_PACKET_COMPLETE | EP1_PACKET_ERROR) == ((EP1_PACKET_COMPLETE | EP1_PACKET_ERROR) & status)) { + break; + } else if (0 == (EP1_FIFO_NOT_EMPTY & status)) { + break; + } else { + int datum = *EP1_DATA; + if (ep1.fetched < ep1.common.buffer_size) { + ep1.common.buffer[ep1.fetched] = datum; + } + ep1.fetched++; + } + } +} + +#else + +// Transfers not involving DMA. Obviously these are much simpler +// but restricted to packets of 16 bytes. +static void +ep1_start_rx_packet(void) +{ + // Nothing to be done, just let the host send a packet and it will + // end up in the fifo. + usbs_sa11x0_poke(EP1_CONTROL, EP1_PACKET_COMPLETE | EP1_SENT_STALL, 0, + EP1_PACKET_COMPLETE | EP1_SENT_STALL | EP1_FORCE_STALL); +} + +static void +ep1_clear_error(void) +{ + usbs_sa11x0_poke(EP1_CONTROL, EP1_PACKET_COMPLETE | EP1_SENT_STALL, 0, + EP1_PACKET_COMPLETE | EP1_SENT_STALL | EP1_FORCE_STALL); +} + +static void +ep1_process_packet(void) +{ + while (0 != (*EP1_CONTROL & EP1_FIFO_NOT_EMPTY)) { + int datum = *EP1_DATA; + ep1.fetched++; + if (ep1.fetched < ep1.common.buffer_size) { + ep1.common.buffer[ep1.fetched] = datum; + } + } +} +#endif + +// Complete a transfer. This takes care of invoking the completion +// callback and resetting the buffer. +static void +ep1_rx_complete(int result) +{ + void (*complete_fn)(void*, int) = ep1.common.complete_fn; + void* complete_data = ep1.common.complete_data; + + ep1.common.buffer = (unsigned char*) 0; + ep1.common.buffer_size = 0; + ep1.common.complete_fn = (void (*)(void*, int)) 0; + ep1.common.complete_data = (void*) 0; + + if ((void (*)(void*, int))0 != complete_fn) { + (*complete_fn)(complete_data, result); + } +} + +// Start a transmission. This functionality is overloaded to cope with +// waiting for stalls to complete. +static void +ep1_start_rx(usbs_rx_endpoint* endpoint) +{ + CYG_ASSERT( endpoint == &ep1.common, "USB data transfer involves the wrong endpoint"); + + // Is this endpoint currently stalled? If so then a size of 0 can + // be used to block until the stall condition is clear, anything + // else should result in an immediate callback. + if (ep1.common.halted) { + if (0 != ep1.common.buffer_size) { + ep1_rx_complete(-EAGAIN); + } + } else if (0 == ep1.common.buffer_size) { + // A check to see if the endpoint is halted. It isn't. + ep1_rx_complete(0); + } else { + int status = *EP1_CONTROL; + + // This indicates the start of a transfer. + ep1.fetched = 0; + + // The sent-stall bit may get set by hardware because of + // a protocol violation. If so it must be cleared here. + if (0 != (status & EP1_SENT_STALL)) { + usbs_sa11x0_poke(EP1_CONTROL, EP1_SENT_STALL, 0, EP1_SENT_STALL | EP1_FORCE_STALL); + status = *EP1_CONTROL; + } + + // The bogus initial value for the receive-packet-complete + // bit means that we may start off with an error condition. + if ((EP1_PACKET_COMPLETE | EP1_PACKET_ERROR) == (status & (EP1_PACKET_COMPLETE | EP1_PACKET_ERROR))) { + ep1_clear_error(); + ep1_start_rx_packet(); + } else if (0 != (status & EP1_FIFO_NOT_EMPTY)) { + // No error but data in the fifo. This implies a small + // initial packet, all held in the fifo. +#ifdef CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL + *EP1_DMA_BUF_A_SIZE = EP1_MTU; +#endif + ep1_process_packet(); + ep1_rx_complete(ep1.fetched); + } else { + // Start a new transfer. + ep1_start_rx_packet(); + } + } +} + +static void +ep1_set_halted(usbs_rx_endpoint* endpoint, cyg_bool new_value) +{ + CYG_ASSERT( endpoint == &ep1.common, "USB set-stall operation involves the wrong endpoint"); + + if (ep1.common.halted == new_value) { + return; + } + if (new_value) { + // The endpoint should be stalled. There is a potential race + // condition here with a current transfer. Updating the + // stalled flag means that the dsr will do nothing. + ep1.common.halted = true; + HAL_REORDER_BARRIER(); + + // Now perform the actual stall. If we are in the middle of a + // transfer then the stall bit may not get set for a while, so + // poke() is inappropriate. + *EP1_CONTROL = EP1_FORCE_STALL; + + // And abort any current transfer. + ep1_rx_complete(-EAGAIN); + + } else { + // The stall condition should be cleared. First take care of + // things at the hardware level so that a new transfer is + // allowed. + usbs_sa11x0_poke(EP1_CONTROL, EP1_SENT_STALL, 0, EP1_SENT_STALL | EP1_FORCE_STALL); + + // Now allow new transfers to begin. + ep1.common.halted = false; + ep1_rx_complete(0); + } +} + +// The DSR is invoked following an interrupt. According to the docs an +// endpoint 1 interrupt can only happen if the receive-packet-complete +// bit is set. +static void +usbs_sa11x0_ep1_dsr(void) +{ + int status = *EP1_CONTROL; + + // This assertion does not always hold. During long runs + // spurious interrupts have been observed. + // CYG_ASSERT( 0 != (status & EP1_PACKET_COMPLETE), "ep1 dsr should only be invoked when there is data"); + if (0 == (status & EP1_PACKET_COMPLETE)) { + return; + } + + if (ep1.common.halted) { + // Do nothing. What may have happened is that a transfer + // was in progress when the stall bit was set. The + // set_halted() call above will have taken care of things. + return; + + } + + // The sent-stall bit should never get set, since we always + // accept full-size 64-byte packets. Just in case... + if (0 != (status & EP1_SENT_STALL)) { + DBG(("ep1_dsr(), sent-stall bit\n")); + usbs_sa11x0_poke(EP1_CONTROL, EP1_SENT_STALL, 0, EP1_SENT_STALL | EP1_FORCE_STALL); + } + + // Was there a receive error (CRC, bit-stuffing, fifo-overrun?). + // Whichever bits of the current packet have been received must be + // discarded, and the current packet must be retried. + if (0 != (status & EP1_PACKET_ERROR)) { + INCR_STAT(ep1_errors); + ep1_clear_error(); + ep1_start_rx_packet(); + } else { + // Another packet has been received. Process it, which may + // complete the transfer or it may leave more to be done. + INCR_STAT(ep1_receives); + ep1_process_packet(); + if (0 != (EP1_PACKET_ERROR & *EP1_CONTROL)) { + + CYG_ASSERT( 0, "an error has occurred inside ep1_process_packet()\n"); + + } else if ((ep1.fetched != ep1.common.buffer_size) && (0 == (ep1.fetched % EP1_MTU))) { + ep1_start_rx_packet(); + } else if (ep1.fetched > ep1.common.buffer_size) { + // The host has sent too much data. + ep1_rx_complete(-EMSGSIZE); + } else { +#if 0 + int i; + diag_printf("------------------------------------------------------\n"); + diag_printf("rx: buf %x, total size %d\n", ep1.common.buffer, ep1.fetched); + for (i = 0; (i < ep1.fetched) && (i < 128); i+= 8) { + diag_printf("rx %x %x %x %x %x %x %x %x\n", + ep1.common.buffer[i+0], ep1.common.buffer[i+1], ep1.common.buffer[i+2], ep1.common.buffer[i+3], + ep1.common.buffer[i+4], ep1.common.buffer[i+5], ep1.common.buffer[i+6], ep1.common.buffer[i+7]); + } + diag_printf("------------------------------------------------------\n"); +#endif + ep1_rx_complete(ep1.fetched); + } + } +} + +// Initialization. +// +// This may get called during system start-up or following a reset +// from the host. +static void +usbs_sa11x0_ep1_init(void) +{ +#ifdef CYGNUM_DEVS_USB_SA11X0_EP1_DMA_CHANNEL + // What is the physical address that should be used for + // transfers? + unsigned int phys; + HAL_VIRT_TO_PHYS_ADDRESS( ep1_dma_data, phys); + phys += (HAL_DCACHE_LINE_SIZE - 1); + phys -= (phys % HAL_DCACHE_LINE_SIZE); + CYG_ASSERT( 0 == (phys % HAL_DCACHE_LINE_SIZE), "DMA buffer must be aligned to a cache-line boundary"); + ep1_dma_buf = (unsigned char*)phys; + + // Clear the DMA channel and fix the DMA address register. The + // value is determined above. + *EP1_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + *EP1_DMA_ADDRESS = EP1_DMA_ADDRESS_VALUE; +#endif + + // Always allow the host to send full-size packets. If there is a + // protocol problem and the host sends packets that are too large, + // it will have to be handled at a level above the device driver. + // + // With some silicon revisions reading back the register does not + // work, so poke_value() is not applicable. This may be an issue + // with reset timing. + *USBS_OUT_SIZE = EP1_MTU - 1; + + // Endpoints should never be halted during a start-up. + ep1.common.halted = false; + + // If there has been a reset and there was a receive in progress, + // abort it. This also takes care of sorting out the endpoint + // fields ready for the next rx. + ep1_rx_complete(-EPIPE); +} + +#endif // CYGPKG_DEVS_USB_SA11X0_EP1 + + +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 +// ---------------------------------------------------------------------------- +// Endpoint 2 is used for IN transfers, i.e. transmitting data to the +// host. The code is mostly similar to that for endpoint 1, although +// a little bit simpler (e.g. there is no need to worry about +// buffer overflow, that is the host's problem). +// +// There is a flaw in the hardware design. If the transfer involves an +// exact multiple of 64 bytes then according to the USB spec there +// should be a terminating packet of 0 bytes. However the size of the +// current outgoing packet is determined by the IN_SIZE register and +// that only allows for packets between 1 and 256 bytes - even though +// USB bulk transfers can only go up to 64 bytes. This can be worked +// around at this level by transmitting an extra byte, at the risk of +// upsetting host-side device drivers. Both higher-level and host-side +// code need to be aware of this problem. +// +// Again there appear to be problems with the DMA engine. This time it +// appears that the transmit-fifo-service bit does not always work +// correctly. If you set up a DMA transfer for more than the packet +// size than once the packet has gone out the fifo-service bit just +// remains set, the DMA engine continues to fill the fifo, and the +// data gets lost. Instead DMA can only happen one packet at a time. +// The same issues regarding cache line alignment etc. arise, so +// using a small buffer here is convenient. +// +// 1) process_packet moves a packet from the main transmit buffer +// into the dma buffer. +// 2) start_tx_packet() starts a transfer to the host +// 3) clear_error() copes with error conditions. + +#ifdef CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL +// See the equivalent EP1 DMA definitions. +# define EP2_DMA_MTU 64 +# define EP2_DMA_BUFSIZE ((EP2_DMA_MTU + HAL_DCACHE_LINE_SIZE - 1) - \ + ((EP2_DMA_MTU + HAL_DCACHE_LINE_SIZE - 1) % HAL_DCACHE_LINE_SIZE)) +# define EP2_DMA_ALLOCSIZE (EP2_DMA_BUFSIZE + HAL_DCACHE_LINE_SIZE - 1) + +static unsigned char ep2_dma_data[EP2_DMA_ALLOCSIZE]; +static unsigned char* ep2_dma_buf; + +static void +ep2_process_packet(void) +{ + ep2.pkt_size = ep2.common.buffer_size - ep2.transmitted; + if (ep2.pkt_size > EP2_MTU) { + ep2.pkt_size = EP2_MTU; + } + // Work around the hardware's inability to send a zero-byte packet. + if (0 == ep2.pkt_size) { + ep2.pkt_size = 1; + ep2_dma_buf[0] = 0; + } else { + memcpy(ep2_dma_buf, ep2.common.buffer + ep2.transmitted, ep2.pkt_size); + } +} + +static void +ep2_tx_packet(void) +{ + int dma_size, dma_control_settings; + + // CYG_ASSERT( 0 != (*EP2_CONTROL & EP2_FIFO_SERVICE), "Fifo should be empty"); + + // Halt any DMA that may still be going on (there should not + // be any). Then work out the desired DMA settings for the + // current packet. The DMA engine needs to transfer a multiple + // of the burst size. If the packet size is not a multiple of + // the burst size, this presents a minor problem. The chances + // of an interrupt handler running in time to put the + // remaining bytes into the fifo by hand are not good, so + // instead more data is DMA'd in then is absolutely necessary + // and the surplus bytes will be cleared out during the next + // tx_packet. + // + // A possible optimisation is to detect small packets of + // less than the fifo size and byte-stuff those, bypassing + // DMA. It is not clear that would give any performance benefits. + *EP2_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + + dma_size = ep2.pkt_size + DMA_BURST_SIZE - 1; + dma_size -= (dma_size % DMA_BURST_SIZE); + + CYG_ASSERT(dma_size > 0, "DMA calculations should result in a transfer of at least 8 bytes"); + + // Now clear the fifo, after DMA has stopped. + usbs_sa11x0_poke(EP2_CONTROL, EP2_SENT_STALL, 0, EP2_SENT_STALL); + + // Should we be using buf_a or buf_b for this transfer? + // Getting this wrong means that the DMA engine just idles. + if (0 == (*EP2_DMA_STATUS & DMA_STATUS_BUFFER_IN_USE)) { + usbs_sa11x0_poke_value(EP2_DMA_BUF_A_ADDRESS, (int) ep2_dma_buf); + usbs_sa11x0_poke_value(EP2_DMA_BUF_A_SIZE, dma_size); + dma_control_settings = DMA_CONTROL_RUN | DMA_CONTROL_START_A; + } else { + usbs_sa11x0_poke_value(EP2_DMA_BUF_B_ADDRESS, (int) ep2_dma_buf); + usbs_sa11x0_poke_value(EP2_DMA_BUF_B_SIZE, dma_size); + dma_control_settings = DMA_CONTROL_RUN | DMA_CONTROL_START_B; + } + + // Poke the tx size register while the fifo is clearing. + // This operation must be reliable or the host will get + // confused by funny-sized packets. + usbs_sa11x0_poke_value(USBS_IN_SIZE, ep2.pkt_size - 1); + + // The USB hardware must be updated before the DMA engine + // starts filling the fifo. Otherwise ~48% of outgoing + // packets fail with a DMA underrun. When called from + // start_tx() there is a race condition: if the host + // request comes in before the DMA starts then an + // error interrupt will be raised, to be processed by + // the DSR, and then the DMA engine gets updated again. + // Locking the scheduler eliminates this race. + cyg_drv_dsr_lock(); + usbs_sa11x0_poke(EP2_CONTROL, EP2_PACKET_COMPLETE, 0, EP2_PACKET_COMPLETE | EP2_PACKET_ERROR | EP2_PACKET_UNDERRUN); + *EP2_DMA_CONTROL_SET = dma_control_settings; + cyg_drv_dsr_unlock(); + + // CYG_ASSERT(0 == (*EP2_CONTROL & EP2_FIFO_SERVICE), "DMA engine should have filled up the fifo by now"); +} + +// Clearing an error should be a no-op when DMA is involved. +// In practice clearing the packet-complete bit appears to +// have some desirable effects, at the risk of the host +// getting bogus data. This should only happen when there +// is a real transfer in progress: an error early on is +// likely because the PACKET_COMPLETE bit has a bogus initial +// value. +static void +ep2_clear_error(void) +{ + usbs_sa11x0_poke(EP2_CONTROL, EP2_PACKET_COMPLETE, 0, EP2_PACKET_COMPLETE | EP2_PACKET_ERROR | EP2_PACKET_UNDERRUN); +} + +#else // EP2_DMA + +// When not using DMA, process_packet() is responsible for filling the +// fifo and keeping a shadow copy in a static buffer. clear_error() +// refills the fifo using the shadow copy. tx_packet() starts the +// actual transfer. +static unsigned char ep2_tx_buf[EP2_MTU]; + +static void +ep2_process_packet() +{ + int i; + + // Clear the fifo, just in case. + usbs_sa11x0_poke(EP2_CONTROL, EP2_SENT_STALL, 0, EP2_SENT_STALL); + + ep2.pkt_size = ep2.common.buffer_size - ep2.transmitted; + if (ep2.pkt_size > EP2_MTU) { + ep2.pkt_size = EP2_MTU; + } + if (0 == ep2.pkt_size) { + ep2.pkt_size = 1; + ep2_tx_buf[i] = 0; + *EP2_DATA = 0; + } else { + for (i = 0; i < ep2.pkt_size; i++) { + unsigned int datum = ep2.common.buffer[ep2.transmitted + i]; + ep2_tx_buf[i] = datum; + *EP2_DATA = datum; + } + } +} + +static void +ep2_tx_packet() +{ + usbs_sa11x0_poke_value(USBS_IN_SIZE, ep2.pkt_size - 1); + usbs_sa11x0_poke(EP2_CONTROL, EP2_PACKET_COMPLETE, 0, EP2_PACKET_COMPLETE | EP2_PACKET_ERROR | EP2_PACKET_UNDERRUN); +} + +static void +ep2_clear_error() +{ + int i; + // Clear the fifo, just in case. + usbs_sa11x0_poke(EP2_CONTROL, EP2_SENT_STALL, 0, EP2_SENT_STALL); + for (i = 0; i < ep2.pkt_size; i++) { + *EP2_DATA = ep2_tx_buf[i]; + } +} + +#endif // !EP2_DMA + +// A utility routine for completing a transfer. This takes care of the +// callback as well as resetting the buffer. +static void +ep2_tx_complete(int result) +{ + void (*complete_fn)(void*, int) = ep2.common.complete_fn; + void* complete_data = ep2.common.complete_data; + + ep2.common.buffer = (unsigned char*) 0; + ep2.common.buffer_size = 0; + ep2.common.complete_fn = (void (*)(void*, int)) 0; + ep2.common.complete_data = (void*) 0; + + if ((void (*)(void*, int))0 != complete_fn) { + (*complete_fn)(complete_data, result); + } +} + + +// The exported interface to start a transmission. +static void +ep2_start_tx(usbs_tx_endpoint* endpoint) +{ + CYG_ASSERT( endpoint == &ep2.common, "USB data transfer involves the wrong endpoint"); + + // Is this endpoint currently stalled? If so then a size of 0 can + // be used to block until the stall condition is clear, anything + // else should result in an immediate callback. + if (ep2.common.halted) { + if (0 != ep2.common.buffer_size) { + ep2_tx_complete(-EAGAIN); + } + } else if (0 == ep2.common.buffer_size) { + // A check to see if the endpoint is halted. It isn't. + ep2_tx_complete(0); + } else { + // There should not be any errors at the start of a + // transmission, but if there is one then there is no safe way + // to recover. process_packet() and tx_packet() will hopefully + // do the right thing. +#if 0 + { + int i; + diag_printf("----------------------------------------------\n"); + diag_printf("ep2_start_tx: buf %x, %d bytes\n", ep2.common.buffer, ep2.common.buffer_size); + for (i = 0; (i < ep2.common.buffer_size) && (i < 128); i+= 8) { + diag_printf("tx: %x %x %x %x %x %x %x %x\n", + ep2.common.buffer[i+0], ep2.common.buffer[i+1], ep2.common.buffer[i+2], ep2.common.buffer[i+3], + ep2.common.buffer[i+4], ep2.common.buffer[i+5], ep2.common.buffer[i+6], ep2.common.buffer[i+7]); + } + diag_printf("----------------------------------------------\n"); + } +#endif + + // Prepare the first packet for transmission, then send it. + ep2.transmitted = 0; + ep2_process_packet(); + ep2_tx_packet(); + } +} + +static void +ep2_set_halted(usbs_tx_endpoint* endpoint, cyg_bool new_value) +{ + CYG_ASSERT(endpoint == &ep2.common, "USB set-stall operation involves the wrong endpoint"); + + if (ep2.common.halted == new_value) { + return; + } + if (new_value) { + // The endpoint should be stalled. There is a potential race + // condition here with the current transfer and DSR invocation. + // Updating the stalled flag means that the DSR will do nothing. + ep2.common.halted = true; + HAL_REORDER_BARRIER(); + + // Now perform the actual stall. This may be delayed by the hardware + // so poke() cannot be used. + *EP2_CONTROL = EP2_FORCE_STALL; + + // And abort any current transfer. + ep2_tx_complete(-EAGAIN); + + } else { + // First take care of the hardware so that a new transfer is + // allowed. Then allow new transfers to begin and inform + // higher-level code. + usbs_sa11x0_poke(EP2_CONTROL, EP2_SENT_STALL, 0, EP2_SENT_STALL | EP2_FORCE_STALL); + ep2.common.halted = false; + ep2_tx_complete(0); + } +} + +// The dsr will be invoked when the transmit-packet-complete bit is +// set. Typically this happens when a packet has been completed +// (surprise surprise) but it can also happen for error conditions. +static void +usbs_sa11x0_ep2_dsr(void) +{ + int status = *EP2_CONTROL; + // This assertion does not always hold - spurious interrupts have + // been observed if you run for a few hours. + // CYG_ASSERT( 0 != (status & EP2_PACKET_COMPLETE), "ep2 dsr should only be invoked when the packet-complete bit is set"); + + if (0 == (status & EP2_PACKET_COMPLETE)) { + // Spurious interrupt, do nothing. + } else if (ep2.common.halted) { + // There is a possible race condition between a packet + // completing and the stalled condition being set. + // set_halted() above does everything that is needed. + } else if (0 == ep2.pkt_size) { + // This can happen because of the initial value for the + // packet-complete bit, allowing the host to retrieve data + // before the target is ready. The correct action is to do + // nothing. + } else if (0 != (status & (EP2_PACKET_ERROR | EP2_PACKET_UNDERRUN))) { + // A transmit error occurred, the details are not important. + INCR_STAT(ep2_errors); + ep2_clear_error(); + ep2_tx_packet(); + } else { + // Another packet has gone out. + INCR_STAT(ep2_transmits); + ep2.transmitted += ep2.pkt_size; + if (ep2.transmitted < ep2.common.buffer_size) { + ep2_process_packet(); + ep2_tx_packet(); + } else { + ep2_tx_complete(ep2.transmitted); + } + } +} + +// Endpoint 2 initialization. +// +// This may be called during system start-up or following a reset +// from the host. +static void +usbs_sa11x0_ep2_init(void) +{ +#ifdef CYGNUM_DEVS_USB_SA11X0_EP2_DMA_CHANNEL + // What is the physical address that should be used for + // transfers? + unsigned int phys; + HAL_VIRT_TO_PHYS_ADDRESS(ep2_dma_data, phys); + phys += (HAL_DCACHE_LINE_SIZE - 1); + phys -= (phys % HAL_DCACHE_LINE_SIZE); + CYG_ASSERT(0 == (phys % HAL_DCACHE_LINE_SIZE), "DMA buffer must be aligned to a cache-line boundary"); + ep2_dma_buf = (unsigned char*) phys; + + // Clear the DMA channel completely, otherwise it may not be + // possible to write the ADDRESS register. Then set the DMA + // address register. The value is determined above. + *EP2_DMA_CONTROL_CLEAR = DMA_CONTROL_CLEAR_ALL; + *EP2_DMA_ADDRESS = EP2_DMA_ADDRESS_VALUE; +#endif + + // Endpoints should never be halted after a reset + ep2.common.halted = false; + + // If there has been a reset and there was a receive in progress, + // abort it. This also takes care of clearing the endpoint + // structure fields. + ep2_tx_complete(-EPIPE); +} + +#endif // CYGPKG_DEVS_USB_SA11X0_EP2 + +// ---------------------------------------------------------------------------- +// Interrupt handling +// +// As much work as possible is deferred to the DSR (or to the debug +// thread). Interrupts for the endpoints are never a problem: the +// variuos packet-complete etc. bits ensure that the endpoints +// remain quiescent until the relevant interrupt has been serviced. +// Suspend and resume are more complicated. A suspend means that +// there has been no activity for 3ms, which should be enough +// time for the whole thing to be handled. A resume means that there +// has been bus activity after a suspend, and again it is infrequent. +// +// Reset appears to be much more complicated. A reset means that the +// host is holding the USB lines to a specific state for 10ms. This is +// detected by the hardware, causing the USB controller to be reset +// (i.e. any pending transfers are discarded, etc.). The reset bit in +// the status register will be set, and an interrupt will be raised. +// Now, in theory the correct thing to do is to process this +// interrupt, block reset interrupts for the duration of these 10ms, +// and wait for further activity such as the control message to set +// the address. +// +// In practice this does not seem to work. Possibly the USB controller +// gets reset continuously while the external reset signal is applied, +// but I have not been able to confirm this. Messing about with the +// reset interrupt control bit causes the system to go off into +// never-never land. 10ms is too short a time to allow for manual +// debugging of what happens. So for now the interrupt source is +// blocked at the interrupt mask level and the dsr will do the +// right thing. This causes a significant number of spurious interrupts +// for the duration of the reset signal and not a lot else can happen. + + +// Perform reset operations on all endpoints that have been +// configured in. It is convenient to keep this in a separate +// routine to allow for polling, where manipulating the +// interrupt controller mask is a bad idea. +static void +usbs_sa11x0_handle_reset(void) +{ + int old_state = ep0.common.state; + + // Any state change must be reported to higher-level code + ep0.common.state = USBS_STATE_DEFAULT; + if ((void (*)(usbs_control_endpoint*, void*, usbs_state_change, int))0 != ep0.common.state_change_fn) { + (*ep0.common.state_change_fn)(&ep0.common, ep0.common.state_change_data, + USBS_STATE_CHANGE_RESET, old_state); + } + + // Reinitialize all the endpoints that have been configured in. + usbs_sa11x0_ep0_init(); +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + usbs_sa11x0_ep1_init(); +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + usbs_sa11x0_ep2_init(); +#endif + + // After a reset we need to handle endpoint interrupts, reset + // interrupts, and suspend interrupts. There should not be a + // resume since we have not suspended, but leaving resume + // interrupts enabled appears to be desirable with some hardware. + // + // With some silicon revisions it appears that a longer delay + // is needed after reset, so this poke() may not work. + if (!usbs_sa11x0_poke(USBS_CONTROL, + CONTROL_INTR_ENABLE(CONTROL_EP_INTR_BITS|CONTROL_RESET_INTR|CONTROL_SUSPEND_INTR|CONTROL_RESUME_INTR), + 0, + CONTROL_INTR_CLEAR(CONTROL_EP_INTR_BITS|CONTROL_RESET_INTR|CONTROL_SUSPEND_INTR|CONTROL_RESUME_INTR))) { + // DBG(("usbs_sa11x0_handle_reset(), update of control register failed, status %x\n", *USBS_STATUS)); + } +} + +// The DSR. This can be invoked directly by poll(), or via the usual +// interrupt subsystem. It acts as per the current value of +// isr_status_bits. If another interrupt goes off while this +// DSR is running, there will be another invocation of the DSR and +// the status bits will be updated. +static void +usbs_sa11x0_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) +{ + int status = 0; + + CYG_ASSERT(SA11X0_IRQ_USB_SERVICE_REQUEST == vector, "USB DSR should only be invoked for USB interrupts" ); + CYG_ASSERT(0 == data, "The SA11X0 USB DSR needs no global data pointer"); + + // There is no atomic swap support, so interrupts have to be + // blocked. It might be possible to do this via the USBS_CONTROL + // register, but at the risk of messing up the status register + // if another interrupt comes in. Blocking interrupts at the + // processor level is less intrusive on the USB code. + + cyg_drv_isr_lock(); + status = isr_status_bits; + isr_status_bits = 0; + cyg_drv_isr_unlock(); + + // Reset is special, since it invalidates everything else. + // If the reset is still ongoing then do not attempt any + // further processing, there will just be another interrupt. + // Otherwise handle_reset() does the hard work. Unmasking + // the interrupt means that another interrupt will occur + // immediately if reset is still asserted, i.e. no threads + // will run, but there is no easy way of triggering action + // at the end of reset. + if (0 != (status & STATUS_RESET_INTR)) { + + int new_status = *USBS_STATUS; + if (0 == (new_status & STATUS_RESET_INTR)) { + usbs_sa11x0_handle_reset(); + } + // This unmask is likely to cause another interrupt immediately + cyg_drv_interrupt_unmask(SA11X0_IRQ_USB_SERVICE_REQUEST); + + } else { + // Process resume first. Ignore any resumes when we are not + // actually suspended yet, this happens mainly during system + // startup. If there has been a state change to suspended + // then we need a matching state change to resumed. + if (0 != (status & STATUS_RESUME_INTR)) { + int old_state = ep0.common.state; + if (0 != (old_state & USBS_STATE_SUSPENDED)) { + ep0.common.state &= ~USBS_STATE_SUSPENDED; + if ((void (*)(usbs_control_endpoint*, void*, usbs_state_change, int))0 != ep0.common.state_change_fn) { + (*ep0.common.state_change_fn)(&ep0.common, ep0.common.state_change_data, + USBS_STATE_CHANGE_RESUMED, old_state); + } + // After a resume, all interrupts should be enabled. + // In theory there is no need to worry about further + // resume interrupts, but strange hardware behaviour + // has been observed if resume interrupts are left + // disabled. + usbs_sa11x0_poke(USBS_CONTROL, + CONTROL_INTR_ENABLE(CONTROL_EP_INTR_BITS|CONTROL_RESET_INTR|CONTROL_SUSPEND_INTR|CONTROL_RESUME_INTR), + 0, + CONTROL_INTR_CLEAR(CONTROL_EP_INTR_BITS|CONTROL_RESET_INTR|CONTROL_SUSPEND_INTR|CONTROL_RESUME_INTR)); + } + } + + // Now process endpoint interrupts. Control operations on + // endpoint 0 may have side effects on the other endpoints + // so it is better to leave them until last. +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + if (0 != (status & STATUS_EP1_INTR)) { + usbs_sa11x0_ep1_dsr(); + } +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + if (0 != (status & STATUS_EP2_INTR)) { + usbs_sa11x0_ep2_dsr(); + } +#endif + if (0 != (status & STATUS_EP0_INTR)) { + usbs_sa11x0_ep0_dsr(); + } + + // Process suspend last, but only if there has not also been + // a resume. A suspend immediately followed by a resume should + // be ignored. A resume immediately followed by a suspend + // would be unfortunate, but suspend means that there has been + // at least 3ms of inactivity so the DSR latency would have + // to be pretty bad. + // + // Total robustness is possible but requires more work in the ISR. + if ((0 != (status & STATUS_SUSPEND_INTR)) && (0 == (status & STATUS_RESUME_INTR))) { + int old_state = ep0.common.state; + ep0.common.state |= USBS_STATE_SUSPENDED; + if ((void (*)(usbs_control_endpoint*, void*, usbs_state_change, int))0 != ep0.common.state_change_fn) { + (*ep0.common.state_change_fn)(&ep0.common, ep0.common.state_change_data, + USBS_STATE_CHANGE_SUSPENDED, old_state); + } + // We are no longer interested in further suspend interrupts, + // which could happen every 3 ms, but resume has become + // very interesting. + usbs_sa11x0_poke(USBS_CONTROL, + CONTROL_INTR_ENABLE(CONTROL_EP_INTR_BITS | CONTROL_RESET_INTR | CONTROL_RESUME_INTR), + 0, + CONTROL_INTR_CLEAR(CONTROL_EP_INTR_BITS | CONTROL_RESET_INTR | CONTROL_RESUME_INTR)); + } + } +} + +// ---------------------------------------------------------------------------- +// Optionally the USB code can do most of its processing in a thread +// rather than in a DSR. +#ifdef CYGPKG_DEVS_USB_SA11X0_THREAD +static unsigned char usbs_sa11x0_thread_stack[CYGNUM_DEVS_USB_SA11X0_THREAD_STACK_SIZE]; +static cyg_thread usbs_sa11x0_thread; +static cyg_handle_t usbs_sa11x0_thread_handle; +static cyg_sem_t usbs_sa11x0_sem; + + +static void +usbs_sa11x0_thread_fn(cyg_addrword_t param) +{ + for (;;) { + cyg_semaphore_wait(&usbs_sa11x0_sem); + usbs_sa11x0_dsr(SA11X0_IRQ_USB_SERVICE_REQUEST, 0, 0); + } + CYG_UNUSED_PARAM(cyg_addrword_t, param); +} + +static void +usbs_sa11x0_thread_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) +{ + CYG_ASSERT( 0 != isr_status_bits, "DSR's should only be scheduled when there is work to do"); + cyg_semaphore_post(&usbs_sa11x0_sem); + + CYG_UNUSED_PARAM(cyg_vector_t, vector); + CYG_UNUSED_PARAM(cyg_ucount32, count); + CYG_UNUSED_PARAM(cyg_addrword_t, data); +} + +#endif + +// ---------------------------------------------------------------------------- +// The interrupt handler. This does as little as possible. +static cyg_uint32 +usbs_sa11x0_isr(cyg_vector_t vector, cyg_addrword_t data) +{ + int old_status_bits = isr_status_bits; + int status_bits; + + CYG_ASSERT(SA11X0_IRQ_USB_SERVICE_REQUEST == vector, "USB ISR should only be invoked for USB interrupts" ); + CYG_ASSERT(0 == data, "The SA11X0 USB ISR needs no global data pointer" ); + + // Read the current status. Reset is special, it means that the + // whole chip has been reset apart from the one bit in the status + // register. Nothing should be done about this until the DSR sets + // the endpoints back to a consistent state and re-enables + // interrupts in the control register. + status_bits = *USBS_STATUS; + + if (0 != (status_bits & STATUS_RESET_INTR)) { + isr_status_bits = STATUS_RESET_INTR; + *USBS_STATUS = status_bits; + cyg_drv_interrupt_mask(SA11X0_IRQ_USB_SERVICE_REQUEST); + } else { + *USBS_STATUS = status_bits; + isr_status_bits |= status_bits; + } + + // Now keep the rest of the system happy. + cyg_drv_interrupt_acknowledge(vector); + return (old_status_bits != isr_status_bits) ? CYG_ISR_CALL_DSR : CYG_ISR_HANDLED; +} + +// ---------------------------------------------------------------------------- +// Polling support. This acts mostly like the interrupt handler: it +// sets the isr status bits and causes the dsr to run. Reset has to be +// handled specially: polling does nothing as long as reset is asserted. + +static void +usbs_sa11x0_poll(usbs_control_endpoint* endpoint) +{ + CYG_ASSERT( endpoint == &ep0.common, "USB poll involves the wrong endpoint"); + + if (0 != (isr_status_bits & STATUS_RESET_INTR)) { + // Reset was detected the last time poll() was invoked. If + // reset is still active, do nothing. Once the reset has + // completed things can continue. + if (0 == (STATUS_RESET_INTR & *USBS_STATUS)) { + isr_status_bits = 0; + usbs_sa11x0_handle_reset(); + } + } else { + isr_status_bits = *USBS_STATUS; + if (0 != (STATUS_RESET_INTR & isr_status_bits)) { + // Reset has just been asserted. Do nothing, just continue + // polling for the duration of the reset signal. + } else if (0 != isr_status_bits) { + usbs_sa11x0_dsr(SA11X0_IRQ_USB_SERVICE_REQUEST, 0, (cyg_addrword_t) 0); + } + } +} + + +// ---------------------------------------------------------------------------- +// Initialization. + +void +usbs_sa11x0_init(void) +{ + // Start by disabling/resetting the hardware. This is easy. + *USBS_CONTROL = CONTROL_DISABLE; + *USBS_CONTROL = CONTROL_DISABLE; + *USBS_CONTROL = CONTROL_DISABLE; + + // The USB bus is now tristated, preventing any communications. + // This is a good thing, the situation should change only when + // higher-level code has provided the enumeration data and done an + // explicit start. + usbs_sa11x0_ep0_init(); +#ifdef CYGPKG_DEVS_USB_SA11X0_EP1 + usbs_sa11x0_ep1_init(); +#endif +#ifdef CYGPKG_DEVS_USB_SA11X0_EP2 + usbs_sa11x0_ep2_init(); +#endif + + // If processing is supposed to happen in a thread rather + // than in DSR, initialize the threads. +#ifdef CYGPKG_DEVS_USB_SA11X0_THREAD + cyg_semaphore_init(&usbs_sa11x0_sem, 0); + cyg_thread_create(CYGNUM_DEVS_USB_SA11X0_THREAD_PRIORITY, + &usbs_sa11x0_thread_fn, + 0, + "SA11X0 USB support", + usbs_sa11x0_thread_stack, + CYGNUM_DEVS_USB_SA11X0_THREAD_STACK_SIZE, + &usbs_sa11x0_thread_handle, + &usbs_sa11x0_thread + ); + cyg_thread_resume(usbs_sa11x0_thread_handle); +#endif + + // It is also possible and desirable to install the interrupt + // handler here, even though there will be no interrupts for a + // while yet. + cyg_drv_interrupt_create(SA11X0_IRQ_USB_SERVICE_REQUEST, + 99, // priority + 0, // data + &usbs_sa11x0_isr, +#ifdef CYGPKG_DEVS_USB_SA11X0_THREAD + &usbs_sa11x0_thread_dsr, +#else + &usbs_sa11x0_dsr, +#endif + &usbs_sa11x0_intr_handle, + &usbs_sa11x0_intr_data); + cyg_drv_interrupt_attach(usbs_sa11x0_intr_handle); + cyg_drv_interrupt_unmask(SA11X0_IRQ_USB_SERVICE_REQUEST); +}
new file mode 100644 --- /dev/null +++ b/packages/devs/usb/sa11x0/current/src/usbs_sa11x0_data.cxx @@ -0,0 +1,165 @@ +//========================================================================== +// +// usbs_sa11x0.c +// +// Static data for the SA11x0 USB device driver +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +// This file contains various objects that should go into extras.o +// rather than libtarget.a, e.g. devtab entries that would normally +// be eliminated by the selective linking. +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <cyg/io/devtab.h> +#include <cyg/io/usb/usbs_sa11x0.h> +#include <pkgconf/devs_usb_sa11x0.h> + +// ---------------------------------------------------------------------------- +// Initialization. The goal here is to call usbs_sa11x0_init() +// early on during system startup, to take care of things like +// registering interrupt handlers etc. which are best done +// during system init. +// +// If the endpoint 0 devtab entry is available then its init() +// function can be used to take care of this. However the devtab +// entries are optional so an alternative mechanism must be +// provided. Unfortunately although it is possible to give +// a C function the constructor attribute, it cannot be given +// an initpri attribute. Instead it is necessary to define a +// dummy C++ class. + +extern "C" void usbs_sa11x0_init(void); + +#ifndef CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY +class usbs_sa11x0_initialization { + public: + usbs_sa11x0_initialization() { + usbs_sa11x0_init(); + } +}; + +static usbs_sa11x0_initialization usbs_sa11x0_init_object CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_IO); +#endif + +// ---------------------------------------------------------------------------- +// The devtab entries. Each of these is optional, many applications +// will want to use the lower-level API rather than go via +// open/read/write/ioctl. + +#ifdef CYGVAR_DEVS_USB_SA11X0_EP0_DEVTAB_ENTRY + +// For endpoint 0 the only legal operations are get_config() and +// set_config(), and these are provided by the common package. + +static bool +usbs_sa11x0_devtab_ep0_init(struct cyg_devtab_entry* tab) +{ + CYG_UNUSED_PARAM(struct cyg_devtab_entry*, tab); + usbs_sa11x0_init(); + return true; +} + +static CHAR_DEVIO_TABLE(usbs_sa11x0_ep0_devtab_functions, + &cyg_devio_cwrite, + &cyg_devio_cread, + &cyg_devio_select, + &usbs_devtab_get_config, + &usbs_devtab_set_config); + +static CHAR_DEVTAB_ENTRY(usbs_sa11x0_ep0_devtab_entry, + CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME "0c", + 0, + &usbs_sa11x0_ep0_devtab_functions, + &usbs_sa11x0_devtab_ep0_init, + 0, + (void*) &usbs_sa11x0_ep0); +#endif + +// ---------------------------------------------------------------------------- +// Common routines for ep1 and ep2. +#if defined(CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY) || defined(CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY) +static bool +usbs_sa11x0_devtab_dummy_init(struct cyg_devtab_entry* tab) +{ + CYG_UNUSED_PARAM(struct cyg_devtab_entry*, tab); + return true; +} +#endif + +// ---------------------------------------------------------------------------- +// ep1 devtab entry. This can only be used for host->slave, so only the +// cread() function makes sense. + +#ifdef CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY + +static CHAR_DEVIO_TABLE(usbs_sa11x0_ep1_devtab_functions, + &cyg_devio_cwrite, + &usbs_devtab_cread, + &cyg_devio_select, + &usbs_devtab_get_config, + &usbs_devtab_set_config); + +static CHAR_DEVTAB_ENTRY(usbs_sa11x0_ep1_devtab_entry, + CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME "1r", + 0, + &usbs_sa11x0_ep1_devtab_functions, + &usbs_sa11x0_devtab_dummy_init, + 0, + (void*) &usbs_sa11x0_ep1); +#endif + +// ---------------------------------------------------------------------------- +// ep2 devtab entry. This can only be used for slave->host, so only +// the cwrite() function makes sense. + +#ifdef CYGVAR_DEVS_USB_SA11X0_EP2_DEVTAB_ENTRY + +static CHAR_DEVIO_TABLE(usbs_sa11x0_ep2_devtab_functions, + &usbs_devtab_cwrite, + &cyg_devio_cread, + &cyg_devio_select, + &usbs_devtab_get_config, + &usbs_devtab_set_config); + +static DEVTAB_ENTRY(usbs_sa11x0_ep2_devtab_entry, + CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME "2w", + 0, + &usbs_sa11x0_ep2_devtab_functions, + &usbs_sa11x0_devtab_dummy_init, + 0, + (void*) &usbs_sa11x0_ep2); + +#endif +
--- a/packages/ecos.db +++ b/packages/ecos.db @@ -122,9 +122,6 @@ package CYGPKG_DEVS_FLASH_INTEL_BOOTBLOC This package contains hardware support for Intel boot block flash memory." } - - - package CYGPKG_DEVS_FLASH_EBSA285 { alias { "FLASH memory support for StrongARM EBSA-285" flash_ebsa285 } directory devs/flash/arm/ebsa285 @@ -164,8 +161,6 @@ package CYGPKG_DEVS_FLASH_ASSABET { This package contains hardware support for FLASH memory on the Intel StrongARM SA-1110 Assabet platform." } - - package CYGPKG_DEVS_FLASH_MBX { alias { "FLASH memory support for Motorola PowerPC/860 MBX" flash_mbx } directory devs/flash/powerpc/mbx @@ -176,7 +171,6 @@ package CYGPKG_DEVS_FLASH_MBX { on the Motorola PowerPC/860 MBX platform." } - package CYGPKG_IO_SERIAL_ARM_EBSA285 { alias { "Intel EBSA285 serial driver" devs_serial_arm_ebsa285 ebsa285_serial_driver } @@ -186,7 +180,6 @@ package CYGPKG_IO_SERIAL_ARM_EBSA285 { description "Intel StrongARM/EBSA285 serial device drivers" } - package CYGPKG_IO_SERIAL_ARM_SA11X0 { alias { "Intel StrongARM SA11x0 serial driver" devs_serial_arm_sa11x0 sa11x0_serial_driver } @@ -271,7 +264,6 @@ package CYGPKG_IO_SERIAL_TX39_JMR3904 { description "TX39 JMR3904 serial device drivers" } - package CYGPKG_IO_SERIAL_MIPS_REF4955 { alias { "TX49 REF4955 serial device drivers" devs_serial_mips_ref4955 ref4955_serial_driver } @@ -281,7 +273,6 @@ package CYGPKG_IO_SERIAL_MIPS_REF4955 { description "TX49 REF4955 serial device drivers" } - package CYGPKG_IO_SERIAL_MIPS_VRC4373 { alias { "VRC4373 serial device drivers" devs_serial_mips_vrc4373 vrc4373_serial_driver } @@ -357,7 +348,6 @@ package CYGPKG_IO_SERIAL_SH_CQ7708 { description "SH3 cq7708 serial device drivers" } - package CYGPKG_IO_SERIAL_V85X_V850 { alias { "NEC V850 serial device drivers" devs_serial_v85x_v850 v850_serial_driver } @@ -400,6 +390,36 @@ package CYGPKG_IO_ETH_DRIVERS { description "Platform independent ethernet support." } +package CYGPKG_IO_USB { + alias { "Generic USB support" usb } + hardware + directory io/usb/common + script usb.cdl + description "Generic USB support" +} + +package CYGPKG_IO_USB_SLAVE { + alias { "Generic USB slave-side support" usbs } + hardware + directory io/usb/slave + script usbs.cdl + description "Generic USB slave-side support" +} + +package CYGPKG_IO_USB_SLAVE_ETH { + alias { "USB slave-side ethernet class drivers" usbs_eth } + directory io/usb/eth/slave + script usbs_eth.cdl + description "Support for USB peripherals that provide an ethernet-class function" +} + +package CYGPKG_DEVS_USB_SA11X0 { + alias { "Device-driver for the SA11X0 on-chip USB support" usb_sa11x0 } + hardware + directory devs/usb/sa11x0 + script usbs_sa11x0.cdl + description "A device driver for the SA11X0 on-chip USB slave port" +} package CYGPKG_NET { alias { "Networking" net } @@ -430,7 +450,6 @@ package CYGPKG_DEVS_ETH_ARM_EDB7XXX { description "Ethernet driver for Cirrus Logic EDB7xxx development boards." } - package CYGPKG_DEVS_ETH_ARM_EBSA285 { alias { "Intel EBSA285 with PRO/100+ ethernet driver" devs_eth_arm_ebsa285 ebsa285_eth_driver } @@ -457,8 +476,6 @@ package CYGPKG_DEVS_ETH_INTEL_I82559 { description "Ethernet driver for Intel 82559 NIC." } - - # Not sure whether this should be "hardware"; if so, it should be mentioned # in all targets that can use it. package CYGPKG_DEVS_ETH_CF { @@ -515,7 +532,6 @@ package CYGPKG_DEVICES_WALLCLOCK_MIPS_RE Toshiba REF4955 board." } - package CYGPKG_DEVICES_WATCHDOG_ARM_AEB { alias { "Watchdog driver for ARM/AEB board" devices_watchdog_aeb device_watchdog_aeb } directory devs/watchdog/arm/aeb @@ -585,7 +601,6 @@ This package provides memory allocator i dynamic memory allocators, including the ISO standard malloc interface. It also contains some sample implementations." } - package CYGPKG_UITRON { alias { "uITRON compatibility" uitron } directory compat/uitron @@ -795,8 +810,6 @@ package CYGPKG_HAL_ARM_EBSA285 { eCos on a Intel EBSA285 StrongARM eval board." } - - package CYGPKG_HAL_ARM_SA11X0 { alias { "Intel SA11X0 Chipset" hal_arm_sa11x0 } directory hal/arm/sa11x0/var @@ -806,6 +819,7 @@ package CYGPKG_HAL_ARM_SA11X0 { The SA11X0 HAL package provides the support needed to run eCos on a Intel StrongARM SA11X0 based systems." } + package CYGPKG_HAL_ARM_SA11X0_ASSABET { alias { "Intel SA1110 Assabet eval board" hal_arm_sa11x0_assabet } directory hal/arm/sa11x0/assabet @@ -815,6 +829,7 @@ package CYGPKG_HAL_ARM_SA11X0_ASSABET { The ASSABET HAL package provides the support needed to run eCos on a Intel StrongARM SA1110 evaulation board (assabet)." } + package CYGPKG_HAL_ARM_SA11X0_BRUTUS { alias { "Intel SA1100 Brutus eval board" hal_arm_sa11x0_brutus } directory hal/arm/sa11x0/brutus @@ -854,7 +869,6 @@ The cma230 HAL package provides the supp CMA230 (ARM7TDMI) or CMA222 (ARM710T) eval board." } - # -------------------------------------------------------------------------- # SH packages package CYGPKG_HAL_SH { @@ -898,6 +912,7 @@ package CYGPKG_HAL_SH_EDK7708 { This SH HAL package provides the support needed to run eCos on a Hitachi SH3 EDK7708 board." } + package CYGPKG_HAL_SH_SH7708_CQ7708 { alias { "CqREEK SH7708 board" hal_sh_cq sh_cq_hal } directory hal/sh/cq7708 @@ -1143,7 +1158,6 @@ package CYGPKG_HAL_MIPS_TX39_JMR3904 { `target sim --board=jmr3904' should be used from inside gdb." } - package CYGPKG_HAL_MIPS_TX49 { alias { "TX49 chip HAL" hal_tx49 tx49_hal tx49_arch_hal } directory hal/mips/tx49/ @@ -1165,8 +1179,6 @@ package CYGPKG_HAL_MIPS_TX49_REF4955 { actual hardware." } - - package CYGPKG_HAL_MIPS_VR4300 { alias { "VR4300 chip HAL" hal_vr4300 vr4300_hal vr4300_arch_hal } directory hal/mips/vr4300/ @@ -1293,6 +1305,7 @@ package CYGPKG_HAL_V85X_V850_CEB { The CEB-V850/SA1 HAL package provides the support needed to run eCos on a Cosmo CEB-V850/SA1 evaluation board." } + # ========================================================================== # -------------------------------------------------------------------------- # ARM targets @@ -1320,6 +1333,7 @@ target aeb { The aeb target provides the packages needed to run eCos on an ARM evaluation board (AEB-1)." } + target ebsa285 { alias { "Intel EBSA285 StrongARM board" ebsa } packages { CYGPKG_HAL_ARM @@ -1335,8 +1349,6 @@ target ebsa285 { eCos on an Intel EBSA285 StrongARM board." } - - target assabet { alias { "Intel StrongARM SA1110 board" assabet } packages { CYGPKG_HAL_ARM @@ -1345,13 +1357,15 @@ target assabet { CYGPKG_IO_SERIAL_ARM_SA11X0 CYGPKG_DEVS_PCMCIA_ASSABET CYGPKG_DEVS_FLASH_ASSABET + CYGPKG_IO_USB + CYGPKG_IO_USB_SLAVE + CYGPKG_DEVS_USB_SA11X0 } description " The assabet target provides the packages needed to run eCos on an Intel StrongARM SA1110 evaluation board." } - target brutus { alias { "Intel StrongARM SA1100 board" brutus } packages { CYGPKG_HAL_ARM @@ -1376,7 +1390,6 @@ target sa1100mm { eCos on an Intel StrongARM SA1100 Multimedia evaluation board." } - target edb7xxx { alias { "Cirrus Logic development board" edb7211 eb7xxx eb7211 } packages { CYGPKG_HAL_ARM @@ -1399,6 +1412,7 @@ target cma230 { The cma230 target provides the packages needed to run eCos on a Cogent CMA230 (ARM7TDMI) or CMA222 (ARM710T) board." } + # -------------------------------------------------------------------------- # SH targets @@ -1416,7 +1430,6 @@ target sh7708 { The sh7708 target provides the packages needed to run eCos on a Hitachi EDK/SH7708 board." } - target cq7708 { alias { "CqREEK SH7708 board" cq7708 } packages { CYGPKG_HAL_SH @@ -1648,14 +1661,15 @@ target stb { # NEC targets target ceb_v850 { - alias { "Cosmo CEB-V850/SA1 board" CEB } + alias { "Cosmo CEB-V850/SA1 board" CEB ceb_v850_sa1 } packages { CYGPKG_HAL_V85X CYGPKG_HAL_V85X_V850 CYGPKG_HAL_V85X_V850_CEB CYGPKG_IO_SERIAL_V85X_V850 } description " -The ceb target provides the packages needed to run eCos on a Cosmo CEB-V850/SA1 -evaluation board." +The ceb_v850 target provides the packages needed to run eCos on a +Cosmo CEB-V850 evaluation board fitted with a V850/SA1." } + # --------------------------------------------------------------------------
--- a/packages/hal/arm/aeb/current/ChangeLog +++ b/packages/hal/arm/aeb/current/ChangeLog @@ -1,3 +1,21 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_aeb.cdl: Respect channel configuration constraints. + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_platform_ints.h: this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_arm_aebC_ram.mlt:
--- a/packages/hal/arm/aeb/current/cdl/hal_arm_aeb.cdl +++ b/packages/hal/arm/aeb/current/cdl/hal_arm_aeb.cdl @@ -99,6 +99,7 @@ cdl_package CYGPKG_HAL_ARM_AEB { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -110,6 +111,7 @@ cdl_package CYGPKG_HAL_ARM_AEB { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/arm/aeb/current/include/hal_platform_ints.h +++ b/packages/hal/arm/aeb/current/include/hal_platform_ints.h @@ -68,4 +68,12 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0 + +//---------------------------------------------------------------------------- +// Reset. +extern void hal_aeb_reset(void); +#define HAL_PLATFORM_RESET() hal_aeb_reset() + +#define HAL_PLATFORM_RESET_ENTRY 0x4018000 + #endif // CYGONCE_HAL_PLATFORM_INTS_H
--- a/packages/hal/arm/aeb/current/include/plf_stub.h +++ b/packages/hal/arm/aeb/current/include/plf_stub.h @@ -72,13 +72,6 @@ externC void cyg_hal_plf_comms_init(void #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS -//---------------------------------------------------------------------------- -// Reset. -extern void hal_aeb_reset(void); -#define HAL_STUB_PLATFORM_RESET() hal_aeb_reset() - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0x4018000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/aeb/current/src/hal_diag.c +++ b/packages/hal/arm/aeb/current/src/hal_diag.c @@ -194,9 +194,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static void cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) @@ -364,7 +361,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Compatibility with older stubs @@ -380,7 +376,7 @@ cyg_hal_plf_comms_init(void) // Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e. // totally stand-alone) system. -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #endif
--- a/packages/hal/arm/arch/current/ChangeLog +++ b/packages/hal/arm/arch/current/ChangeLog @@ -1,3 +1,53 @@ +2001-02-09 Hugo Tyson <hmt@redhat.com> + + * src/vectors.S (UNMAPPED()): Handle CYGHWR_HAL_ROM_VADDR if so + defined; this is used when compiling for a different location from + the base of ROM. hal_platform_setup.h might define it. For + example, if flash is from 0x50000000 upwards (as on SA11x0), and + we are to execute at 0x50040000, then we want the reset vector to + point to 0x0004pqrs - the unmapped ROM address of the code - + rather than 0x0000pqrs, which is the offset into our flash block. + But usually it's not defined, so the behaviour is the obvious. + +2001-02-08 Jesper Skov <jskov@redhat.com> + + * include/arm_vv.h: Removed again, compiler does magic to thumb + function pointers. + * include/hal_arch.h: Same. + +2001-02-07 Jesper Skov <jskov@redhat.com> + + * include/arm_vv.h: Added virtual vector accessor macros that will + properly mangle function pointers in thumb mode. + * include/hal_arch.h: Include arm_vv.h + * src/vectors.S: ctrlc_init can be called for thumb now (but + requires ROM monitor to be built with -mthumb-interwork) + +2001-02-02 Mark Salter <msalter@redhat.com> + + * src/arm_stub.c (__arm_breakinst): New ARM breakpoint insn. + (__thumb_breakinst): New thumb breakpoint insn. + (__is_bsp_syscall): Check for actual SWI number and support + thumb. + + * include/hal_arch.h (HAL_BREAKINST_ADDR): New macro to provide + address of correct breakpoint insn of the given length. + +2001-02-01 Jesper Skov <jskov@redhat.com> + + * src/hal_misc.c: Don't use diag_printf directly (rely on tracing + macros). + +2001-01-31 Mark Salter <msalter@redhat.com> + + * src/vectors.S (FIQ): Fix broken fiq handling. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm.cdl: Get rid of CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + options. They are replaced by the + CYGSEM_HAL_DIAG_MANGLER option. + 2001-01-24 Jonathan Larmour <jlarmour@redhat.com> * src/vectors.S (init_flag): Add explicit alignment, just in case.
--- a/packages/hal/arm/arch/current/cdl/hal_arm.cdl +++ b/packages/hal/arm/arch/current/cdl/hal_arm.cdl @@ -51,11 +51,6 @@ cdl_package CYGPKG_HAL_ARM { necessary to select a specific target platform HAL package." - # This package allows GDB protocol on diag serial device - # to be explicitly controlled, i.e. turned off. - - implements CYGINT_HAL_DIAG_DISABLE_GDB_PROTOCOL_SUPPORTED - compile hal_misc.c context.S arm_stub.c hal_syscall.c # The "-o file" is a workaround for CR100958 - without it the
--- a/packages/hal/arm/arch/current/include/hal_arch.h +++ b/packages/hal/arm/arch/current/include/hal_arch.h @@ -26,7 +26,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -208,6 +208,13 @@ asm volatile (" .globl " #_label_ ";" #define HAL_BREAKINST_TYPE cyg_uint32 #endif // __thumb__ + +extern cyg_uint32 __arm_breakinst; +extern cyg_uint16 __thumb_breakinst; +#define HAL_BREAKINST_ADDR(x) (((x)==2)? \ + ((void*)&__thumb_breakinst) : \ + ((void*)&__arm_breakinst)) + //-------------------------------------------------------------------------- // Thread register state manipulation for GDB support. @@ -350,7 +357,5 @@ externC void hal_idle_thread_action(cyg_ #define CYGARC_HAL_SAVE_GP() #define CYGARC_HAL_RESTORE_GP() -//----------------------------------------------------------------------------- - #endif // CYGONCE_HAL_ARCH_H // End of hal_arch.h
--- a/packages/hal/arm/arch/current/src/arm_stub.c +++ b/packages/hal/arm/arch/current/src/arm_stub.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -77,6 +77,11 @@ #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id #endif +#if defined(CYGNUM_HAL_BREAKPOINT_LIST_SIZE) && (CYGNUM_HAL_BREAKPOINT_LIST_SIZE > 0) +cyg_uint32 __arm_breakinst = HAL_BREAKINST_ARM; +cyg_uint16 __thumb_breakinst = HAL_BREAKINST_THUMB; +#endif + /* Given a trap value TRAP, return the corresponding signal. */ int __computeSignal (unsigned int trap_number) @@ -117,7 +122,16 @@ int __get_trap_number (void) #if defined(CYGSEM_REDBOOT_BSP_SYSCALLS) int __is_bsp_syscall(void) { - return _hal_registers->vector == CYGNUM_HAL_EXCEPTION_INTERRUPT; + unsigned long pc = get_register(PC); + unsigned long cpsr = get_register(PS); // condition codes + + if (_hal_registers->vector == CYGNUM_HAL_EXCEPTION_INTERRUPT) { + if (cpsr & CPSR_THUMB_ENABLE) + return *(unsigned short *)pc == 0xdf18; + else + return *(unsigned *)pc == 0xef180001; + } + return 0; } #endif
--- a/packages/hal/arm/arch/current/src/hal_misc.c +++ b/packages/hal/arm/arch/current/src/hal_misc.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -182,8 +182,6 @@ hal_arch_default_isr(CYG_ADDRWORD vector { CYG_TRACE1(true, "Interrupt: %d", vector); - diag_printf("Spurious Interrupt!!! - vector: %d, data: %x\n", vector, - data); CYG_FAIL("Spurious Interrupt!!!"); return 0; }
--- a/packages/hal/arm/arch/current/src/vectors.S +++ b/packages/hal/arm/arch/current/src/vectors.S @@ -110,10 +110,22 @@ #define PTR(name) \ .##name: .word name +// CYGHWR_HAL_ROM_VADDR is used when compiling for a different location +// from the base of ROM. hal_platform_setup.h might define it. For +// example, if flash is from 0x50000000 upwards (as on SA11x0), and we are +// to execute at 0x50040000, then we want the reset vector to point to +// 0x0004pqrs - the unmapped ROM address of the code - rather than +// 0x0000pqrs, which is the offset into our flash block. +// +// But usually it's not defined, so the behaviour is the obvious. + #ifdef CYGHWR_HAL_ARM_HAS_MMU -#define UNMAPPED(x) ((x)-__exception_handlers) +# ifndef CYGHWR_HAL_ROM_VADDR +# define CYGHWR_HAL_ROM_VADDR __exception_handlers +# endif +# define UNMAPPED(x) ((x)-CYGHWR_HAL_ROM_VADDR) #else -#define UNMAPPED(x) (x) +# define UNMAPPED(x) (x) #endif #define UNMAPPED_PTR(name) \ @@ -331,9 +343,6 @@ 2: mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_IRQ_MODE) msr cpsr,r0 ldr sp,.__exception_stack - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE) - msr cpsr,r0 - ldr sp,.__FIQ_exception_stack mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE) msr cpsr,r0 ldr sp,.__exception_stack @@ -386,16 +395,12 @@ 2: str r2,[r0,#0x24] #endif - // FIXME: The line with the thumb check is a hack, allowing - // the farm to run test. Problem is that virtual vector table - // API needs to be ARM/Thumb consistent. Will fix later. -#if !defined(__thumb__) || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) .extern hal_ctrlc_isr_init bl hal_ctrlc_isr_init #endif -#endif + LED 2 // Run through static constructors @@ -633,14 +638,29 @@ call_exception_handler: .code 32 FIQ: - // Note: I use this exception stack while saving the context because - // the current SP does not seem to be always valid in this CPU mode. - ldr sp,.__FIQ_exception_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} - b handle_IRQ_or_FIQ + // We can get here from supervisor mode or from IRQ mode. + mrs r8,spsr // CPSR at time of interrupt + and r9,r8,#CPSR_MODE_BITS // isolate pre-interrupt mode + cmp r9,#CPSR_IRQ_MODE + bne 1f + // If FIQ interrupted IRQ mode, just return with FIQ disabled. + // The common interrupt handling takes care of the rest. + orr r8,r8,#CPSR_FIQ_DISABLE + msr spsr,r8 + subs pc,lr,#4 + 1: + // If FIQ interrupted supervisor mode, switch to IRQ mode and + // fall through to IRQ handler. + ldr sp,.__exception_stack // get good stack to save lr and spsr + stmdb sp,{r8,lr} + mov r8,#CPSR_IRQ_MODE|CPSR_FIQ_DISABLE|CPSR_IRQ_DISABLE + msr cpsr,r8 // switch to IRQ mode + ldr sp,.__exception_stack // get regs saved in FIQ mode + ldmdb sp,{sp,lr} + msr spsr,sp + + // now it looks like we got an IRQ instead of an FIQ except that + // FIQ is disabled so we don't recurse. IRQ: // Note: I use this exception stack while saving the context because @@ -936,7 +956,6 @@ PTR(__GDB_stack_base) PTR(__GDB_stack) #endif PTR(__startup_stack) -PTR(__FIQ_exception_stack) PTR(__exception_stack) PTR(__undef_exception_stack) PTR(__bss_start) @@ -1009,10 +1028,6 @@ hal_interrupt_objects: .rept 32 .long 0 .endr -__FIQ_exception_stack: - .rept 32 - .long 0 - .endr __exception_stack: .rept 32 .long 0
--- a/packages/hal/arm/cma230/current/ChangeLog +++ b/packages/hal/arm/cma230/current/ChangeLog @@ -1,3 +1,22 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_cma230.cdl: Respect channel configuration + constraints. + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_platform_ints.h: this file. + 2000-12-04 Hugo Tyson <hmt@redhat.com> * include/hal_cache.h: Consistently ensure that ARM registers used
--- a/packages/hal/arm/cma230/current/cdl/hal_arm_cma230.cdl +++ b/packages/hal/arm/cma230/current/cdl/hal_arm_cma230.cdl @@ -114,6 +114,7 @@ cdl_package CYGPKG_HAL_ARM_CMA230 { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -125,6 +126,7 @@ cdl_package CYGPKG_HAL_ARM_CMA230 { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/arm/cma230/current/include/hal_platform_ints.h +++ b/packages/hal/arm/cma230/current/include/hal_platform_ints.h @@ -64,4 +64,11 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER + +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + +#define HAL_PLATFORM_RESET_ENTRY 0xe000000 + #endif // CYGONCE_HAL_PLATFORM_INTS_H
--- a/packages/hal/arm/cma230/current/include/plf_stub.h +++ b/packages/hal/arm/cma230/current/include/plf_stub.h @@ -71,13 +71,6 @@ externC void cyg_hal_plf_comms_init(void #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xe000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/cma230/current/src/hal_diag.c +++ b/packages/hal/arm/cma230/current/src/hal_diag.c @@ -57,9 +57,6 @@ #include <cyg/hal/drv_api.h> // driver API #include <cyg/hal/hal_misc.h> // Helper functions -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static void cyg_hal_plf_serial_init(void); // FIXME: Copy LCD driver from powerpc/cogent @@ -78,7 +75,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); // cyg_hal_plf_lcd_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Serial driver @@ -257,9 +253,6 @@ cyg_hal_plf_serial_putc(void* __ch_data, CYGARC_HAL_RESTORE_GP(); } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static const channel_data_t channels[2] = { { (cyg_uint8*)CMA101_DUARTA, 1000, CYGNUM_HAL_INTERRUPT_SERIAL_A}, { (cyg_uint8*)CMA101_DUARTB, 1000, CYGNUM_HAL_INTERRUPT_SERIAL_B} @@ -433,9 +426,6 @@ cyg_hal_plf_serial_init(void) CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - - //============================================================================= // Compatibility with older stubs //============================================================================= @@ -451,7 +441,7 @@ cyg_hal_plf_serial_init(void) // Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e. // totally stand-alone) system. -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #endif
--- a/packages/hal/arm/ebsa285/current/ChangeLog +++ b/packages/hal/arm/ebsa285/current/ChangeLog @@ -1,3 +1,22 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + + * cdl/hal_arm_ebsa285.cdl: Respect channel configuration + constraints. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_platform_ints.h: this file. + 2001-01-03 Gary Thomas <gthomas@redhat.com> * src/ebsa285_misc.c (hal_delay_us): Slight rearrangement to
--- a/packages/hal/arm/ebsa285/current/cdl/hal_arm_ebsa285.cdl +++ b/packages/hal/arm/ebsa285/current/cdl/hal_arm_ebsa285.cdl @@ -141,6 +141,7 @@ cdl_package CYGPKG_HAL_ARM_EBSA285 { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -152,6 +153,7 @@ cdl_package CYGPKG_HAL_ARM_EBSA285 { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/arm/ebsa285/current/include/hal_platform_ints.h +++ b/packages/hal/arm/ebsa285/current/include/hal_platform_ints.h @@ -88,4 +88,33 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER_3 + +//---------------------------------------------------------------------------- +// Reset. +#include <cyg/hal/hal_ebsa285.h> // registers +#include <cyg/hal/hal_io.h> // IO macros + +#define HAL_PLATFORM_RESET() \ + CYG_MACRO_START \ + cyg_uint32 ctrl; \ + \ + /* If watchdog is already enabled, writing to timer4 has no effect. */ \ + /* But by disabling interupts and just hanging in the loop below */ \ + /* the timer might run out eventually (not guaranteed). */ \ + HAL_DISABLE_INTERRUPTS(ctrl); \ + \ + /* Set timer4 (must be done before enabling watchdog) */ \ + HAL_WRITE_UINT32(SA110_TIMER4_LOAD, 2); \ + HAL_WRITE_UINT32(SA110_TIMER4_CONTROL, SA110_TIMER_CONTROL_ENABLE); \ + \ + /* Enable watchdog */ \ + HAL_READ_UINT32(SA110_CONTROL, ctrl); \ + ctrl |= SA110_CONTROL_WATCHDOG; \ + HAL_WRITE_UINT32(SA110_CONTROL, ctrl); \ + \ + for(;;); /* wait for it */ \ + CYG_MACRO_END + +#define HAL_PLATFORM_RESET_ENTRY 0x41000000 + #endif // CYGONCE_HAL_PLATFORM_INTS_H
--- a/packages/hal/arm/ebsa285/current/include/plf_stub.h +++ b/packages/hal/arm/ebsa285/current/include/plf_stub.h @@ -71,35 +71,6 @@ externC void cyg_hal_plf_comms_init(void #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -#include <cyg/hal/hal_ebsa285.h> // registers -#include <cyg/hal/hal_io.h> // IO macros - -#define HAL_STUB_PLATFORM_RESET() \ - CYG_MACRO_START \ - cyg_uint32 ctrl; \ - \ - /* If watchdog is already enabled, writing to timer4 has no effect. */ \ - /* But by disabling interupts and just hanging in the loop below */ \ - /* the timer might run out eventually (not guaranteed). */ \ - HAL_DISABLE_INTERRUPTS(ctrl); \ - \ - /* Set timer4 (must be done before enabling watchdog) */ \ - HAL_WRITE_UINT32(SA110_TIMER4_LOAD, 2); \ - HAL_WRITE_UINT32(SA110_TIMER4_CONTROL, SA110_TIMER_CONTROL_ENABLE); \ - \ - /* Enable watchdog */ \ - HAL_READ_UINT32(SA110_CONTROL, ctrl); \ - ctrl |= SA110_CONTROL_WATCHDOG; \ - HAL_WRITE_UINT32(SA110_CONTROL, ctrl); \ - \ - for(;;); /* wait for it */ \ - CYG_MACRO_END - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0x41000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/ebsa285/current/src/hal_diag.c +++ b/packages/hal/arm/ebsa285/current/src/hal_diag.c @@ -149,9 +149,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static cyg_int32 msec_timeout; static void @@ -306,8 +303,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= @@ -325,7 +320,7 @@ cyg_hal_plf_comms_init(void) #undef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS #endif -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #endif
--- a/packages/hal/arm/edb7xxx/current/ChangeLog +++ b/packages/hal/arm/edb7xxx/current/ChangeLog @@ -1,3 +1,22 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + + * cdl/hal_arm_edb7xxx.cdl: Respect channel configuration + constraints. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_platform_ints.h: this file. + 2000-12-04 Hugo Tyson <hmt@redhat.com> * include/hal_cache.h: Consistently ensure that ARM registers used
--- a/packages/hal/arm/edb7xxx/current/cdl/hal_arm_edb7xxx.cdl +++ b/packages/hal/arm/edb7xxx/current/cdl/hal_arm_edb7xxx.cdl @@ -152,6 +152,7 @@ cdl_package CYGPKG_HAL_ARM_EDB7XXX { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -163,6 +164,7 @@ cdl_package CYGPKG_HAL_ARM_EDB7XXX { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/arm/edb7xxx/current/include/hal_platform_ints.h +++ b/packages/hal/arm/edb7xxx/current/include/hal_platform_ints.h @@ -87,4 +87,16 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TC2OI + + +//---------------------------------------------------------------------------- +// Reset. + +// Try and force the board into a reset state. Since this hardware requires +// a "wakeup" signal, we can't just use a watchdog/reset approach. +externC void reset_platform(void); +#define HAL_PLATFORM_RESET() reset_platform() + +#define HAL_PLATFORM_RESET_ENTRY 0xe0000000 + #endif // CYGONCE_HAL_PLATFORM_INTS_H
--- a/packages/hal/arm/edb7xxx/current/include/plf_stub.h +++ b/packages/hal/arm/edb7xxx/current/include/plf_stub.h @@ -71,17 +71,6 @@ externC void cyg_hal_plf_comms_init(void #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. - -// Try and force the board into a reset state. Since this hardware requires -// a "wakeup" signal, we can't just use a watchdog/reset approach. -externC void reset_platform(void); -#define HAL_STUB_PLATFORM_RESET() reset_platform() - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xe0000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/edb7xxx/current/src/hal_diag.c +++ b/packages/hal/arm/edb7xxx/current/src/hal_diag.c @@ -149,9 +149,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static channel_data_t edb_ser_channels[2] = { {(volatile struct edb_serial*)SYSCON1, 1000, CYGNUM_HAL_INTERRUPT_URXINT1}, {(volatile struct edb_serial*)SYSCON2, 1000, CYGNUM_HAL_INTERRUPT_URXINT2} @@ -321,7 +318,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Compatibility with older stubs @@ -344,7 +340,7 @@ cyg_hal_plf_comms_init(void) #if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) #define HAL_DIAG_USES_HARDWARE #else -#if defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #elif CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL != CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL #define HAL_DIAG_USES_HARDWARE
--- a/packages/hal/arm/pid/current/ChangeLog +++ b/packages/hal/arm/pid/current/ChangeLog @@ -1,3 +1,24 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + + * cdl/hal_arm_pid.cdl: Respect channel configuration constraints. + + * src/pid_misc.c (hal_hardware_init): Safe to call hal_if_init in + thumb mode now. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_platform_ints.h: this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_arm_pid_ram.h:
--- a/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl +++ b/packages/hal/arm/pid/current/cdl/hal_arm_pid.cdl @@ -130,6 +130,7 @@ cdl_package CYGPKG_HAL_ARM_PID { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -141,6 +142,7 @@ cdl_package CYGPKG_HAL_ARM_PID { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/arm/pid/current/include/hal_platform_ints.h +++ b/packages/hal/arm/pid/current/include/hal_platform_ints.h @@ -72,4 +72,12 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER2 + +//---------------------------------------------------------------------------- +// Reset. + +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + +#define HAL_PLATFORM_RESET_ENTRY 0x4000000 + #endif // CYGONCE_HAL_PLATFORM_INTS_H
--- a/packages/hal/arm/pid/current/include/plf_stub.h +++ b/packages/hal/arm/pid/current/include/plf_stub.h @@ -71,14 +71,6 @@ externC void cyg_hal_plf_comms_init(void #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. - -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0x4000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/pid/current/src/hal_diag.c +++ b/packages/hal/arm/pid/current/src/hal_diag.c @@ -204,9 +204,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static channel_data_t pid_ser_channels[2] = { { (cyg_uint8*)0x0D800000, 1000, CYGNUM_HAL_INTERRUPT_SERIALA }, { (cyg_uint8*)0x0D800020, 1000, CYGNUM_HAL_INTERRUPT_SERIALB } @@ -386,7 +383,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES /*---------------------------------------------------------------------------*/ @@ -431,7 +427,7 @@ static channel_data_t pid_ser_channel = // Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e. // totally stand-alone) system. -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #endif
--- a/packages/hal/arm/pid/current/src/pid_misc.c +++ b/packages/hal/arm/pid/current/src/pid_misc.c @@ -132,13 +132,8 @@ void hal_hardware_init(void) // Any hardware/platform initialization that needs to be done. HAL_WRITE_UINT32(CYG_DEVICE_IRQ_EnableClear, 0xFFFF); // Clear all // interrupt sources - // FIXME: The line with the thumb check is a hack, allowing - // the farm to run test. Problem is that virtual vector table - // API needs to be ARM/Thumb consistent. Will fix later. -#ifndef __thumb__ // Set up eCos/ROM interfaces hal_if_init(); -#endif } //
--- a/packages/hal/arm/sa11x0/assabet/current/ChangeLog +++ b/packages/hal/arm/sa11x0/assabet/current/ChangeLog @@ -1,3 +1,12 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_sa11x0_assabet.cdl: Respect channel configuration + constraints. + +2001-02-02 Gary Thomas <gthomas@redhat.com> + + * src/lcd_support.c: Fix for building standalone (no "C" library). + 2001-01-05 Hugo Tyson <hmt@redhat.com> * include/plf_mmap.h: New file. Statically defined macros for
--- a/packages/hal/arm/sa11x0/assabet/current/cdl/hal_arm_sa11x0_assabet.cdl +++ b/packages/hal/arm/sa11x0/assabet/current/cdl/hal_arm_sa11x0_assabet.cdl @@ -113,6 +113,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_ASSABE cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -124,6 +125,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_ASSABE cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
index 39609f8eb0aeea8ccb56cb463b507d45b554d172..e6b3dc48dbce6f23a45358fa10674e6d4f78e541 GIT binary patch literal 80896 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
index 5c911835006a0091d990119487b24b9173c06c18..f57dec05bbf0d71326b353a32572a5888f6380ec GIT binary patch literal 104032 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�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
--- a/packages/hal/arm/sa11x0/assabet/current/images/redboot_RAM.srec +++ b/packages/hal/arm/sa11x0/assabet/current/images/redboot_RAM.srec @@ -1,4 +1,4 @@ -S02B00002F776F726B2F617373616265745F726564626F6F742F52414D2F696E7374616C6C2F62696E2F7265DF +S02B00002F776F726B2F617373616265742F726564626F6F742F52414D2F696E7374616C6C2F62696E2F72650F S21902000018F09FE518F09FE518F09FE518F09FE518F09FE50028 S21902001500000018F09FE518F09FE54400020044010200C80161 S21902002A0200000202007C02020000000000640302004C03027A @@ -12,9 +12,9 @@ S2190200AD2080E59CD39FE5D200A0E300F029E1 S2190200C2A0E300F029E188D39FE5DB00A0E300F029E180D39F7C S2190200D7E5D300A0E300F029E100F069E168D39FE574139FE5D4 S2190200EC74239FE50000A0E3020051E10200000A040081E402AF -S2190201010051E1FCFFFF1A480100EB3C0700EB0000A0E38C1318 -S2190201169FE5042091E5042080E5242091E5242080E5BA0B00FE -S21902012BEB200100EB7A1200EBFEFFFFEA0000A0E300F0A0E170 +S2190201010051E1FCFFFF1A821100EBA51800EB0000A0E38C1354 +S2190201169FE5042091E5042080E5242091E5242080E5691D003D +S21902012BEB5A1100EBE13400EBFEFFFFEA0000A0E300F0A0E19D S2190201400BB0ADDE14D39FE501582DE900004FE101002DE90D2F S219020155C0A0E100000FE11F00C0E3130080E300F029E10DB06E S21902016AA0E1DCD29FE50D005BE10300008ACC029FE500005B43 @@ -36,7 +36,7 @@ S2190202A5B0A0E1A0D19FE50D005BE10300008A S2190202BA5BE10000009A0BD0A0E14CD04DE2FF0F8DE81F009C6D S2190202CFE83C008DE500108DE52C208DE540308DE538408DE571 S2190202E434E08DE54C008CE230B08DE50440A0E3FFFFFFEA447A -S2190202F9408DE50D00A0E18A0000EB0DC0A0E100000FE1C00036 +S2190202F9408DE50D00A0E1C31000EB0DC0A0E100000FE1C000ED S21902030E80E300F029E10000A0E10000A0E134E09CE530D09D42 S219020323E51F00C0E3120080E300F029E10CD0A0E138E09DE5B1 S2190203383C009DE540C09DE500F069E1FF0F9DE80EF0B0E10409 @@ -45,3164 +45,3812 @@ S21902036200EAF0D09FE504E04EE201582DE900 S219020377E90DC0A0E100000FE11F00C0E3D30080E300F029E151 S21902038C0DB0A0E14CD04DE2FF0F8DE81F009CE83C008DE500F8 S2190203A1108DE52C208DE540308DE538408DE534E08DE530B0CE -S2190203B68DE50D90A0E10900A0E1E50000EB0040A0E10400A0DC +S2190203B68DE50D90A0E10900A0E11F1100EB0040A0E10400A091 S2190203CBE1D8209FE5009082E5A4109FE5041191E798209FE5C1 S2190203E0046192E70920A0E10FE0A0E106F0A0E10DC0A0E10044 S2190203F5000FE1C00080E300F029E10000A0E10000A0E134E0C9 S21902040A9CE530D09DE51F00C0E3120080E300F029E10CD0A026 S21902041FE138E09DE53C009DE540C09DE500F069E1FF0F9DE839 S2190204340EF0B0E10EF0A0E100000FE10EF0A0E10D00A0E10E93 -S219020449F0A0E150080300500C0300501C030050070300D007CC -S21902045E030050080300C806030030C5030030C503002401033B -S2190204730024010300C80603002801030018020300080303001D -S219020488000002002401030065436F73203A20004175672032BB -S21902049D342032303030000000020000000200CCC203000DC0CB -S2190204B2A0E100D82DE930309FE530009FE5001093E504B04C9F -S2190204C7E228C09FE50C3091E50C308CE50C3090E5102091E515 -S2190204DC0C3081E510208CE5103090E5103081E500A81BE9F8C2 -S2190204F103030020000200501C03000DC0A0E100D82DE91C20E0 -S2190205069FE51C109FE5000092E50C3091E50C3080E51020911A -S21902051BE504B04CE2102080E500A81BE9F8030300501C03004F -S2190205300DC0A0E130D82DE968309FE504B04CE2002093E500AD -S21902054540A0E1000052E30400000A443094E5040053E301006E -S21902055A001A382084E530A81BE940509FE5003095E50130835C -S21902056FE2003085E5010053E30000001ACBFFFFEB28309FE513 -S219020584004083E5210300EB003095E5013043E2003085E5000A -S2190205990053E30000001AD5FFFFEB30A81BE934040300701C95 -S2190205AE030058C203000DC0A0E130D82DE924309FE504B04CCD -S2190205C3E220409FE50350A0E1030054E10300003A0FE0A0E19D -S2190205D804F014E4050054E1FBFFFF2A30A81BE9C4060300C451 -S2190205ED0603000DC0A0E100D82DE90030A0E10120A0E104B0A6 -S2190206024CE20C009FE50310A0E1E80C00EB0000A0E300A81B65 -S219020617E948E702000DC0A0E100D82DE904B04CE2FEDEFFE7CD -S21902062C00A81BE90DC0A0E110D82DE970209FE570309FE57012 -S219020641109FE50040A0E3004082E5004083E564209FE50130BE -S219020656A0E3003081E55C309FE5004082E5004083E508208266 -S21902066BE20F32E0E3003082E504B04CE2CF0000EB40309FE566 -S219020680004083E50922A0E3004082E58E0A00EB101F11EE0FA1 -S2190206951081E3101F01EE101F11EE011A81E3031081E3101F64 -S2190206AA01EE10A81BE904000590080005900C0005901000049E -S2190206BF9014000490100000900DC0A0E130D82DE90030A0E12A -S2190206D4010040E2000053E304B04CE21B0000DA6C509FE5009A -S2190206E9E0A0E3014040E2001095E5002095E5010052E10300D4 -S2190206FE001A50309FE5002093E5010052E1FCFFFF0A09C2A087 -S219020713E300309CE5000053E30400000A012052E000309C458E -S2190207280320824002E08EE0010000EA023061E003E08EE002CF -S21902073D005EE3EAFFFFDA0030A0E10400A0E1000053E3E4FF4E -S219020752FFCA30A81BE9100000900DC0A0E100D82DE984309FB7 -S219020767E5002093E504B04CE2FF0812E31000A0130500001A39 -S21902077CFF0C12E30800A0130200001AFF0012E31800A00300DB -S21902079100A01358109FE558C09FE55230A0E1010013E30C000B -S2190207A6000A0B0050E30700001A003091E50C2003E05230A0F7 -S2190207BBE1010013E30300001A010080E21B0050E3F9FFFF9AEB -S2190207D000A81BE9200080E200A81BE9010080E2070010E3ECEA -S2190207E5FFFF1A0000E0E300A81BE9000005901800049000F838 -S2190207FAFF0F0DC0A0E100D82DE92A0050E30B00A0C314109F0B -S21902080FE50120A0E3003091E504B04CE21230C3E1003081E540 -S21902082400A81BE9040005900DC0A0E100D82DE92A0050E30BCF -S21902083900A0C314109FE50120A0E3003091E504B04CE212302A -S21902084E83E1003081E500A81BE9040005900DC0A0E100D82DFC -S219020863E90B3040E21F0053E304B04CE20400009A1F3000E22D -S2190208780120A0E308109FE51223A0E1002081E500A81BE91824 -S21902088D0004900DC0A0E100D82DE90B3040E21F0053E304B019 -S2190208A24CE23400009A000051E31900000A000052E30B0000A7 -S2190208B70A1F1000E2BC009FE50120A0E3003090E51221A0E1CD -S2190208CCB0109FE5023083E1003080E5003091E5023083E10065 -S2190208E13081E500A81BE91F1000E28C009FE50120A0E30030C4 -S2190208F690E51221E0E180109FE5023003E0003080E5003091FE -S21902090BE5023003E0003081E500A81BE9000052E30B00000A4A -S2190209201F1000E254009FE50120A0E3003090E51221A0E1488D -S219020935109FE5023083E1003080E5003091E50230C3E100303B -S21902094A81E500A81BE91F1000E228009FE50120A0E30030905E -S21902095FE51221A0E114109FE5023083E1003080E5003091E56A -S2190209740230C3E1003081E500A81BE910000490140004900DF6 -S219020989C0A0E100D82DE904B04CE21CC09FE500309CE5003000 -S21902099EC3E1010000E0003083E100308CE51224A0E300308218 -S2190209B3E500A81BE9600100000DC0A0E100D82DE904B04CE218 -S2190209C800A81BE90DC0A0E100D82DE90C309FE50F0000E2007A -S2190209DD00D3E704B04CE200A81BE978E702000DC0A0E100D82F -S2190209F22DE920209FE5000092E504B04CE2000050E301000082 -S219020A07CA220600EB00A81BE90030E0E3003082E500A81BE914 -S219020A1C140403000DC0A0E100D82DE9FF0000E2613040E205CE -S219020A310053E30010A0E104B04CE20100008A570040E200A854 -S219020A461BE9302040E2FF3002E2090053E30100008A0200A09F -S219020A5BE100A81BE9413040E2050053E30100009A0000E0E3C6 -S219020A7000A81BE9370041E200A81BE90DC0A0E110D82DE9006C -S219020A8530A0E304B04CE214D04DE214304BE524404BE21C008C -S219020A9A0BE5D2FFFFEBFF0000E20410A0E1020000EB010050E1 -S219020AAFE3F9FFFF1A10A81BE90DC0A0E170D82DE90140A0E10D -S219020AC41050D4E504B04CE2000055E30800001A240050E32842 -S219020AD900001A0130A0E31030C4E50C5084E5005084E502309A -S219020AEE43E2043084E5210000EA010055E31700001A23005042 -S219020B03E30600001A080094E50C1094E50030A0E30130C0E732 -S219020B180220A0E31020C4E5160000EA0C1094E5020B51E3036A -S219020B2D00001A0030A0E31030C4E50000E0E370A81BE90030E7 -S219020B4294E5082094E5003083E0003084E50100C2E7013081F5 -S219020B57E20C3084E5070000EA020055E30700001AFF0000E2CE -S219020B6CABFFFFEB0002A0E1040084E50330A0E31030C4E5004A -S219020B8100A0E370A81BE9030055E32300001AFF0000E2A1FFC0 -S219020B96FFEB043094E50020D4E5003083E1043084E50300524D -S219020BABE10200000A2D00A0E3AA0500EBDCFFFFEA2B00A0E385 -S219020BC0A70500EB082094E50230D2E53A0053E31000001A005E -S219020BD500D2E50C6094E5A00500EB083094E50100D3E59D05CC -S219020BEA00EB0500A0E1060050E10700008A0210E0E308309415 -S219020BFFE50020D3E7033080E0010080E20120C3E7060050E123 -S219020C14F8FFFF9A0100A0E370A81BE90000E0E30030A0E3100E -S219020C2930C4E570A81BE90DC0A0E1F0D92DE904B04CE200703B -S219020C3EA0E168809FE52400A0E3850500EB0050A0E30540D7A2 -S219020C53E70560A0E1050054E10700000A0400A0E17E0500EB7A -S219020C68016086E2043085E00640D7E7FF5003E2000054E3F7A8 -S219020C7DFFFF1A2300A0E3760500EB2502D8E7740500EB0F30AE -S219020C9205E20300D8E7710500EB52FFFFEB7F0000E22B005025 -S219020CA7E3E5FFFF1AF0A91BE978E702000DC0A0E1F0DF2DE920 -S219020CBC90009FE50020A0E38C309FE504D04DE2002083E50496 -S219020CD1B04CE2001090E503A0A0E1020051E14B0000DA009097 -S219020CE6A0E16C809FE56C309FE5002093E5000052E3190000FB -S219020CFB0A003090E554109FE5030053E30300009A003098E5C3 -S219020D10030013E30440A0030800000A30209FE5003092E50159 -S219020D2540A0E3040053E10300009A003091E5010013E301403C -S219020D3AA0130240A0032C004BE2001091E50420A0E1BF0700BB -S219020D4FEB070000EA742C030018040300782C0300802C030094 -S219020D64003098E50020D3E50140A0E32C204BE500309AE500FF -S219020D790053E32400001A03C0A0E104005CE1150000AA2C601A -S219020D8E4BE270E09FE50A70A0E16C509FE50600DCE700109E96 -S219020DA3E52032D5E70130C1E4002097E500108EE5000052E317 -S219020DB81500001A0F3000E20320D5E70120C1E400309AE5007B -S219020DCD108EE5000053E30E00001A01C08CE204005CE1EDFFCD -S219020DE2FFBA002099E50900A0E1003098E5022064E000208958 -S219020DF7E5043083E0003088E5000052E3010000EA7C2C0300FC -S219020E0C78E70200B5FFFFCAF0AF1BE90DC0A0E170D82DE90499 -S219020E21B04CE268C09FE500108CE564109FE5000081E56000EC -S219020E369FE5002080E55C209FE5000053E3003082E50C60A0BE -S219020E4BE10A00000A4C409FE50050A0E3005084E5003094E551 -S219020E6093FFFFEB002094E5003094E5050053E10200000A056E -S219020E7500A0E170A81BE98CFFFFEB002096E50030A0E30030D1 -S219020E8AC2E5000096E570A81BE97C2C0300782C0300742C0319 -S219020E9F00802C0300180403000DC0A0E1F0DF2DE924019FE58D -S219020EB424219FE504D04DE20070A0E3007082E504B04CE200AA -S219020EC93090E50290A0E1070053E15A0000DA04319FE500200D -S219020EDE93E50010D2E503A0A0E1070051E15400000AF0809FEF -S219020EF3E5F0109FE5003091E5000053E31000000A003090E5DF -S219020F08030053E30300009A003098E5030013E30450A0030A50 -S219020F1D00000AB4209FE5003092E50150A0E3050053E105009D -S219020F32009A003098E5010013E30150A0130250A0030000006C -S219020F47EA0150A0E30040A0E3050054E1170000AA84609FE5AA -S219020F5C003096E50100D3E4003086E5ACFEFFEB0002A0E10064 -S219020F713099E5FF7000E2000053E33000001A00309AE5010035 -S219020F86D3E400308AE5A3FEFFEB000087E1003099E5FF7000E9 -S219020F9BE2000053E32700001A2C304BE20370C4E7014084E293 -S219020FB0050054E1E8FFFFBA2C109FE5003091E5000053E309A6 -S219020FC500000A2C004BE2001098E50520A0E12B0700EB060057 -S219020FDA00EA742C030018040300782C03007C2C0300802C034E -S219020FEF00003098E50070C3E5003099E5000053E30F00001A14 -S21902100430309FE5002093E50300A0E1003098E5022065E000BC -S2190210192080E5053083E0003088E5000052E3050000DA0030BD -S21902102E9AE50020D3E5000052E3000000EA742C0300ABFFFFE4 -S2190210431AF0AF1BE90DC0A0E170D82DE904B04CE25CC09FE5A6 -S21902105800008CE558009FE5001080E554109FE5002081E550FC -S21902106D209FE5000053E3003082E50060A0E10A00000A404081 -S2190210829FE50050A0E3005084E5003094E584FFFFEB00209478 -S219021097E5003094E5050053E10200000A0500A0E170A81BE9C8 -S2190210AC7DFFFFEB000096E570A81BE9782C03007C2C03007465 -S2190210C12C0300802C0300180403000DC0A0E100D82DE904B026 -S2190210D64CE2BC0500EB08209FE50130A0E3003082E500A81B6A -S2190210EBE9FC0303000DC0A0E170D82DE904B04CE20060A0E38D -S2190211000150A0E1006085E50040A0E1060000EA003095E501DB -S2190211156086E2002094E5033280E1003085E5012082E2002088 -S21902112A84E5002094E50030D2E5000053E30300000A0300A0DA -S21902113FE136FEFFEB000050E3F0FFFFAA0600A0E170A81BE927 -S2190211540DC0A0E170D82DE904B04CE202E0A0E10060A0E300AB -S2190211694051E20400001A3030A0E30130C0E40030C0E502004A -S21902117EA0E370A81BE907308EE2000053E3073083B2C3E1B019 -S219021193E11300000A50509FE501104EE28131A0E134C3B0E122 -S2190211A80020A0030120A01301005EE30030A0130130A0030398 -S2190211BD2092E10600000AFFC00CE22C32D5E70130C0E40F20A8 -S2190211D20CE20230D5E7026086E20130C0E400E051E2ECFFFF89 -S2190211E71A0600A0E170A81BE978E702000DC0A0E100D82DE992 -S2190211FC04B04CE200A81BE90DC0A0E100D82DE904B04CE2002B -S219021211A81BE90DC0A0E170D82DE9B8209FE5003092E504B0B2 -S2190212264CE2000053E30200000A003092E50FE0A0E103F0A092 -S21902123BE19C209FE5003092E5000053E30300000A0030A0E3D9 -S219021250003082E50250A0E3020000EA580A00EB450A00EB00A3 -S21902126550A0E1620C00EB000050E30000000A6A0C00EB5A0C3F -S21902127A00EBE0FFFFEB3C0C00EB0300A0E3100600EB0300A047 -S21902128FE3DB0500EB48609FE5000055E30600000A40409FE51D -S2190212A4003094E50500A0E10FE0A0E103F0A0E1000050E3F9EF -S2190212B9FFFF1A450C00EB003096E5000053E30200000A0030A8 -S2190212CE96E50FE0A0E103F0A0E170A81BE910040300C8C203E5 -S2190212E3000C040300000403000DC0A0E1F0DD2DE904B04CE2C2 -S2190212F824D04DE20050A0E10040A0E348604BE2F4A09FE50036 -S21902130D309AE50180A0E3000053E30500000A0400A0E1061031 -S219021322A0E10FE0A0E103F0A0E10080A0E1020000EA0400A0B9 -S219021337E1B90300EB48000BE50600A0E1103044E2070053E3B0 -S21902134C03E0A0E1017084E21100008A0840A0E30020A0E3023F -S219021361C0A0E144004BE20010A0E1043082E2012082E203C04D -S219021376C1E7040052E1FAFFFFBA0010A0E106C0A0E10320A02F -S21902138BE30130DCE4012042E20130C1E4010072E3FAFFFF1AEF -S2190213A0000058E30700000A0510A0E107005EE30C20A09304A4 -S2190213B520A0830030A0E395FEFFEB0050A0E1100000EA0520B9 -S2190213CAA0E107005EE31730A0930730A083010073E37810A0EB -S2190213DFE30300000A013043E20110C2E4010073E3FBFFFF1A8B -S2190213F407005EE30200009A085085E2010000EAE8C10300188B -S2190214095085E20740A0E1190054E3BCFFFFDAF0AD1BE90DC0F6 -S21902141EA0E1F0D92DE904B04CE20CD04DE20040A0E31A70A078 -S219021433E30130D0E40180A0E124000BE5500053E31700001A08 -S21902144824004BE228104BE226FFFFEB040050E10800000A2458 -S21902145D201BE50130D2E4FF3003E224200BE53D0053E30200AF -S219021472001A28401BE5017084E2090000EA74209FE50030D2F8 -S219021487E50810A0E1000053E32900000A0130C1E40130F2E584 -S21902149C000053E3FBFFFF1A240000EA0450A0E1070055E118B3 -S2190214B10000AA0060A0E32C104BE2104045E2070054E32C60E8 -S2190214C60BE50C20A0930420A08324001BE50630A0E1DAFEFFC2 -S2190214DBEB2C101BE50500A0E1560300EB070054E30300009A29 -S2190214F024301BE5083083E2020000EA8CE7020024301BE51822 -S2190215053083E2015085E224300BE5070055E1E7FFFFBA282015 -S21902151A9FE50030D2E50810A0E1000053E30300000A0130C17C -S21902152FE40130F2E5000053E3FBFFFF1A0030A0E30030C1E5E2 -S219021544000000EA90E70200F0A91BE90DC0A0E1F0D82DE974EB -S219021559239FE504B04CE2C0D04DE20040A0E10060A0E300305A -S21902156ED4E50270A0E10060C2E53F3043E2340053E303F19F1D -S21902158397F40100EA5C1602005C1D0200BC1602002C1C0200C9 -S219021598E41A02005C1D02005C1D02005C1D02000C1802006C34 -S2190215AD1D02005C1D02005C1D02005C1D02005C1D0200EC1813 -S2190215C202005C1D02005C1D02000C180200A41602005C1D02B8 -S2190215D700E41A02006C1D02005C1D02005C1D02005C1D0200FC -S2190215ECE81802005C1D02005C1D02005C1D02005C1D02005C99 -S2190216011D02005C1D02005C1D02005C1D02005C1D0200D41CD2 -S2190216160200E41A02005C1D02005C1D02005C1D0200B016027D -S21902162B005C1D02005C1D02005C1D02000C1C02005C1D02008D -S2190216401C1802005C1D02005C1D02005C1D0200981602002413 -S2190216551C0200E41A0200580900EB450900EB5330A0E30030A0 -S21902166AC7E50020A0E30320C7E55C129FE54032A0E10F30031F -S21902167FE20320D1E70F0000E20030D1E70120C7E50230C7E50E -S219021694B40100EA010084E27E0200EBB10100EA010084E2D2F4 -S2190216A90200EBAE0100EA0700A0E10CFFFFEBAB0100EA01305B -S2190216BED4E5000053E30A00001AF10100EB08129FE50030D181 -S2190216D3E50720A0E1000053E38C01000A0130C2E40130F1E5C3 -S2190216E8000053E3FBFFFF1A870100EAA4604BE2A0504BE201DC -S2190216FD3084E2A0300BE50500A0E10610A0E177FEFFEB0000FF -S21902171250E32400000AA0201BE50130D2E4FF3003E2A0200BD4 -S219021727E52C0053E31E00001A0500A0E1A8104BE26CFEFFEB68 -S21902173C000050E31900000AA0201BE50130D2E4FF3003E2A0E0 -S219021751200BE52C0053E31300001AA4101BE5000051E30B00EA -S219021766000AA8001BE5E00100EB001050E20300000AA0001BDF -S21902177BE5A4201BE50030A0E32FFEFFEBA4201BE5A0301BE54B -S219021790823083E0A0300BE5A0201BE50030D2E52C0053E3015E -S2190217A5308202D4FFFF0AA0301BE50020D3E5000052E30900B2 -S2190217BA001A18119FE50030D1E50720A0E1000053E350010037 -S2190217CF0A0130C2E40130F1E5000053E3FBFFFF1A4B0100EA97 -S2190217E4F4109FE50030D1E50720A0E1000053E34601000A014B -S2190217F930C2E40130F1E5000053E3FBFFFF1A410100EA04007E -S21902180EA0E10710A0E100FFFFEB530100EAAC504BE20500A0B0 -S219021823E1013084E2AC300BE5B0104BE22EFEFFEB000050E32F -S2190218381B00000AAC201BE50130D2E4FF3003E2AC200BE52CC0 -S21902184D0053E31500001A0500A0E1B4104BE223FEFFEB000098 -S21902186250E31000000AB0001BE50710A0E1B4201BE50130A030 -S219021877E366FDFFEB000050E33901001A58109FE50030D1E5CC -S21902188C0720A0E1000053E31E01000A0130C2E40130F1E5005B -S2190218A10053E3FBFFFF1A190100EA2C109FE50030D1E5072011 -S2190218B6A0E1000053E31401000A0130C2E40130F1E50000530F -S2190218CBE3FBFFFF1A0F0100EA7424030078E7020090E702009C -S2190218E094E7020098E702000160A0E3B8504BE20500A0E1014E -S2190218F53084E2B8300BE5BC104BE2FAFDFFEB000050E36B00F1 -S21902190A000AB8201BE50130D2E4FF3003E2B8200BE52C00539D -S21902191FE36500001A0500A0E1C0104BE2EFFDFFEB000050E3BE -S2190219346000000AB8001BE50130D0E4FF3003E2B8000BE53A9A -S2190219490053E35A00001A000056E33E00000AC0301BE5000067 -S21902195E53E32400000A9C504BE2C0301BE50040A0E3030054E6 -S219021973E11100002A0510A0E1B8201BE50130D2E40430C1E70B -S219021988FF3003E2B8200BE57D0053E30300001A0130D2E42090 -S21902199D3083E30430C5E7B8200BE5014084E27F0054E3020091 -S2190219B2008AC0301BE5030054E1EEFFFF3A0500A0E1BC101BD4 -S2190219C7E50420A0E1AD0400EB040050E10700001AC0201BE5A8 -S2190219DCBC301BE5022064E0C0200BE5043083E0BC300BE5005A -S2190219F10052E3DBFFFF1AC0301BE5000053E30900001A28132E -S219021A069FE50030D1E50720A0E1000053E3BE00000A0130C2C1 -S219021A1BE40130F1E5000053E3FBFFFF1AB90000EA04139FE53D -S219021A300030D1E50720A0E1000053E3B400000A0130C2E40140 -S219021A4530F1E5000053E3FBFFFF1AAF0000EABC101BE5C020F1 -S219021A5A1BE50130A0E378FDFFEB000050E30900000AC0129FA6 -S219021A6FE50030D1E50720A0E1000053E3A400000A0130C2E42D -S219021A840130F1E5000053E3FBFFFF1A9F0000EA9C129FE5003B -S219021A9930D1E50720A0E1000053E39A00000A0130C2E40130C1 -S219021AAEF1E5000053E3FBFFFF1A950000EA78129FE50030D16F -S219021AC3E50720A0E1000053E39000000A0130C2E40130F1E5CC -S219021AD8000053E3FBFFFF1A8B0000EA013084E2C4300BE5C4F5 -S219021AED504BE20020D4E50030A0E3C8300BE5530052E3430021 -S219021B0252130700001A0500A0E1C8104BE276FDFFEBC4201B5A -S219021B17E50030D2E53B0053E301308202C4300B050500A0E136 -S219021B2CCC104BE26EFDFFEB000050E30100000ACC001BE5270E -S219021B410800EB0300A0E3E00300EB0300A0E3AB0300EBC8005A -S219021B561BE5000050E30800000AD8219FE5003092E5000053B7 -S219021B6BE30400000A003092E50FE0A0E103F0A0E1000050E3AF -S219021B80C8000B05C8501BE5000055E30300000A0900A0E3C8C0 -S219021B95000BE5A80000EB740000EA990A00EB000050E304008E -S219021BAA000A6330A0E30030C4E588219FE5623043E200308290 -S219021BBFE50030D4E5530053E3730053130600001A0500A0E134 -S219021BD486FDFFEB68219FE568319FE5003082E5AD0900EB0125 -S219021BE90000EA0100A0E37FFDFFEB0300A0E3B40300EB0300E1 -S219021BFEA0E37F0300EB0000E0E35A0000EA3C319FE500209330 -S219021C13E50FE0A0E102F0A0E10100A0E3540000EA330300EB0A -S219021C284F0000EAD0004BE2013084E2D0300BE5D4104BE22BA7 -S219021C3DFDFFEB000050E31800000AD0201BE50130D2E4FF3049 -S219021C5203E2D0200BE52C0053E31200001A0130D2E4D0200B41 -S219021C67E5430053E30200001AD4001BE5220400EB010000EA17 -S219021C7CD4001BE51A0400EBA8109FE50030D1E50720A0E100A5 -S219021C910053E31E00000A0130C2E40130F1E5000053E3FBFFCB -S219021CA6FF1A190000EAA0109FE50030D1E50720A0E1000053F1 -S219021CBBE31400000A0130C2E40130F1E5000053E3FBFFFF1AE5 -S219021CD00F0000EAD8004BE2013084E2D8300BE5DC104BE20151 -S219021CE5FDFFEB000050E30B00001A60109FE50030D1E50720A3 -S219021CFAA0E1000053E30300000A0130C2E40130F1E5000053D9 -S219021D0FE3FBFFFF1A0030A0E30030C2E5120000EA0C009FE5AC -S219021D24C1FBFFEBDC001BE5650100EB0D0000EA90E7020098C8 -S219021D39E702009CE70200080403004404030024040300F0C1EA -S219021D4E03000404030094E70200A0E702000400A0E10710A029 -S219021D63E14B2FA0E3DB0300EB0700A0E1AEFBFFEB0000A0E31F -S219021D78F0A81BE90DC0A0E110D82DE914409FE504B04CE204A9 -S219021D8D10A0E1E30200EB0400A0E1A4FBFFEB10A81BE9742477 -S219021DA203000DC0A0E110D82DE938309FE5002093E504B04C52 -S219021DB7E2000052E3000000AAEDFFFFEB24409FE50400A0E10C -S219021DCC2AFBFFEB0400A0E1DDFDFFEB000050E3F9FFFF0A006F -S219021DE100A0B30100A0A310A81BE914040300741C03000DC018 -S219021DF6A0E100D82DE904B04CE200A81BE90DC0A0E100D82D81 -S219021E0BE904B04CE2ADFCFFEB850200EB2B00A0E3100100EB41 -S219021E2000A81BE90DC0A0E100D82DE908309FE504B04CE20020 -S219021E350083E500A81BE9140403000DC0A0E100D82DE93C10DA -S219021E4A9FE55830A0E30030C1E50020A0E30320C1E504B04CAB -S219021E5FE228C09FE54032A0E10F3003E20320DCE70F0000E22B -S219021E740030DCE70120C1E50230C1E50100A0E169FBFFEB00F0 -S219021E89A81BE97424030078E702000DC0A0E100D82DE9382001 -S219021E9E9FE538109FE50030E0E3003082E530309FE50020A0AA -S219021EB3E3002081E5002083E524109FE524309FE5003081E5FC -S219021EC804B04CE21C209FE50130A0E3003082E500A81BE9D88D -S219021EDD2C0300D42C0300842C03005C2D0300DC2C03001C044D -S219021EF203000DC0A0E130D82DE99C309FE504B04CE20040A053 -S219021F07E1002093E50150A0E1000052E30000001ADDFFFFEB5E -S219021F1C120054E3070000CA78309FE578109FE5002093E503BC -S219021F31C0A0E1022061E0052082E0800052E30100009A000019 -S219021F46A0E330A81BE958E09FE500309EE5030054E10B00006E -S219021F5B0A4C009FE5003090E548109FE5030054E1030000BA1A -S219021F70012084E20030A0E3023181E7002080E500408EE50048 -S219021F85309CE5043181E700309CE50300A0E1053083E00030F5 -S219021F9A8CE530A81BE91C0403005C2D0300DC2C0300D82C031D -S219021FAF00D42C0300842C03000DC0A0E1F0DD2DE904B04CE24D -S219021FC404D04DE20060A0E174009FE50150A0E1001090E502CC -S219021FD940A0E168A09FE5000051E31300001A0130A0E300305A -S219021FEE80E558709FE558809FE50130A0E1031CA0E10800A0D0 -S219022003E303E1A0E101C083E28120A0E1073022E0000051E3C4 -S2190220180320A0B10210A0E1010050E2F8FFFF1A0C30A0E10E97 -S21902202D2088E7FF0053E3F0FFFF9A14709FE50030A0E3003060 -S2190220428AE5080000EA2004030018040300B71DC104602D03B2 -S2190220570025305BE5243C23E0032197E7016086E2044422E0C0 -S21902206C015045E2010075E30600000A25004BE20610A0E1018D -S21902208120A0E3F10200EB00309AE5000053E3F0FFFF0A0400E1 -S219022096A0E1F0AD1BE90DC0A0E170D82DE928319FE504B04C83 -S2190220ABE20CD04DE21C000BE50020A0E30020C3E500C0A0E174 -S2190220C00020DCE50350A0E1430052E33700001A0130DCE55242 -S2190220D50053E33400001A0260DCE5430056E33100001A03304E -S2190220EADCE53A0053E32E00001A1C404BE20400A0E104308C93 -S2190220FFE21C300BE520104BE2F8FBFFEB000050E33700000AF9 -S2190221141C201BE50130D2E4FF3003E21C200BE52C0053E331B9 -S21902212900001A0400A0E124104BE2EDFBFFEB000050E32C0069 -S21902213E000A20001BE524101BE50020E0E399FFFFEB80309F73 -S219022153E5004093E50010A0E1000054E30B00000A70209FE5E2 -S2190221680030D2E50510A0E1000053E30300000A0130C1E401C4 -S21902217D30F2E5000053E3FBFFFF1A0030A0E30030C1E5170056 -S21902219200EA010085E22020A0E3ECFBFFEB0060C5E5010080C0 -S2190221A7E20040C5E7100000EA1C301BE50020D3E50300A0E1AC -S2190221BC4C0052E30210A0E10A00000A040000CA430052E30396 -S2190221D10000EA742403001804030094E70200500051E302004B -S2190221E6000A0510A0E14B2FA0E3AF0200EB70A81BE90DC0A01B -S2190221FBE100D82DE90030D0E504B04CE2700053E30200000A80 -S21902221008109FE54B2FA0E3AA0200EB00A81BE9742403000D2E -S219022225C0A0E100D82DE90C309FE5002093E504B04CE2000133 -S21902223A92E700A81BE9240403000DC0A0E100D82DE90C309F21 -S21902224FE5002093E504B04CE2001182E700A81BE924040300C3 -S2190222640DC0A0E100D82DE920309FE5182093E50010A0E1000D -S2190222790092E5FF1001E20C3092E504B04CE20FE0A0E103F0E8 -S21902228EA0E100A81BE9500000000DC0A0E100D82DE91C309F90 -S2190222A3E5182093E5000092E5103092E504B04CE20FE0A0E10A -S2190222B803F0A0E1FF0000E200A81BE9500000000DC0A0E1006B -S2190222CDD82DE924309FE504B04CE218C093E500109CE500204C -S2190222E2A0E10100A0E114309CE50010A0E30FE0A0E103F0A082 -S2190222F7E100A81BE9500000000DC0A0E100D82DE9000050E37F -S21902230C04B04CE20F00000A70209FE5003092E5013043E200A9 -S2190223213082E5000053E3160000CA0030A0E3003082E5542035 -S2190223369FE5183092E5000093E5142093E50510A0E30FE0A0FD -S21902234BE102F0A0E100A81BE930209FE5003092E5013083E265 -S219022360003082E5010053E30600001A1C309FE5182093E500F3 -S2190223750092E5143092E50410A0E30FE0A0E103F0A0E100A8F7 -S21902238A1BE928040300500000000DC0A0E100D82DE91C309F8D -S21902239FE5182093E5000092E5103092E504B04CE20FE0A0E10D -S2190223B403F0A0E1FF0000E200A81BE9500000000DC0A0E1F07E -S2190223C9DF2DE9FF1001E20D0051E304B04CE204D04DE2730078 -S2190223DE000A70319FE570219FE5000093E50010C2E7010080ED -S2190223F3E2000083E50A0051E30100000A640050E36900001A21 -S21902240850519FE5186095E500900FE100400FE1C04084E30486 -S21902241DF029E13C019FE50D0800EB000096E50C3096E5241082 -S219022432A0E30FE0A0E103F0A0E1000096E54F80A0E30C309688 -S219022447E50810A0E10FE0A0E103F0A0E1FC309FE5002093E5CF -S21902245C0070A0E3020057E1180000AAF8A09FE5E8209FE507C6 -S21902247130D2E72342DAE7000096E50F3003E20350DAE70C3051 -S21902248696E50410A0E10FE0A0E103F0A0E1000096E5017087D3 -S21902249BE20C3096E50510A0E10FE0A0E103F0A0E1044088E066 -S2190224B0FF8004E29C209FE5055088E0003092E5FF8005E2039E -S2190224C50057E1E7FFFFBA000096E50C3096E52310A0E30FE04D -S2190224DAA0E103F0A0E180309FE5000096E52812D3E70C20968C -S2190224EFE50FE0A0E102F0A0E168209FE5000096E50F3008E259 -S2190225040310D2E70C3096E50FE0A0E103F0A0E1000096E510C9 -S2190225193096E50FE0A0E103F0A0E129004BE529305BE52B00FA -S21902252E53E31000000A29004BE20110A0E32B0300EB000050EE -S219022543E30800001A29305BE52D0053E3EFFFFF1AB3FFFFEAD9 -S2190225582C0403006031030050000000B0250200A4E7020030BC -S21902256D209FE50130A0E3443082E528209FE50030A0E3003070 -S21902258282E520009FE5D50700EB00300FE1C04009E2C030C3AD -S219022597E3043083E103F029E1020000EA500000002C04030041 -S2190225ACB0250200F0AF1BE90DC0A0E170D82DE904B04CE2010A -S2190225C160A0E10240A0E10430A0E1014044E2000053E30050B8 -S2190225D6A0E10600000A0110D6E40500A0E176FFFFEB0430A0D4 -S2190225EBE1014044E2000053E3F8FFFF1A70A81BE90DC0A0E1DC -S21902260070D82DE904B04CE20160A0E10240A0E10430A0E10123 -S2190226154044E2000053E30050A0E10600000A0500A0E159FF4E -S21902262AFFEB0430A0E1014044E20100C6E4000053E3F8FFFFB7 -S21902263F1A70A81BE90DC0A0E10E002DE900D82DE90000A0E366 -S21902265410B04CE200A81BE90DC0A0E170D82DE90000A0E3049D -S219022669B04CE223FFFFEBB4C09FE5B4509FE5B4E09FE5B460BF -S21902267E9FE50020A0E3B0109FE50C40A0E1000091E5023190CF -S219022693E702318CE7012082E20A0052E3FAFFFFDA001091E582 -S2190226A82C3091E52C308CE5402091E530208CE5303091E534D6 -S2190226BD308CE5342091E538208CE5383091E53C308CE5000012 -S2190226D2A0E33C3091E51C208CE20C10A0E164308CE540008279 -S2190226E7E5042042E2010052E1FBFFFFAA00309EE5004085E576 -S2190226FC000053E30400000A0030A0E300308EE50F00A0E3C3D3 -S219022711FEFFEB720700EB0F00A0E3C0FEFFEB6F0700EB0000C5 -S21902272686E570A81BE9F0C103002404030044040300C8C20359 -S21902273B0058C203000DC0A0E100D82DE904B04CE260109FE553 -S2190227500000A0E301E0A0E158C09FE500209EE500319CE70095 -S2190227653182E7010080E20A0050E3F9FFFFDA001091E52C306B -S21902277A9CE52C3081E530209CE5402081E534309CE5303081A3 -S21902278FE538209CE5342081E53C309CE5383081E564209CE5F6 -S2190227A43C2081E50100A0E3D3FEFFEB00A81BE958C20300F05F -S2190227B9C103000DC0A0E100D82DE90000A0E304B04CE200A8F7 -S2190227CE1BE90DC0A0E100D82DE930209FE530309FE530109F18 -S2190227E3E5003082E52C309FE52C209FE5003081E528309FE53C -S2190227F828109FE5003082E524309FE504B04CE2003081E50022 -S21902280DA81BE908040300BC27020004040300F82802001004CE -S21902282203005C2602000C040300402702000DC0A0E170D82DD4 -S219022837E99C209FE5006092E504B04CE2000056E32200001A2E -S21902284C0130A0E3003082E584509FE55C0800EB343095E500A0 -S21902286100E0E30FE0A0E103F0A0E10040A0E1343095E5020013 -S219022876E0E30FE0A0E103F0A0E1141095E558309FE558209FDE -S21902288BE5043081E554309FE5082081E50C3081E54C209FE58A -S2190228A04C309FE5102081E5143081E5020074E3000054130319 -S2190228B500000A343095E50400A0E10FE0A0E103F0A0E1303056 -S2190228CA95E50600A0E10FE0A0E103F0A0E170A81BE9300403BA -S2190228DF0050000000B4250200FC250200C423020094230200ED -S2190228F4442602000DC0A0E100D82DE918309FE5403093E50468 -S219022909B04CE2000053E30100000A0FE0A0E103F0A0E100A807 -S21902291E1BE9500000000DC0A0E1F0D82DE95430A0E304B04C16 -S219022933E204D04DE20150A0E10570A0E10040A0E10130C7E43E -S2190229484402A0E11EF8FFEB0100C5E5017087E20400A0E11A88 -S21902295DF8FFEB0100C7E40000A0E317F8FFEB0100C7E40F0099 -S219022972A0E314F8FFEB0100C7E43A60A0E30160C7E40F00A04C -S219022987E325FEFFEB0710A0E10420A0E30030A0E320000BE542 -S21902299C20504BE20500A0E11BF9FFEB0070A0E13B40A0E3010E -S2190229B140C7E40000A0E303F8FFEB0100C7E40D00A0E300F883 -S2190229C6FFEB0100C7E40160C7E40D00A0E312FEFFEB0710A012 -S2190229DBE10420A0E320000BE50030A0E30500A0E109F9FFEB23 -S2190229F00070A0E10140C7E40030A0E30030C7E5F0A81BE90DB6 -S219022A05C0A0E100D82DE904B04CE2030050E300F19F9728001F -S219022A1A00EAC02A02002C2A0200402A02006C2A0200101F112E -S219022A2FEE011A81E3031081E3101F01EE1F0000EA101F11EE52 -S219022A44011AC1E3101F01EE151F07EE0000A0E10000A0E1006E -S219022A5900A0E10000A0E10000A0E10000A0E1140000EA0E024F -S219022A6EA0E3021A80E2202090E4000031E1FCFFFF1A160F0745 -S219022A83EE9A0F07EE0000A0E10000A0E10000A0E10000A0E1A7 -S219022A980000A0E10000A0E1151F07EE151F08EE0000A0E1004C -S219022AAD00A0E10000A0E10000A0E10000A0E10000A0E1100F69 -S219022AC211EE2006A0E1010000E200A81BE90DC0A0E100D82D70 -S219022AD7E904B04CE2030050E300F19F97190000EA502B02003B -S219022AECF82A0200082B02001C2B0200101F11EE0F1081E3106B -S219022B011F01EE110000EA101F11EE0C10C1E3101F01EE161F6E -S219022B1607EE0C0000EA0E02A0E3021A80E2202090E4000031C2 -S219022B2BE1FCFFFF1A160F07EE9A0F07EE0000A0E10000A0E1DF -S219022B400000A0E10000A0E10000A0E10000A0E1100F11EE2037 -S219022B5501A0E1010000E200A81BE90DC0A0E170D82DE9D020B7 -S219022B6A9FE5D0409FE504B04CE2CCC09FE50130A0E300308CD5 -S219022B7FE5C4309FE50260A0E1003082E50C50A0E1003094E5DD -S219022B9404C0A0E1000053E32200000A04E0A0E100309EE50363 -S219022BA90053E30900009A030011E30700001A030010E3050024 -S219022BBE001A043090E4043081E400209EE5042042E200208E07 -S219022BD3E5110000EA00309CE5010053E30900009A010011E386 -S219022BE80700001A010010E30500001AB230D0E0B230C1E00088 -S219022BFD309CE5023043E200308CE5040000EA0120D0E401202F -S219022C12C1E400309EE5013043E200308EE5003094E500005359 -S219022C27E3DDFFFF1A0030A0E3003085E50030A0E3003086E51E -S219022C3C70A81BE934040300C431030018040300342C02000D9F -S219022C51C0A0E130D82DE90030A0E10100A0E10310A0E11840E9 -S219022C669FE50250A0E1005084E504B04CE2B9FFFFEB0000942A -S219022C7BE5050060E030A81BE9C43103000DC0A0E130D82DE9D3 -S219022C9018409FE50250A0E1005084E504B04CE2AEFFFFEB0047 -S219022CA50094E5050060E030A81BE9C43103000DC0A0E100D85B -S219022CBA2DE90000A0E304B04CE200A81BE90DC0A0E100D82D84 -S219022CCFE90000A0E304B04CE200A81BE90DC0A0E100D82DE9B3 -S219022CE40000A0E304B04CE200A81BE90DC0A0E100D82DE90186 -S219022CF900A0E304B04CE200A81BE90DC0A0E100D82DE9010071 -S219022D0EA0E304B04CE200A81BE90DC0A0E100D82DE904B04C5C -S219022D23E267F6FFEB00A81BE90DC0A0E110D82DE904B04CE291 -S219022D3800300FE100400FE1C04084E304F029E108209FE5011D -S219022D4D30A0E3003082E5FEFFFFEA0000039010A81BE90DC01E -S219022D62A0E100D82DE904B04CE2EEFFFFEB0000A0E300A81BE7 -S219022D77E90DC0A0E100D82DE90000A0E304B04CE200A81BE90A -S219022D8C0DC0A0E170D82DE904B04CE20040A0E10000A0E30158 -S219022DA160A0E30010A0E1020074E30D00000A020000CA030063 -S219022DB674E30F00000A100000EA010074E30E00001ABC309F8C -S219022DCBE5003093E5000053E3016043E20B0000CA0360A0E1EA -S219022DE00260E003080000EAA0309FE598209FE5180083E50090 -S219022DF54082E5030000EA0040A0E1000000EA014084E20110CB -S219022E0AA0E3000051E31B00000A74509FE5183095E500005373 -S219022E1FE30400000A000093E5143093E50410A0E30FE0A0E16B -S219022E3403F0A0E154309FE548209FE5843283E0183085E5004F -S219022E494082E5183095E5000050E30500000A000093E5143006 -S219022E5E93E50510A0E30FE0A0E103F0A0E1040000EA000093E3 -S219022E73E5143093E50410A0E30FE0A0E103F0A0E10600A0E1A0 -S219022E8870A81BE93804030050000000C83103000DC0A0E10039 -S219022E9DD82DE90010A0E304B04CE201C0A0E3020070E30D0010 -S219022EB2000A020000CA030070E30F00000A100000EA01007054 -S219022EC7E30E00001A64309FE5003093E5000053E301C043E208 -S219022EDC0B0000CA03C0A0E102C0E003080000EA48309FE540EE -S219022EF1209FE5141083E5000082E5030000EA0100A0E10000BF -S219022F0600EA010080E20110A0E3000051E30500000A18309FA4 -S219022F1BE51C209FE5000083E510309FE5802282E0142083E529 -S219022F300C00A0E100A81BE93C04030050000000C83103000DB0 -S219022F45C0A0E100D82DE904B04CE200A81BE90DC0A0E100D88D -S219022F5A2DE904B04CE200A81BE90DC0A0E110D82DE904B04C6B -S219022F6FE22C409FE5950600EB303094E50000E0E30FE0A0E1E2 -S219022F8403F0A0E1000050E30300000A343094E50000A0E30F0E -S219022F99E0A0E103F0A0E110A81BE9500000000DC0A0E110D805 -S219022FAE2DE9FF1000E258309FE504B04CE2142093E50340A083 -S219022FC3E1000052E30400000A000092E50C3092E50FE0A0E134 -S219022FD803F0A0E1040000EA182094E5000092E50C3092E50F91 -S219022FEDE0A0E103F0A0E1443094E5000053E30300000A0000C3 -S219023002A0E3880000EB0030A0E3443084E510A81BE950000020 -S219023017000DC0A0E100D82DE930209FE5181092E5003092E547 -S21902302C04B04CE2130053E30600001A1430A0E3003082E500DF -S2190230410091E5143091E50510A0E30FE0A0E103F0A0E100A81F -S2190230561BE9500000000DC0A0E110D82DE90030A0E350209FFC -S21902306BE504B04CE204D04DE214300BE518E092E500309EE529 -S2190230800020A0E10300A0E10130A0E118C09EE514104BE20FA2 -S219023095E0A0E10CF0A0E114301BE50040A0E1000053E3020004 -S2190230AA000A10309FE5000093E55C0000EB0400A0E1010000F7 -S2190230BFEA50000000CCC2030010A81BE90DC0A0E1F0D82DE942 -S2190230D4E0009FE5E0609FE50020A0E3DC509FE504B04CE2D8AB -S2190230E9709FE50510A0E10231A0E1012082E2030081E73F005E -S2190230FE52E3FAFFFFDAC0C09FE50030A0E3A8009FE501108338 -S219023113E28332A0E10720A0E303008CE7012052E2043083E27A -S219023128FBFFFF5A0130A0E1020053E3F5FFFFDA90209FE5133A -S21902313D30A0E3003085E5042085E584309FE584209FE5083003 -S21902315285E5402085E57C309FE57C209FE5103085E548208546 -S219023167E574309FE5306085E570209FE5347085E5203085E569 -S21902317C0140E0E31C2085E50400A0E10FE0A0E106F0A0E1041D -S21902319100A0E10FE0A0E107F0A0E10030A0E3243085E54020E8 -S2190231A69FE5283085E54C3085E5443085E58C2085E5F0A81B3A -S2190231BBE9782D02008C2D020050000000982E0200C831030099 -S2190231D028010300200000002C2D0200602D0200182D02004422 -S2190231E52F0200542F0200684502000DC0A0E100D82DE900002D -S2190231FA51E304B04CE20700000A011041E20130D0E703005320 -S21902320FE30100001A0100A0E300A81BE9000051E3F7FFFF1A32 -S2190232240000A0E300A81BE90DC0A0E100D82DE9000050E31CD4 -S219023239109FE504B04CE23810901514309FE58C2093E5010029 -S21902324EA0E10FE0A0E102F0A0E100A81BE95832020050000078 -S219023263000DC0A0E130D82DE90020E0E304B04CE258C09FE582 -S2190232780040A0E100309CE50150A0E1140053E30600001A1874 -S21902328D309CE5000093E5142093E50610A0E30FE0A0E102F055 -S2190232A2A0E10020A0E1020054E10400001A0400A0E10510A05F -S2190232B7E167FFFFEB000050E30200001A0400A0E10510A0E160 -S2190232CCC7F4FFEB30A81BE9500000000DC0A0E110D82DE9FFCA -S2190232E10000E204B04CE20040A0E10A0054E30100001A0D00E3 -S2190232F6A0E32AFFFFEB0400A0E128FFFFEB10A81BE90DC0A067 -S21902330BE110D82DE90040A0E10030D4E504B04CE2000053E305 -S2190233200400000A0000D4E5EAFFFFEB0130F4E5000053E3FABD -S219023335FFFF1A10A81BE90DC0A0E100D82DE90030A0E3101099 -S21902334AA0E32B20A0E304D04DE200308DE504B04CE24400004B -S21902335FEB00A81BE90DC0A0E1F0DF2DE904B04CE224D04DE283 -S2190233740150A0E10040A0E129104BE24C300BE548A04BE204BF -S219023389309BE50A00A0E1000053E32090A0033090A013019060 -S21902339E41E4000051E1FCFFFFAA0080A0E3053094E103000068 -S2190233B31A3030A0E348304BE5018088E2150000EA053094E1C5 -S2190233C81300000A0260A0E10070A0E30510A0E10400A0E107D4 -S2190233DD30A0E10620A0E1732B00EB68309FE50010D3E70810F5 -S2190233F2CAE70730A0E10620A0E10510A0E10400A0E10180888B -S219023407E2072A00EB0150A0E10040A0E1053094E1EDFFFF1A69 -S21902341C08309BE5080053E10380A0A14C301BE52D0053E306F7 -S21902343100001A013048E20320DAE7090052E10380A0014C304A -S2190234461BE50830CAE7050000EA018048E2030000EAB8E70259 -S21902345B000800DAE7018048E29BFFFFEB000058E3FAFFFFAA80 -S219023470F0AF1BE90DC0A0E100D82DE908D04DE200308DE504B4 -S219023485B04CE204309BE501C0A0E104308DE50010A0E30230EC -S21902349AA0E10C20A0E1AFFFFFEB00A81BE90DC0A0E100D82D51 -S2190234AFE9000050E304B04CE201C0A0E31500000A0010A0E10F -S2190234C40030D1E5000053E31000000A44E09FE5013060E00E8F -S2190234D90053E10020D1E500C0A0A30D0052E30A005213020017 -S2190234EE000A203042E25E0053E300C0A083011081E200005CFD -S219023503E30200000A0030D1E5000053E3EFFFFF1A0C00A0E10D -S21902351800A81BE9010100000DC0A0E1F0DF2DE904B04CE20CC8 -S21902352DD04DE20060A0E12C100BE5DAFFFFEB004050E2170129 -S219023542001AA4039FE56EFFFFEB0600A0E179FFFFEB98039FAE -S219023557E56AFFFFEB2000A0E35CFFFFEB2C301BE5040193E75D -S21902356C72FFFFEB014084E2070054E3F7FFFFDA74039FE560D9 -S219023581FFFFEB090100EA0040D6E5250054E30200000A0400EA -S219023596A0E14EFFFFEBFF0000EA0070A0E32BC0A0E30140F6E0 -S2190235ABE50710A0E1300054E30090A0130190A003303044E223 -S2190235C0090053E30600008A073187E0833084E00140F6E5301E -S2190235D57043E2302044E2090052E3F8FFFF9A6C0054E303005B -S2190235EA001A0140F6E56C0054E30110A0030140F60525304463 -S2190235FFE2530053E303F19F97E00000EA8439020090390200C7 -S21902361490390200903902009039020090390200903902009013 -S21902362939020090390200903902009039020090390200903955 -S21902363E02009039020090390200903902009039020090390277 -S21902365300903902009039020090390200903902009039020064 -S219023668903902009039020090390200903902009039020090BF -S21902367D39020054390200103802005C370200903902009039F4 -S21902369202009039020090390200903902009039020090390223 -S2190236A700903902009039020090390200903902009039020010 -S2190236BC90390200903902002C380200903902009039020090D0 -S2190236D139020090390200B83702009039020090390200903987 -S2190236E6020090390200903902009039020090390200903902CF -S2190236FB009039020054390200103802005C37020090390200AF -S21902371090390200903902009039020090390200903902009016 -S21902372539020090390200903902009039020090390200903958 -S21902373A020090390200903902002C38020090390200903902DF -S21902374F009039020090390200B8370200000051E30B00000A8E -S2190237642C301BE50300B3E82C300BE5000051E3020000AA0023 -S2190237790070E20010E1E22DC0A0E30A20A0E300908DE50C30B4 -S21902378EA0E1100000EA2C301BE5040093E42C300BE500005031 -S2190237A3E3000060B22DC0A0B30A10A0E30C20A0E1100000EA91 -S2190237B8000051E30900000A00908DE50C30A0E12CC01BE50300 -S2190237CD00BCE82CC00BE51020A0E304708DE5016086E2DFFE21 -S2190237E2FFEB6E0000EA0C20A0E12CC01BE504009CE41010A0AC -S2190237F7E32CC00BE50930A0E100708DE5016086E219FFFFEB90 -S21902380C640000EA2C301BE50000D3E5043083E22C300BE50158 -S2190238216086E2ABFEFFEB5D0000EA0050A0E32CC01BE50580A5 -S219023836A0E104409CE405A0A0E12CC00BE5050054E1AC409F6A -S21902384B050C00000A0400A0E113FFFFEB000050E30800001A70 -S21902386098009FE50A90A0E1A6FEFFEB0400A0E1B1FEFFEB1950 -S2190238753047E2190057E30370A0C17C409FE50530D4E7016026 -S21902388A86E2000053E30300000A015085E20530D4E70000537C -S21902389FE3FBFFFF1A000057E3070055110750A0C1000059E37C -S2190238B40780651007A065000830A0E1018048E2000053E30155 -S2190238C9704AE2050000DA2000A0E37FFEFFEB0830A0E1018024 -S2190238DE48E2000053E3F9FFFFCA0030D4E5080000EACCE7021D -S2190238F300E4E70200E8E70200ECE70200F4E7020008E8020077 -S2190239080000D4E571FEFFEB0130F4E5000053E30200000A0144 -S21902391D5045E2010075E3F7FFFF1A0A30A0E107A0A0E10000CC -S21902393253E31A0000DA2000A0E365FEFFEB0A30A0E101A04AB9 -S219023947E2000053E3F9FFFFCA130000EA000057E32C301BE5F8 -S21902395C014047121F40A003005093E55534A0E1010013E32EBC -S21902397100A0033100A01356FEFFEB014044E2F8FFFFEA250009 -S219023986A0E352FEFFEB030000EA2500A0E34FFEFFEB0400A0F8 -S21902399BE14DFEFFEB016086E20030D6E5000053E3F5FEFF1A04 -S2190239B0F0AF1BE90DC0A0E10F002DE900D82DE914B04CE220E5 -S2190239C5D04DE208309BE50C209BE504009BE52C300BE528206B -S2190239DA0BE510309BE514209BE524300BE520200BE518309B16 -S2190239EFE51C209BE51C300BE518200BE520309BE524209BE523 -S219023A0414300BE510200BE52C104BE2C2FEFFEB00A81BE90D86 -S219023A19C0A0E1F0DF2DE904B04CE20060A0E1060051E10670FA -S219023A2E41800170A091000057E30290A0E13B0000DA0000595E -S219023A43E30300000AE4009FE5061069E0D7FFFFEB020000EA04 -S219023A58D4009FE50610A0E1D3FFFFEB0050A0E3108047E2100B -S219023A6DA086E2070055E1030000AAB8009FE50510D6E7CBFF73 -S219023A82FFEB010000EAAC009FE5C8FFFFEBC54FA0E105306444 -S219023A97E00130C3E3053063E0010053E30100001A90009FE57E -S219023AACC0FFFFEBA43EA0E1033085E00730C3E3053063E007FE -S219023AC10053E30100001A70009FE5B8FFFFEB015085E20F003C -S219023AD655E3E4FFFFDA60009FE5B3FFFFEB0050A0E307005531 -S219023AEBE1040000AA0510D6E7203041E25E0053E32E10A083F6 -S219023B00000000EA2010A0E338009FE5A8FFFFEB015085E20FF8 -S219023B150055E3F2FFFFDA28009FE5A3FFFFEB0A60A0E10070FF -S219023B2A58E2C3FFFFCAF0AF1BE90CE8020014E802001CE8021D -S219023B3F0020E8020024E8020028E802002CE802000DC0A0E1DC -S219023B5400D82DE90020A0E304B04CE2ACFFFFEB00A81BE90D94 -S219023B69C0A0E100D82DE904B04CE2FAFCFFEB00A81BE90DC0D6 -S219023B7EA0E100D82DE9030040E204B04CE2040050E300F19FEE -S219023B9397080000EAAC3B0200AC3B0200AC3B0200B43B0200E1 -S219023BA8B43B02000A00A0E300A81BE90200A0E300A81BE905A1 -S219023BBD00A0E300A81BE90DC0A0E100D82DE90C309FE50020A1 -S219023BD293E504B04CE2440092E500A81BE958C203000DC0A08C -S219023BE7E100D82DE90010A0E10F00A0E304B04CE291F9FFEB7A -S219023BFC00A81BE90DC0A0E110D82DE904B04CE20040A0E119F9 -S219023C1100A0E382F9FFEB0020A0E3244EA0E10F0054E304F1DE -S219023C269F97560000EA6C3C0200783C0200803C02008C3C0224 -S219023C3B00943C02009C3C0200A83C0200B43C0200C43C0200E7 -S219023C50D83C0200E83C0200083D0200283D0200543D02007C5F -S219023C653D0200843D0200202FA0E1012002E2430000EA202FF0 -S219023C7AA0E10D0000EAA02EA0E1012002E23E0000EAA02EA0CC -S219023C8FE1080000EAA02FA0E13A0000EA0020E0E1A22FA0E19F -S219023CA4370000EA202EA0E1012002E2340000EA202EA0E10121 -S219023CB92022E2012002E2300000EA062200E2020252E3002049 -S219023CCEA0130120A0032B0000EA062200E2022252E20120A02B -S219023CE313270000EA092200E2000052E30030A0130130A003A8 -S219023CF8090252E30320A0110120A0031F0000EA092200E201C1 -S219023D0D0252E30030A0130130A003020152E30320A01101207F -S219023D22A003170000EA093200E2000053E309025313202FA02E -S219023D37E1012022E20030A0130130A003000053E30120021248 -S219023D4C0020A0030C0000EA093200E2010253E30201531320C3 -S219023D612FA0E10030A0130130A003000053E301200202012063 -S219023D76A013020000EA0120A0E3000000EA0020A0E30200A0BF -S219023D8BE110A81BE90DC0A0E130D82DE904B04CE20050A0E160 -S219023DA00F0005E21EF9FFEB0040A0E1100015E30200001A3EED -S219023DB53D05E2C303A0E1020000EA0F0C05E22004A0E115F9E6 -S219023DCAFFEB603005E2C332A0E1030053E303F19F9713000090 -S219023DDFEAF03D0200F83D0200003E0200083E02001440A0E11B -S219023DF40D0000EA3440A0E10B0000EA5440A0E1090000EA00CA -S219023E090050E30600001AA440A0E11900A0E301F9FFEB020261 -S219023E1E10E3023184E30340A011000000EA7440A0E10400A044 -S219023E33E130A81BE90DC0A0E1F0D82DE904B04CE20040A0E1E7 -S219023E480150A0E1033305E2233DA0E1030053E303F19F97B972 -S219023E5D0000EA703E0200F03F0200A440020000400200D8225C -S219023E729FE5FF32C5E3020053E10200001A0F0005E2E6F8FFB2 -S219023E87EBF0A81BE9047084E20F3A05E20F0A53E35200001AD3 -S219023E9CB0329FE5B0229FE5033005E0020053E14D00000A0F9A -S219023EB10805E22008A0E1D9F8FFEB0060A0E1020415E30400BF -S219023EC6001A050AA0E1200AA0E1AEFFFFEB0040A0E103000030 -S219023EDBEAFF4005E20F3C05E2A333A0E17443A0E11E3605E2BF -S219023EF0A33AA0E10F0053E303F19F97390000EA403F020048FD -S219023F053F0200503F0200583F0200603F0200683F0200843F28 -S219023F1A0200A83F0200E83F0200E83F0200E83F0200E83F02FC -S219023F2F00CC3F0200D43F0200DC3F0200E43F0200047006E0B8 -S219023F44270000EA047026E0250000EA067064E0230000EA04FC -S219023F597066E0210000EA047086E01F0000EA1900A0E3ACF868 -S219023F6EFFEBA00EA0E1010000E2043086E0007083E0180000B6 -S219023F83EA1900A0E3A5F8FFEBA00EA0E1010000E2063064E089 -S219023F98000050E30370A011017043020F0000EA1900A0E39CCF -S219023FADF8FFEBA00EA0E1010000E2043066E0000050E30370E4 -S219023FC2A01101704302060000EA047086E1040000EA0470A0AF -S219023FD7E1020000EA0470C6E1000000EA0470E0E10700A0E13F -S219023FECF0A81BE964219FE5023005E0020053E10100001A04A8 -S2190240010084E2F0A81BE9010615E3FBFFFF0A0F3A05E20F0A56 -S21902401653E3F8FFFF1A0F4805E22408A0E17EF8FFEB08308045 -S21902402BE20F0854E30060A0110360A001010415E31600000A17 -S219024040020415E30900001A020515E30300000A053AA0E12354 -S2190240553AA0E1036086E00E0000EA053AA0E1233AA0E10660CF -S21902406A63E00A0000EA020515E30400000A050AA0E1200AA09C -S21902407FE142FFFFEB006086E0030000EA050AA0E1200AA0E12B -S2190240943DFFFFEB066060E0000096E5F0A81BE9027415E21AA6 -S2190240A900001A010615E3D2FFFF0A020915E3D0FFFF0A0F48D6 -S2190240BE05E22408A0E156F8FFEB083080E20F0854E30060A032 -S2190240D3110360A00107C0A0E10C20A0E178309FE5020505E2AD -S2190240E8031005E05132A0E1010013E301C08C12012082E20ED7 -S2190240FD0052E3F9FFFFDA000050E30C618610E2FFFF1A04600D -S21902411246E2E0FFFFEA0500A0E1B7FEFFEB000050E3B5FFFF96 -S2190241270AFF34C5E30311A0E1020515E33F0381E308008012C3 -S21902413C08008102000084E0F0A81BE90000A0E3F0A81BE910AD -S219024151FF2F010000BF0F00000F0110000002FFFF00000DC068 -S219024166A0E170D82DE90118A0E14128A0E1211EA0E1041041C5 -S21902417BE204B04CE20060A0E1023086E2015083E30B0051E3F3 -S21902419001F19F973E0000EAC841020094420200944202009474 -S2190241A542020094420200944202009442020094420200944284 -S2190241BA0200F441020028420200604202000228A0E1C8309F5E -S2190241CFE52208A0E1033002E0470453E32C00001A780000E20E -S2190241E4A001A0E10DF8FFEB0050A0E1270000EA0238A0E10F02 -S2190241F90403E20002A0E12348A0E17DFEFFEB000050E320009A -S21902420E000AFF3004E28300A0E1800014E3800BE011A00BE0F3 -S21902422311090000EA0238A0E1020313E32318A0E11600001AD9 -S219024238813AA0E1A33AA0E18300A0E1010B11E3800AE011A0B1 -S21902424D0AE011043080E2033086E0015083E30C0000EA3E1B25 -S219024262E0E30228A0E1013802E02302A0E1010312E38004E0B4 -S21902427711A004E011B230D6E1013003E0830080E1042080E26E -S21902428C022086E0015082E30500A0E170A81BE9000087FF0DA3 -S2190242A1C0A0E130D82DE90F00A0E304B04CE2DBF7FFEB004032 -S2190242B6A0E11900A0E3D8F7FFEB200010E30600000A0400A04F -S2190242CBE1B010D0E1A3FFFFEB88309FE5000083E580109FE541 -S2190242E00F0000EA005094E50500A0E143FEFFEB000050E30616 -S2190242F500000A0400A0E10510A0E15C409FE5CBFEFFEB0000B5 -S21902430A84E550109FE5030000EA48209FE5043084E20210A025 -S21902431FE1003082E5004091E5010014E30600000A30309FE568 -S2190243340120C4E3B000D2E128109FE5B000C3E1B010C2E1309F -S219024349A81BE91C309FE5002094E518109FE5002083E50010FF -S21902435E84E530A81BE9400403002C320300BEBEFFFF2832037F -S21902437300FEDEFFE70DC0A0E100D82DE944309FE50300A0E1B4 -S219024388001093E504B04CE2000051E30B00000A010011E3046D -S21902439D00000A28209FE5B020D2E10130C1E3B020C3E1020060 -S2190243B200EA18309FE5002093E5002081E50030A0E3003080B8 -S2190243C7E500A81BE9400403002C320300283203000DC0A0E1F6 -S2190243DC00D82DE904B04CE200A81BE90DC0A0E100D82DE90409 -S2190243F1B04CE200A81BE90DC0A0E100D82DE90F00A0E304B0A4 -S2190244064CE285F7FFEB0C309FE5030050E10000A0130100A0BE -S21902441B0300A81BE9280602000DC0A0E110D82DE90F00A0E3C8 -S21902443004B04CE27AF7FFEB0040A0E11900A0E377F7FFEB205E -S2190244450010E302408412044084020F00A0E30410A0E179F72F -S21902445AFFEB10A81BE90DC0A0E100D82DE964109FE504B04C6C -S21902446FE260C09FE500209CE50030A0E3003081E5030052E18B -S2190244841100001A010010E30600000A00008CE540309FE50187 -S21902449900C0E3B020D0E1B420CCE1B030C0E1040000EA0000F3 -S2190244AE8CE528209FE5003090E504308CE5002080E50300A043 -S2190244C3E381F9FFEB0300A0E34CF9FFEB00A81BE944040300EA -S2190244D830320300BEBEFFFFFEDEFFE70DC0A0E100D82DE96C7F -S2190244ED309FE504B04CE200C093E500005CE30100000A00009B -S219024502A0E300A81BE954209FE5001092E50130C1E3030050C7 -S219024517E10E00001A010011E30200000AB430D2E1B030C0E166 -S21902452C010000EA043092E5003080E50030A0E3003082E503FB -S21902454100A0E361F9FFEB0300A0E32CF9FFEB0100A0E300A8D6 -S2190245561BE90C00A0E100A81BE944040300303203000DC0A0EF -S21902456BE130D82DE984209FE50030A0E380509FE504B04CE224 -S219024580001095E50040A0E1003082E5030051E10100000A01FC -S21902459500A0E1D1FFFFEB003095E5000053E31300001A1900A9 -S2190245AAA0E31CF7FFEB200010E30600000A013084E300308505 -S2190245BFE53C209FE5B030D4E1B430C5E1B020C4E1040000EA99 -S2190245D4004085E528209FE5003094E5043085E5002084E50382 -S2190245E900A0E337F9FFEB0300A0E302F9FFEB30A81BE944048A -S2190245FE030030320300BEBEFFFFFEDEFFE70DC0A0E100D82DAA -S219024613E910309FE5000093E504B04CE2000050E20100A0139E -S21902462800A81BE9303203000DC0A0E100D82DE9001090E500A4 -S21902463D00A0E30C0081E51C30A0E31C3081E50820A0E3002020 -S21902465281E504B04CE2040081E5173043E2083081E505204229 -S219024667E20C2081E500A81BE90DC0A0E100D82DE9000090E566 -S21902467CFF1001E2203090E504B04CE2040013E30200001A2053 -S2190246913090E5040013E3FCFFFF0A141080E500A81BE90DC068 -S2190246A6A0E100D82DE9000090E5203090E504B04CE202301328 -S2190246BBE20500000A143090E50030C1E50420A0E31C2080E51B -S2190246D00100A0E300A81BE90300A0E100A81BE90DC0A0E130F0 -S2190246E5D82DE904B04CE204D04DE20050A0E115404BE205008E -S2190246FAA0E10410A0E1E7FFFFEB000050E3FAFFFF0A15005B19 -S21902470FE530A81BE90DC0A0E170D82DE904B04CE20160A0E15D -S2190247240240A0E10430A0E1014044E2000053E30050A0E1068D -S21902473900000A0110D6E40500A0E1C9FFFFEB0430A0E1014061 -S21902474E44E2000053E3F8FFFF1A70A81BE90DC0A0E170D82D04 -S219024763E904B04CE20160A0E10240A0E10430A0E1014044E2AE -S219024778000053E30050A0E10600000A0500A0E1D4FFFFEB04C7 -S21902478D30A0E1014044E20100C6E4000053E3F8FFFF1A70A8EF -S2190247A21BE90DC0A0E1F0D82DE904B04CE20050A0E10430954F -S2190247B7E50160A0E13C709FE5033183E08340A0E1030000EA27 -S2190247CC483097E56400A0E30FE0A0E103F0A0E10500A0E10686 -S2190247E110A0E1AEFFFFEB000050E30200001A014044E20100DD -S2190247F674E3F3FFFF1AF0A81BE9500000000DC0A0E10E002DD0 -S21902480BE910D82DE910B04CE204309BE50040A0E3043043E2EC -S219024820030053E303F19F971E0000EA644802003C480200904D -S2190248354802009C48020054209FE50130A0E3003082E50010E4 -S21902484A90E50C3091E5083083E30C3081E5080090E5F2EFFF8E -S21902485FEB100000EA2C209FE5004092E50030A0E3003082E587 -S219024874001090E50C3091E50830C3E30C3081E5080090E5DB19 -S219024889EFFFEB050000EA084090E5030000EA60040300083002 -S21902489E9BE5044090E5043080E50400A0E110A81BE90DC0A07E -S2190248B3E170D82DE904B04CE204D04DE200C090E520409CE5AF -S2190248C814309CE519304BE50420A0E31C208CE50050A0E30867 -S2190248DD0090E50160A0E1830000EB005086E5020014E3060040 -S2190248F2000A19004BE20110A0E33BFAFFEB050050E10130A0A0 -S21902490713003086150150A0E30500A0E170A81BE90DC0A0E1F2 -S21902491C70D82DE984509FE50000E0E3343095E504B04CE20F37 -S219024931E0A0E103F0A0E170409FE50060A0E10400A0E139FFC3 -S219024946FFEB343095E50000A0E30FE0A0E103F0A0E11410956D -S21902495BE550309FE550209FE5004081E5043081E548309FE527 -S219024970082081E50C3081E540209FE540309FE5102081E51479 -S2190249853081E538209FE538309FE5182081E51C3081E5342014 -S21902499A95E50600A0E10FE0A0E102F0A0E170A81BE9500000B1 -S2190249AF0048040300144702005C47020070460200E0460200BB -S2190249C404480200B0480200A44702000DC0A0E100D82DE91C4A -S2190249D9209FE5003092E504B04CE2000053E30200001A013012 -S2190249EEA0E3003082E5C7FFFFEB00A81BE9640403000DC0A05F -S219024A03E130D82DE970E09FE500309EE504B04CE2000053E3F9 -S219024A181700000A0E50A0E100000FE100400FE1C04084E304F7 -S219024A2DF029E100E095E514309EE5003085E518109EE50020ED -S219024A42A0E318208EE500300FE1C04000E2C030C3E3043083DB -S219024A57E103F029E100009EE510209EE50CC09EE50FE0A0E170 -S219024A6C0CF0A0E1003095E5000053E3E8FFFF1A30A81BE938BD -S219024A813203000DC0A0E100D82DE904B04CE20C209FE50030E6 -S219024A9692E5013083E2003082E500A81BE9D0C203000DC0A0B2 -S219024AABE110D82DE904B04CE234409FE5003094E5010053E356 -S219024AC00000001ACDFFFFEB0030A0E3003084E51C309FE500EE -S219024AD52093E5000052E30200000A0130A0E3003084E5F2FFAE -S219024AEAFFEA10A81BE9D0C20300383203000DC0A0E100D82DB6 -S219024AFFE904B04CE254EFFFEB00A81BE90DC0A0E100D82DE9BB -S219024B1404B04CE25CEFFFEB00A81BE90DC0A0E1F0DF2DE9008F -S219024B2900E0E301DC4DE2C0619FE5343096E504B04CE20FE04C -S219024B3EA0E103F0A0E10090A0E1343096E50000A0E30FE0A064 -S219024B53E103F0A0E19C019FE59C319FE50050A0E3005083E5F4 -S219024B68482096E590719FE50FE0A0E102F0A0E1005087E584A6 -S219024B7D019FE584119FE584219FE584419FE50234A0E3003023 -S219024B9284E5D31000EB78019FE5D11000EB74019FE50020945A -S219024BA7E5001097E56C419FE5CC1000EB68219FE568319FE55F -S219024BBC0180A0E364A19FE54A7F4BE2005083E5020054E10269 -S219024BD150A0E10300000A0FE0A0E104F094E4050054E1FBFFDA -S219024BE6FF1A0A50A0E1006095E5000056E30F00000A30419F83 -S219024BFBE530019FE5001094E5B71000EB0700A0E1002094E5A8 -S219024C10011CA0E30040A0E3823262E0032182E0004085E5827D -S219024C2521A0E1161200EB020070E30040850500608A150000A0 -S219024C3A58E30200000AF0009FE50080A0E3A61000EB0740A018 -S219024C4FE10400A0E1011CA0E3FA20A0E3091200EB000050E36D -S219024C64050000AACC309FE5002093E5000052E3EFFFFF0ADC65 -S219024C791500EBEDFFFFEA0600001A6C209FE5343092E5090036 -S219024C8EA0E10FE0A0E103F0A0E15FEEFFEBE5FFFFEA0400A0FD -S219024CA3E1A41000EB000050E30F0000DA88509FE50400A0E178 -S219024CB884409FE50510A0E10420A0E1210000EB003050E204EB -S219024CCD00000A000095E50410A0E10FE0A0E10CF093E50200CC -S219024CE200EA5C009FE50710A0E17D1000EB0180A0E3CFFFFF0B -S219024CF7EA50000000400D0300E0C203007CC3030000E9020045 -S219024D0C30E902003CE90200E4C2030048E902006CE90200AC6A -S219024D21060300B406030074C3030084C30300E8C2030078E91E -S219024D360200B4E90200BCC4030078C30300F0C20300C0E9029F -S219024D4B00F0AF1BE90DC0A0E1F0DD2DE904B04CE20040A0E1D5 -S219024D600050A0E30170A0E10260A0E1D4809FE5D4A09FE5219E -S219024D750000EA054186E7200052E3015085E21A0000EA220052 -S219024D8A53E31200001A052186E0043012E5040053E1014084F7 -S219024D9F02044002050030D4E5000053E3220053130300000AF7 -S219024DB40130F4E5000053E322005313FBFFFF1A0030D4E5001F -S219024DC90053E30900001A78009FE5431000EB000000EA014010 -S219024DDE84E20030D4E5FF2003E2000052E30300000A200052B2 -S219024DF3E3E3FFFF1A0030A0E30130C4E40030D4E5000053E31B -S219024E080800000A200053E30200001A0130F4E5200053E3FCAE -S219024E1DFFFF0A0030D4E5FF2003E2000052E3D1FFFF1A005016 -S219024E3287E50800A0E1002096E50A10A0E1030000EBF0AD1B93 -S219024E47E99C0503000C060300D8E902000DC0A0E1F0DF2DE9B7 -S219024E5C04B04CE20040A0E10280A0E10800A0E101A0A0E131B8 -S219024E711000EB0450A0E10A0055E10090A0E12C00000A0800C6 -S219024E86A0E1001095E50920A0E1801000EB000050E32300008A -S219024E9B1A000095E5251000EB090050E11D0000DA0170A0E322 -S219024EB00A0054E11400000A040055E10F00000A0800A0E100AD -S219024EC51094E50920A0E1711000EB006050E20900001A00007D -S219024EDA57E30400000A58009FE50810A0E1002095E50670A04F -S219024EEFE1FC0F00EB48009FE5001094E5F90F00EB104084E2D2 -S219024F040A0054E1EAFFFF1A000057E30300001A2C009FE5F257 -S219024F190F00EB0700A0E1F0AF1BE90500A0E1F0AF1BE91050CE -S219024F2E85E20A0055E1D2FFFF1A0000A0E3F0AF1BE9ECE902D9 -S219024F430014EA020018EA02000DC0A0E170D82DE904B04CE2C0 -S219024F580040A0E10150A0E130009FE50260A0E1DE0F00EB0536 -S219024F6D0054E10700000A20009FE5002094E5083094E50610DE -S219024F82A0E1D70F00EB104084E2050054E1F7FFFF1A70A81B8F -S219024F97E91CEA020024EA02000DC0A0E100D82DE90010C0E50C -S219024FAC0C0080E904B04CE204309BE50C3080E508209BE51085 -S219024FC12080E50C309BE5143080E500A81BE90DC0A0E1F0DF21 -S219024FD62DE904B04CE20CD04DE200C0A0E334C00BE50CE09B0E -S219024FEBE501A0A0E32C000BE50A005EE100C0A01301C0A00365 -S21902500008E09BE50180A0E130300BE500005EE300C0A0030036 -S219025015005CE334101B1500108E1534301BE504C09BE5304001 -S21902502A1BE50C0053E1110000AA03C0A0E104009BE5103094D3 -S21902503FE5000053E300C08315041094E5000051E30600001A01 -S219025054083094E5000053E30100000A020053E30100001A0CEF -S2190250693094E5001083E5184084E2010050E2EFFFFF1A2CE006 -S21902507E1BE50270A0E10E0057E1870000AA071198E70030D114 -S219025093E52D0053E35300001A0050A0E330401BE50500A0E183 -S2190250A804209BE5016087E20190D1E5020055E1440000AA0011 -S2190250BD30D4E5030059E13C00001A103094E5000053E3060066 -S2190250D2000A003093E5000053E30300000A94019FE5141094FC -S2190250E7E500A0A0E37D0F00EB043094E5000053E32000000A21 -S2190250FC070198E70230D0E53D0053E3035080020200000A07CF -S2190251113188E0017087E2045093E5082094E5000052E302006B -S219025126000A010052E30C00000A0D0000EA0500A0E10C1094EA -S21902513BE50230A0E15D0000EB006050E20700001A2C019FE514 -S2190251500510A0E1142094E506A0A0E1610F00EB010000EA0C87 -S2190251653094E5005083E5102094E50130A0E3003082E5036076 -S21902517A87E00C0000EA083094E5000053E30200000A02005374 -S21902518FE30400000A060000EA0C2094E5003092E5013083E241 -S2190251A4010000EA0C2094E50130A0E3003082E50150A0E3043C -S2190251B90000EA010080E204309BE5184084E2030050E1BAFF2E -S2190251CEFFBA000055E33000001A0910A0E1A0009FE505A0A087 -S2190251E3E13F0F00EB2B0000EA08C09BE500005CE32400000ACC -S2190251F834E01BE500005EE30300000A10109BE578009FE5009D -S21902520DA0A0E3340F00EB0C109BE5000051E30200000A010057 -S21902522251E30D00000A0F0000EA08109BE50C209BE507019848 -S219025237E70230A0E11E0000EB004050E20800001A30009FE570 -S21902524C10209BE5071198E704A0A0E1220F00EB020000EA07CB -S2190252613198E708209BE5003082E50130A0E334300BE50360D7 -S21902527687E0070000EA30EA020040EA02005CEA020070EA02D8 -S21902528B0020009FE5016087E2130F00EB08A09BE52CC01BE578 -S2190252A00670A0E10C0057E177FFFFBA0A00A0E1000000EA8093 -S2190252B5EA0200F0AF1BE90DC0A0E1F0D92DE904B04CE200C07F -S2190252CAA0E10140A0E30A50A0E30060A0E30180A0E10270A0AF -S2190252DFE10000DCE503E0A0E1200050E30200001A0130FCE52C -S2190252F4200053E3FCFFFF0A0030DCE5000053E33F00000A00D4 -S2190253090054E30B00000AFF3003E2300053E30800001A01306F -S21902531EDCE5411043E2202083E2FF2002E2190051E30230A075 -S21902533391780053E31050A00302C08C020040A0E30110DCE438 -S2190253480400A0E1302041E2413041E2050053E30900528302A2 -S21902535D00009A613041E2050053E30000008A0100A0E300009D -S21902537250E31300000A0000A0E3302041E2FF3002E20900536A -S219025387E30200A0910600009A613041E2050053E3570041923B -S21902539C0200009A413041E2050053E337004192050050E10446 -S2190253B10000AA0030DCE5950626E0000053E3D0FFFF1A0F0077 -S2190253C600EA00005EE30B00000A0E20A0E10030D2E5010000F4 -S2190253DBEA0130F2E5FF3003E2000053E30100000A030051E13A -S2190253F0F9FFFF1A0030D2E5000053E30100001A0000A0E3F0E5 -S219025405A91BE9006088E5000057E300C087150100A0E3F0A95E -S21902541A1BE90DC0A0E100D82DE90030D0E504B04CE2200053FC -S21902542FE30200001A0130F0E5200053E3FCFFFF0A0000D0E54D -S219025444540050E30030A0130130A003740050E30130A0030093 -S2190254590053E30400001A460050E3660050130200000A030092 -S21902546EA0E100A81BE90130A0E3003081E50100A0E300A81B64 -S219025483E90DC0A0E110D82DE9020050E304B04CE20140A0E1FF -S2190254985A00001A040094E56C119FE5CE0E00EB000050E310FC -S2190254AD00001A00C00FE100400FE1C04084E304F029E1101F55 -S2190254C211EE011A81E3031081E3101F01EE101F11EE0F1081ED -S2190254D7E3101F01EE00300FE1C0400CE2C030C3E3043083E17C -S2190254EC03F029E110A81BE9040094E518119FE5B80E00EB0010 -S2190255010050E33B00001A00C00FE100400FE1C04084E304F0CB -S21902551629E10E02A0E3021A80E2202090E4000031E1FCFFFF9E -S21902552B1A160F07EE9A0F07EE0000A0E10000A0E10000A0E10F -S2190255400000A0E10000A0E10000A0E1101F11EE011AC1E310CF -S2190255551F01EE151F07EE0000A0E10000A0E10000A0E1000080 -S21902556AA0E10000A0E10000A0E1101F11EE0C10C1E3101F0184 -S21902557FEE161F07EE0E02A0E3021A80E2202090E4000031E121 -S219025594FCFFFF1A160F07EE9A0F07EE0000A0E10000A0E1002D -S2190255A900A0E10000A0E10000A0E10000A0E1151F07EE151F85 -S2190255BE08EE0000A0E10000A0E10000A0E10000A0E10000A037 -S2190255D3E10000A0E1161F07EE171F08EE00300FE1C0400CE2F6 -S2190255E8C030C3E3043083E103F029E110A81BE91C009FE5041C -S2190255FD1094E5380E00EB10A81BE910009FE5350E00EB10A8A2 -S2190256121BE9ACEA0200B0EA0200B4EA0200CCEA02000DC0A07F -S219025627E130D82DE934309FE504B04CE230409FE50350A0E1D6 -S21902563C030054E10700000A24009FE5041094E5002094E50833 -S2190256513094E5230E00EB104084E2050054E1F7FFFF1A30A8A1 -S2190256661BE90C0603009C050300D8EA02000DC0A0E130D82D24 -S21902567BE904B04CE208D04DE20050A0E1010055E30140A0E175 -S219025690020000CA64009FE5120E00EB1F0000EA18104BE200E1 -S2190256A520A0E3040094E50230A0E101FFFFEB000050E30300F6 -S2190256BA001A40009FE5041094E5070E00EB140000EA02005514 -S2190256CFE30D0000DA1C104BE20020A0E3080094E50230A0E1C5 -S2190256E4F4FEFFEB000050E30800001A10009FE5081094E5FA5A -S2190256F90D00EB070000EAE8EA020000EB02001CEB0200203092 -S21902570EA0E31C300BE518001BE51C101BE5221000EB30A81B6C -S219025723E90DC0A0E170D82DE904B04CE23CD04DE23C304BE21F -S21902573840204BE200308DE50040A0E104208DE530604BE2848E -S21902574D319FE50600A0E108308DE50150A0E178319FE57710D4 -S219025762A0E300C093E50120A0E344C00BE50030A0E309FEFF1F -S219025777EB0120A0E300208DE544304BE204308DE50010A0E31B -S21902578C08108DE548319FE50400A0E10C308DE50510A0E106AB -S2190257A130A0E109FEFFEB000050E34D00000A40301BE5000050 -S2190257B653E30C00000A20019FE544101BE53C201BE5C60D0063 -S2190257CBEB38004BE23C201BE50810A0E3823262E0032182E0FF -S2190257E08221A0E1270F00EB020070E33D00000A44301BE50058 -S2190257F5C00FE100400FE1C04084E304F029E10E02A0E3021AA4 -S21902580A80E2202090E4000031E1FCFFFF1A160F07EE9A0F077C -S21902581FEE0000A0E10000A0E10000A0E10000A0E10000A0E1FA -S2190258340000A0E1101F11EE011AC1E3101F01EE151F07EE00A3 -S21902584900A0E10000A0E10000A0E10000A0E10000A0E10000BE -S21902585EA0E1101F11EE0C10C1E3101F01EE161F07EE0E02A0C7 -S219025873E3021A80E2202090E4000031E1FCFFFF1A160F07EEC4 -S2190258889A0F07EE0000A0E10000A0E10000A0E10000A0E10062 -S21902589D00A0E10000A0E1151F07EE151F08EE0000A0E1000019 -S2190258B2A0E10000A0E10000A0E10000A0E10000A0E1161F0719 -S2190258C7EE171F08EE0FE0A0E103F0A0E1030000EA3CEB0200B1 -S2190258DC80C303004CEB020060EB020070A81BE90DC0A0E1007A -S2190258F1D82DE908009FE504B04CE2790D00EB00A81BE9D0EB67 -S21902590602000DC0A0E1F0D92DE904B04CE20150A0E10070A092 -S21902591BE30530A0E1015045E2070053E10080A0E10260A0E140 -S219025930470000DA0FE0A0E108F0A0E1FF4000E20FE0A0E108B8 -S219025945F0A0E10010A0E3302044E2413044E2050053E30900F1 -S21902595A5283FFE000E20200009A613044E2050053E30000000D -S21902596F8A0110A0E3000051E32F00000A00C0A0E330004EE2EE -S219025984FF1000E241204EE2FF3002E2050053E3090051830258 -S21902599900009A61304EE2050053E30000008A01C0A0E300008E -S2190259AE5CE32100000A0774A0E100C0A0E3301044E2FF30019E -S2190259C3E2090053E301C0A0910600009A613044E2050053E323 -S2190259D857C044920200009A413044E2050053E337C04492008B -S2190259ED10A0E3FF3000E2090053E30010A0910600009A613049 -S219025A024EE2050053E357104E920200009AFF3002E2050053CF -S219025A17E337104E920C2281E1027087E1000056E30500000AB7 -S219025A2C003096E5023083E0003086E5010000EA0000E0E3F0E5 -S219025A41A91BE90530A0E1015045E2000053E3B7FFFFCA0700B2 -S219025A56A0E1F0A91BE90DC0A0E1F0DF2DE90120A0E304B04C3F -S219025A6BE268D04DE288200BE50070A0E38C700BE50030E0E36C -S219025A8090300BE50790A0E180100BE50080A0E1930000EA53F1 -S219025A950052E30300000A04029FE50710A0E10F0D00EB9100F9 -S219025AAA00EA0FE0A0E108F0A0E1027087E200C0A0E10800A049 -S219025ABFE10110A0E37C204BE20030A0E37C300BE5FF600CE2F1 -S219025AD48BFFFFEB004050E27CA04BE2030000AAC0019FE5078E -S219025AE910A0E1FD0C00EB7F0000EA017087E2303046E2090048 -S219025AFE53E303F19F97620000EAD45C0200305B0200305B0294 -S219025B1300305B0200945C0200945C0200945C0200605C020055 -S219025B28605C0200605C02000800A0E12F1046E20A20A0E171D9 -S219025B3DFFFFEB0050A0E12F3047E288201BE5067083E08450B5 -S219025B520BE5000052E30A00000A80301BE5000053E304000014 -S219025B670A039065E03C019FE50910A0E1DB0C00EB000000EA29 -S219025B7C80901BE50020A0E388200BE524319FE5001093E50958 -S219025B915085E090301BE5052069E0030052E10230A03190301C -S219025BA60BE5010055E10300003A00319FE5002093E5020055DB -S219025BBBE10300009AF4009FE50510A0E1C60C00EB480000EA53 -S219025BD02E3084E2034066E0047087E00430A0E1014044E20075 -S219025BE50053E3080000DA0800A0E10110A0E30A20A0E142FF83 -S219025BFAFFEB0430A0E1014044E20100C5E4000053E3F6FFFFB5 -S219025C0FCA0800A0E10110A0E30020A0E339FFFFEB017087E2F3 -S219025C240000E0E17C205BE5FF3000E27C200BE5020053E102F2 -S219025C3900000A84101BE578009FE5A70C00EB8C201BE5053036 -S219025C4E69E0020053E10320A0218C200BE51C0000EA0800A08D -S219025C63E13B1066E20A20A0E125FFFFEB4C309FE590201BE548 -S219025C780050A0E144009FE5005083E58C301BE50510A0E195D8 -S219025C8D0C00EB170000EA0710A0E12C009FE50620A0E1900C78 -S219025CA200EB120000EAECEB020018EC02003CEC02007CC303B4 -S219025CB700E4C2030054EC020090EC020080C30300CCEC020068 -S219025CCCF4EC0200017087E20FE0A0E108F0A0E10A0050E3FAE0 -S219025CE1FFFF1A0FE0A0E108F0A0E1002050E267FFFFCAF0AF86 -S219025CF61BE90DC0A0E130D82DE9B4309FE504B04CE2085193EC -S219025D0BE50340A0E1000055E32100001A143194E5000053E36C -S219025D200900000A183194E590209FE50310D2E78C009FE50181 -S219025D353083E2183184E5690C00EB183194E5060053E3185144 -S219025D4A84850C3194E5FF0053E3060000CA143194E500005368 -S219025D5FE30100000A5C009FE55E0C00EB0000E0E330A81BE966 -S219025D74043084E20300A0E1011CA0E3043184E5112E84E20F03 -S219025D89E0A0E100F094E50C0184E5080184E5000050E3EDFF2D -S219025D9EFFBA083194E5042194E5013043E2083184E50100D215 -S219025DB3E4042184E530A81BE93C3203006804030020ED020097 -S219025DC824ED02000DC0A0E100D82DE920309FE504B04CE200BA -S219025DDDC0A0E308C183E5012CA0E30C2183E5000083E5141164 -S219025DF283E518C183E500A81BE93C3203000DC0A0E100D82D7C -S219025E07E914309FE5042083E2042183E50C1193E504B04CE241 -S219025E1C081183E500A81BE93C3203000DC0A0E1F0DD2DE90C8F -S219025E3120A0E304B04CE2C0D04DE20080A0E130604BE206004D -S219025E46A0E10040A0E3B8400BE50170A0E1D0400BE50410A06E -S219025E5BE1BF0C00EB0150A0E3BA524BE1BC424BE1B0304BE251 -S219025E7000308DE504A0A0E104A08DE538339FE50C20A0E3B8E3 -S219025E85224BE17610A0E308308DE5AC404BE224339FE5040008 -S219025E9AA0E114C093E50A20A0E130C00BE50230A0E33BFCFFA9 -S219025EAFEBB4304BE200308DE594004BE200339FE57210A0E3BC -S219025EC408308DE50A20A0E104A08DE50230A0E331FCFFEBB8D3 -S219025ED9304BE200308DE5BC204BE204208DE57C004BE2D43260 -S219025EEE9FE56210A0E308308DE50520A0E10A30A0E126FCFFF3 -S219025F03EBC0304BE200308DE5C4204BE204208DE564004BE2A0 -S219025F18AC329FE56D10A0E308308DE50520A0E10530A0E11BEA -S219025F2DFCFFEBC8304BE200308DE5CC204BE204208DE54C00B0 -S219025F424BE284329FE56810A0E308308DE50520A0E10530A0BC -S219025F57E110FCFFEB0530A0E300308DE5D0204BE224008DE946 -S219025F6C0800A0E15C329FE50710A0E10C308DE50520A0E1048E -S219025F8130A0E111FCFFEB000050E3AB00000ACC301BE5000078 -S219025F9653E30800000AC8001BE50610A0E1B01100EB0000504C -S219025FABE30300001A20029FE5C8101BE5CA0B00EB9F0000EA13 -S219025FC0C4301BE5000053E31600000AC0001BE504129FE5021F -S219025FD50C00EB000050E301A0A0031000000AC0001BE5F01167 -S219025FEA9FE5FC0B00EB000050E30700001AE4319FE500209385 -S219025FFFE500A0A0E1000052E30600001AD4019FE5B40B00EB28 -S219026014890000EACC019FE5C0101BE5B00B00EB850000EA00C7 -S219026029005AE30700001AD0301BE5000053E30400001AAC01FC -S21902603E9FE5A80B00EBA8019FE5A60B00EB7B0000EA00005A9C -S219026053E32900001A0610A0E10120A0E3D4404BE2D0001BE5BF -S2190260680430A0E1F00D00EB005050E2070000AAD4001BE5D0A8 -S21902607D401BE5E90E00EB0020A0E168019FE50410A0E1940B23 -S21902609200EB690000EA5C019FE5B0101BE50A60A0E148FFFFE2 -S2190260A7EB50819FE534704BE2010000EA0650C7E7016086E214 -S2190260BC030056E30400008A0BFFFFEB005050E2F8FFFFAA10D8 -S2190260D13198E5D4300BE5000055E3070000AAD4001BE5D00E76 -S2190260E600EB0010A0E110019FE57C0B00EB0400A0E12D0E005B -S2190260FBEB4F0000EA01005AE30200001AF8009FE5750B00EB24 -S2190261104A0000EA39FFFFEBB4301BE5000053E31100000ABC2C -S219026125301BE5000053E30200001AD4009FE56B0B00EB3A00E9 -S21902613A00EAB8401BE5C8609FE5000000EA0150C4E4E9FEFFF2 -S21902614FEB005050E2FBFFFFAA0600A0E1B8101BE50420A0E130 -S2190261645F0B00EB2E0000EA33004BE29C109FE50320A0E3B2CA -S2190261790B00EB000050E30200001A8C009FE5D7FDFFEB2500D2 -S21902618E00EA34305BE5530053E31F00001A33305BE53030435F -S2190261A3E2090053E31B00008A64009FE5B8101BE528FEFFEB5A -S2190261B81A0000EA80ED020090C3030088ED020098ED0200A85C -S2190261CDED0200C8ED0200E0ED0200ECED020004EE02000CEE78 -S2190261E20200BCC4030014EE02003CEE020050EE020028ED0295 -S2190261F70064EE0200D49902003C3203007CEE0200A0EE02005C -S21902620CCCEE0200F0EE020008EF0200F85C020018009FE534BB -S219026221101BE52F0B00EB00005AE30300001AD4004BE2DE0DE6 -S21902623600EB000000EA0CEF0200F0AD1BE90DC0A0E100D82D86 -S21902624BE90010A0E118009FE504B04CE2220B00EB10009FE593 -S21902626010109FE510209FE537FBFFEB00A81BE96CF102002C77 -S2190262750503009C0503008CF102000DC0A0E1F0DF2DE904B0FB -S21902628A4CE230D04DE20070A0E344304BE20060A0E140504B4B -S21902629FE244700BE50500A0E100308DE50140A0E144329FE579 -S2190262B46610A0E308308DE50720A0E104708DE50230A0E334B4 -S2190262C9FBFFEB0130A0E388008DE80600A0E120329FE50410B2 -S2190262DEA0E10C308DE50220A0E308708DE50530A0E136FBFF00 -S2190262F3EB070050E1A000000A00029FE52F0D00EB070050E1DD -S2190263080200001AF4019FE5F40A00EB990000EAEC019FE5F116 -S21902631D0A00EB44301BE5000053E31900000ADCC19FE5483009 -S2190263324BE2D8E19FE50320A0E1D4119FE50380A0E100409EF6 -S219026347E50C60A0E100009CE50EA0A0E1003091E5840080E02E -S21902635C043043E2940301E09C1200EB005050E20D00000A48DA -S219026371401BE50500A0E13E1300EB0410A0E10030A0E1900137 -S2190263869FE50520A0E1D50A00EB040000EA84019FE570619FA0 -S21902639BE570A19FE5D00A00EB48804BE274919FE50010A0E396 -S2190263B0004099E5012CA0E30400A0E1670B00EB60319FE50369 -S2190263C50093E8030084E8003096E5103084E5012CA0E314308A -S2190263DA84E50050A0E3185084E50510A0E1024084E00400A0BA -S2190263EFE15A0B00EB30C19FE50F009CE80F0084E8003096E533 -S21902640400209AE5023083E0103084E5143084E50510A0E11844 -S2190264195084E5012CA0E3024084E00400A0E14C0B00EBFCC0D5 -S21902642E9FE50F009CE804E0A0E10700AEE8F0609FE50130CE66 -S219026443E42324A0E10120CEE42338A0E10030CEE500209AE560 -S219026458003096E5823043E0103084E5182084E50510A0E114B4 -S21902646D3084E5012CA0E3024084E00400A0E1370B00EBB0C002 -S2190264829FE50F009CE804E0A0E10700AEE80130CEE42334A00B -S219026497E10030CEE5017087E2003096E5017087E200109AE537 -S2190264AC017087E2036061E0106084E5017087E2146084E508BE -S2190264C120A0E1181084E50600A0E1421200EB005050E218002D -S2190264D6000A48401BE50500A0E1E41200EB0410A0E10030A04C -S2190264EBE128009FE50520A0E17B0A00EB200000EA94F1020061 -S219026500BCEF0200C0F10200F0F10200FCF1020058330300605F -S2190265153303006433030020F2020048F202006833030090F22A -S21902652A020098F20200A8F202005C330300B8F202000600A047 -S21902653FE10724A0E1001099E50830A0E1721200EB005050E27B -S2190265540900000A48401BE50500A0E1C41200EB0410A0E100B4 -S21902656930A0E108009FE50520A0E15B0A00EB000000EAC8F23F -S21902657E0200F0AF1BE90DC0A0E170D82DE96C309FE56C009F85 -S219026593E508D04DE268409FE5001093E5002094E504B04CE2D1 -S2190265A8015062E04D0A00EB003094E50060A0E3230456E11404 -S2190265BD00002A0030D5E5FF0053E30700000A102085E20C10B5 -S2190265D292E800C08DE51C1095E504108DE524009FE50510A078 -S2190265E7E13E0A00EB016086E2003094E5015C85E2230456E1F0 -S2190265FC030000EA5C330300F8F20200603303003CF30200EA67 -S219026611FFFF3A70A81BE90DC0A0E170D82DE9B4309FE5B41041 -S2190266269FE504B04CE2B0C09FE5002093E5005091E500009C04 -S21902663BE50C60A0E1804082E00410A0E1050054E11C00002A3A -S219026650003094E5010073E31500000A040051E10200000A7C51 -S219026665009FE50420A0E11D0A00EB0410A0E1050054E10B0004 -S21902667A002A003094E5010073E30800000A54309FE50020930D -S21902668FE50320C2E3021081E0050051E10200002A003091E5C6 -S2190266A4010073E3F9FFFF1A0140A0E1E4FFFFEA003096E50336 -S2190266B930C3E3034084E0E0FFFFEA040051E10200000A14002A -S2190266CE9FE50420A0E1030A00EB70A81BE9583303005C330353 -S2190266E3006033030068F302000DC0A0E130D82DE9BC309FE5CC -S2190266F8BC409FE5002093E500E094E504B04CE2B0C09FE58EB1 -S21902670D2082E000E09CE50050A0E102C0A0E10E005CE11A0014 -S219026722002A0400A0E1003092E5010073E31100000A02005C35 -S219026737E10200000A02306CE0430151E11600009A02C0A0E172 -S21902674C0E005CE10700002A003090E50320C3E302C08CE00E0B -S219026761005CE10200002A00309CE5010073E3F9FFFF1A0C206E -S219026776A0E1020000EA003090E50330C3E3032082E00E005237 -S21902678BE1E5FFFF3A02005CE10500000A02306CE0430151E1B2 -S2190267A00200008A00C085E50100A0E330A81BE90000A0E33014 -S2190267B5A81BE958330300603303005C3303000DC0A0E1F0DF49 -S2190267CA2DE904B04CE2B8D04DE20040A0E3A8400BE5B0400B6E -S2190267DFE50080A0E1B8400BE5A0604BE2C0400BE50600A0E12C -S2190267F4C8400BE5A4304BE200308DE5A8204BE204208DE50162 -S21902680970A0E144339FE56210A0E308308DE50120A0E3043010 -S21902681EA0E1DEF9FFEBAC304BE200308DE5B0204BE204208DC3 -S219026833E588004BE21C339FE57210A0E308308DE50120A0E389 -S2190268480430A0E1D3F9FFEBB4304BE200308DE5B8204BE2040D -S21902685D208DE570004BE2F4329FE56510A0E308308DE5012083 -S219026872A0E30430A0E1C8F9FFEB58004BE2C0304BE204308DC4 -S219026887E5BC504BE2D0329FE56610A0E308308DE50120A0E30A -S21902689C00508DE50430A0E1BDF9FFEBC4304BE200308DE5C83E -S2190268B1204BE204208DE540004BE2A4329FE56C10A0E30830EA -S2190268C68DE50120A0E30430A0E1B2F9FFEB0530A0E300308DE1 -S2190268DBE5CC204BE204208DE5043043E208308DE50800A0E181 -S2190268F074329FE50710A0E10C308DE50220A0E30630A0E1B10F -S219026905F9FFEB040050E10200001A58029FE54AFEFFEB0D0124 -S21902691A00EAA8301BE5000053E30500000AC8301BE50000530F -S21902692FE30200000ACC301BE5000053E30200001A2C029FE55D -S2190269443EFEFFEB010100EAC0301BE5000053E31800000ABC21 -S219026959001BE5E91000EB006050E20600001ABC001BE5C430DC -S21902696E1BE5030080E0010040E2E21000EB006050E20D00000B -S2190269830ABC401BE50600A0E1B91100EB0020A0E1DC019FE5B4 -S2190269980410A0E1510900EBD4019FE5D4319FE5D4C19FE5000E -S2190269AD1093E500209CE54B0900EBE50000EAC4619FE5A4103A -S2190269C21BE5003096E5BC419FE5030051E10400003AC4301B0B -S2190269D7E5002094E5033081E0020053E10600003AA0019FE5F7 -S2190269EC3D0900EB84019FE5001096E5002094E5390900EBD331 -S219026A010000EACC001BE54B0900EB0F0050E30300009A78012C -S219026A169FE51010A0E3310900EBCB0000EAC0301BE500005320 -S219026A2BE30800001AC4101BE50500A0E12BFFFFEB000050E3A9 -S219026A400300001A4C019FE5C4101BE5250900EBBF0000EA288E -S219026A55319FE53C519FE53C419FE5001093E5002095E50080BC -S219026A6AA0E3000094E5019062E00910A0E1980700EB00309558 -S219026A7FE50860A0E1007094E5230458E11700002A0030D7E5B7 -S219026A94FF0053E30F00000ACC001BE50710A0E1310900EB000F -S219026AA90050E30A00001A102097E5BC301BE5030052E1890023 -S219026ABE001ADC009FE5CC101BE53D0B00EB000050E39F000061 -S219026AD30A0180A0E3040000EA016086E2003095E5017C87E252 -S219026AE8230456E1E7FFFF3ABC101BE5C4201BE5000058E30C1E -S219026AFD00001A003095E594009FE50860A0E1007090E50200D1 -S219026B1200EA016086E2003095E5017C87E2230456E1020000C4 -S219026B272A0030D7E5FF0053E3F7FFFF1A0100A0E1021081E003 -S219026B3C011041E2701300EB008050E21700000A54009FE5E40C -S219026B510800EB7E0000EA80F3020094F30200A8F30200BCF383 -S219026B660200D8F30200E0F30200ECF3020000F402001CF40286 -S219026B7B003CF40200583303005C3303007CC30300E4C20300C1 -S219026B9058F4020074F40200A4F402006033030068330300F86B -S219026BA5F4020014F5020001A0A0E3BC001BE5D0404BE2C410E2 -S219026BBA1BE50420A0E1851000EB006050E20800000A0600A050 -S219026BCFE1D0401BE508A0A0E1261100EB0410A0E10030A0E128 -S219026BE408019FE50620A0E1BD0800EB00005AE30E00000ABCA0 -S219026BF9001BE5A4101BE5C4201BE5D0304BE2C31000EB00609D -S219026C0E50E20700000AD0401BE50600A0E1151100EB0410A0CB -S219026C23E10030A0E1C8009FE50620A0E1AC0800EB0700A0E1A9 -S219026C380010A0E3012CA0E3460900EBCC101BE50700A0E1D788 -S219026C4D0800EBBC301BE5B0201BE5103087E5000052E3050096 -S219026C62001AC0301BE5000053E3BC201B150200001AA4201BCF -S219026C77E5000000EAAC201BE5B8301BE5142087E5000053E3A8 -S219026C8C0200001A64309FE5003093E5000000EAB4301BE51C26 -S219026CA13087E5C4301BE5183087E50900A0E1001095E5D0208F -S219026CB64BE2471000EB006050E21000000AD0401BE50600A0F1 -S219026CCBE1E91000EB0410A0E10030A0E120009FE50620A0E157 -S219026CE0800800EB1A0000EA14009FE57D0800EB170000EA48D0 -S219026CF5F502006CF5020080C3030090F50200CCF402003C302E -S219026D0A9FE5001093E50900A0E1002095E5D0304BE27E100082 -S219026D1FEB006050E20A00000AD0401BE50600A0E1D01000EB65 -S219026D340410A0E10030A0E10C009FE50620A0E1670800EB016B -S219026D490000EA68330300B0F50200F0AF1BE90DC0A0E1F0D846 -S219026D5E2DE904B04CE254D04DE20040A0E30070A0E14C504B33 -S219026D73E254400BE50500A0E15C400BE550304BE200308DE53D -S219026D8854204BE204208DE50160A0E128319FE56610A0E308F8 -S219026D9D308DE50120A0E30430A0E17CF8FFEB58304BE200309C -S219026DB28DE55C204BE204208DE534004BE200319FE56C10A0E2 -S219026DC7E308308DE50120A0E30430A0E171F8FFEB0220A0E3D2 -S219026DDC14008DE8E4309FE50700A0E10C308DE50610A0E108A5 -S219026DF1408DE50530A0E174F8FFEB040050E10200001AC400B3 -S219026E069FE50DFDFFEB460000EA54301BE5000053E30200000C -S219026E1B0A5C301BE5000053E30200001AA4009FE504FDFFEB60 -S219026E303D0000EA50001BE5B20F00EB005050E20600001A5031 -S219026E45001BE558301BE5030080E0010040E2AB0F00EB00502E -S219026E5A50E20D00000A50401BE50500A0E1821000EB0020A080 -S219026E6FE160009FE50410A0E11A0800EB58009FE558309FE5B8 -S219026E8458C09FE5001093E500209CE5140800EB240000EA50C8 -S219026E99101BE558301BE50100A0E1031081E0011041E2951274 -S219026EAE00EB000050E30C00000A28009FE5090800EB190000D3 -S219026EC3EABCF30200D8F30200BCEF0200ECF30200D4F50200F2 -S219026ED81CF402003CF40200583303005C33030014F5020050DF -S219026EED001BE558101BE560204BE2B70F00EB005050E2090038 -S219026F02000A60401BE50500A0E1591000EB0410A0E10030A08A -S219026F17E108009FE50520A0E1F00700EB000000EA90F50200F8 -S219026F2CF0A81BE90DC0A0E1F0DF2DE904B04CE218D04DE20081 -S219026F4160A0E300608DE52C304BE204308DE50120A0E3082084 -S219026F568DE548319FE50C308DE5022082E00630A0E118F8FFB8 -S219026F6BEB060050E10200001A30019FE5B1FCFFEB660000EA30 -S219026F8028319FE528519FE528419FE5001093E5002095E50606 -S219026F9580A0E1000094E501A062E00A10A0E14D0600EB00604A -S219026FAA94E50270A0E3026C86E2010000EA017087E2016C86CF -S219026FBFE2EC909FE5003099E5230457E10D00002A0030D6E5A5 -S219026FD4FF0053E3F6FFFF0A2C001BE50610A0E1E10700EB00D8 -S219026FE90050E3F1FFFF1AC4009FE52C101BE5F10900EB0000E7 -S219026FFE50E34500000A0180A0E3000058E30300001AA8009F52 -S219027013E52C101BE5B20700EB3E0000EA100096E530704BE21C -S219027028181096E50720A0E1690F00EB005050E20700000A30DB -S21902703D401BE50500A0E10B1000EB0410A0E10030A0E16C00B9 -S2190270529FE50520A0E1A20700EB0600A0E1FF10A0E3012CA07E -S219027067E33C0800EB0A00A0E1001099E50720A0E1570F00EBE9 -S21902707C005050E21000000A30401BE50500A0E1F90F00EB046F -S21902709110A0E10030A0E124009FE50520A0E1900700EB1C00B5 -S2190270A600EAE8F50200ECF302005C330300603303006833035E -S2190270BB00F4F5020008F6020090F5020040309FE5001093E5CB -S2190270D03C309FE5002093E50A00A0E10730A0E18D0F00EB0052 -S2190270E55050E20B00000A30401BE50500A0E1DF0F00EB041015 -S2190270FAA0E10030A0E110009FE50520A0E1760700EB020000A4 -S21902710FEA6833030060330300B0F50200F0AF1BE90DC0A0E1AE -S219027124F0D82DE904B04CE214D04DE20060A0E300608DE520A7 -S219027139304BE204308DE50120A0E308208DE5D4309FE50C3035 -S21902714E8DE5022082E00630A0E19CF7FFEB060050E1020000C2 -S2190271631ABC009FE535FCFFEB3D0000EAB4309FE5B4409FE594 -S219027178B4509FE5001093E5002094E50670A0E1000095E501E0 -S21902718D1062E0D20500EB005095E5010000EA016086E2015CF7 -S2190271A285E2003094E5230456E10800002A0030D5E5FF0053F5 -S2190271B7E3F7FFFF0A20001BE50510A0E1690700EB000050E396 -S2190271CCF2FFFF1A0170A0E3000057E30300001A54009FE5205A -S2190271E1101BE53F0700EB1E0000EA48209FE5140095E500309F -S2190271F692E5030050E10500003A38309FE518C095E5001093B2 -S21902720BE50C2080E0010052E10B00003A24009FE5310700EBB2 -S219027220100000EAE8F50200ECF302005C330300603303006808 -S21902723533030008F602007CC30300E4C2030020F602001010E4 -S21902724A95E50C20A0E1A20500EB08209FE51C3095E50030824B -S21902725FE5000000EA80C30300F0A81BE90DC0A0E1F0D92DE935 -S21902727444209FE504D04DE2004092E504B04CE2000054E3271C -S21902728900001A30809FE50118A0E3000098E50130A0E300309E -S21902729E82E5010840E2820E00EB001050E20600000A10009FC6 -S2190272B3E50B0700EB0400A0E11B0000EA70040300E4C2030033 -S2190272C838F6020060709FE560609FE50100A0E15C409FE50739 -S2190272DD10A0E10620A0E19B0E00EB50509FE50400A0E105100B -S2190272F2A0E1A80E00EB44009FE5001097E5002096E500C0941B -S219027307E5003095E500C08DE5F40600EB003094E5002098E57E -S21902731C24109FE5013883E2022063E0002081E50100A0E3058B -S2190273310000EA583303005C330300603303006433030060F6B0 -S219027346020068330300F0A91BE90DC0A0E130D82DE904B04C82 -S21902735BE20050A0E1010055E30140A0E1020000CA48009FE5D0 -S219027370B3FBFFEB30A81BE9BBFFFFEB000050E30C00000A346C -S219027385009FE534109FE5042094E5AFF6FFEB003050E204000E -S21902739A000A0500A0E10410A0E10FE0A0E10CF093E530A81BDB -S2190273AFE910009FE5A2FBFFEB30A81BE98CF602002C0503002A -S2190273C49C050300A0F602000DC0A0E1F0DD2DE904B04CE264FA -S2190273D9D04DE20080A0E10140A0E1080098E502A0A0E100002E -S2190273EE50E30D00000A80104BE20120A0E3AE0100EB0C20987A -S219027403E5000052E30200000A80301BE5000053E35400000A03 -S219027418000052E30200001A80301BE5000053E34F00001A2890 -S21902742D039FE528339FE5041098E5036084E0A90600EB1030AB -S21902744298E5013043E2050053E303F19F97410000EA6C7402E9 -S219027457008C740200F0740200F87402009C740200B474020007 -S21902746CF0229FE5003096E5EC129FE5EC029FE5000053E30297 -S21902748110A001970600EB330000EADC029FE5001096E5930613 -S21902749600EB2F0000EA0600A0E1BF0C00EB0010A0E1BC029FAB -S2190274ABE58D0600EB290000EA0050A0E3B4429FE50510D6E730 -S2190274C00400A0E1870600EB040055E30100008AA0029FE58343 -S2190274D50600EB015085E2050055E3F5FFFF9A90029FE57E068E -S2190274EA00EB1A0000EA88029FE51B0000EA84029FE50650A084 -S2190274FFE1780600EB0030D6E50640A0E1000053E31100000A24 -S2190275146C729FE50030D5E50A0053E30200000A0130F4E50AAF -S2190275290053E3FCFFFF1A0700A0E10030A0E30030C4E50510D3 -S21902753EA0E1680600EB0A30A0E30130C4E40450A0E10030D5E7 -S219027553E5000053E3EEFFFF1A00005AE30300000A18029FE513 -S2190275685E0600EB0200A0E38A0000EA103098E5040053E313B5 -S21902757D00000A74404BE20400A0E15010A0E30A20A0E1BC0731 -S21902759200EB000050E30000E0E30470A0E17E0000BA0700A028 -S2190275A7E1630600EB000050E3EDFFFF0A74305BE52E0053E323 -S2190275BC0A00A0017600000A5E0053E30300A0037300000A10C1 -S2190275D13098E5013043E2050053E303F19F976D0000EAFC756E -S2190275E602001076020094770200C07602002C7602005C760242 -S2190275FB0074004BE2004096E50610A0E183F7FFEB0A0000EA29 -S21902761074004BE20610A0E10020A0E3004096E50230A0E124F1 -S219027625F7FFEB030000EA74004BE2004096E50610A0E10B0C71 -S21902763A00EB000050E30400A0E35500000A000096E500005461 -S21902764FE10100A0130200A003500000EA7C404BE20400A0E13D -S2190276640610A0E10620A0E39B0400EB0050A0E304A0A0E184C4 -S219027679404BE274304BE288300BE588704BE2E8809FE50410EA -S21902768EA0E10720A0E188001BE50830A0E106F7FFEB0000503F -S2190276A3E32600000A84305BE50530C6E7015085E2050055E3ED -S2190276B8F3FFFF9A360000EAC4009FE50650A0E1060600EB7481 -S2190276CD704BE2B8609FE50A0000EA74305BE50740A0E10000C8 -S2190276E253E30400000A0030D4E50130C5E40120F4E500005239 -S2190276F7E3FAFFFF1A0A30A0E30130C5E40040A0E30040C5E53E -S21902770C0600A0E1F40500EB0700A0E15010A0E30420A0E1588E -S2190277210700EB040050E10000E0E31B0000BA0700A0E10006FF -S21902773600EB040050E1E5FFFF1A150000EA0600A0E10A10A0DA -S21902774BE10620A0E3620400EB0400A0E3100000EA20F70200AD -S2190277606C33030034F702002CF7020028F702003CF702004083 -S219027775F7020048F702004CF7020050F7020054F7020058F794 -S21902778A020060F702008CF7020008009FE5D20500EB0100A014 -S21902779FE3000000EA50F70200F0AD1BE90DC0A0E100D82DE9DB -S2190277B4031081E22111A0E10130A0E1011041E204B04CE200C8 -S2190277C9E0A0E10000A0E300C0A0E1000053E1090000DA012047 -S2190277DEA0E1011041E204309EE40F005CE3133C83E103002000 -S2190277F3E001C08C1200C0A003000052E3F5FFFFCA00A81BE93A -S2190278080DC0A0E100D82DE9010040E204B04CE2050050E300EB -S21902781DF19F970C0000EA3C7802003C7802004C780200547834 -S21902783202003C780200447802000400A0E300A81BE90800A0E9 -S219027847E300A81BE90000A0E300A81BE9020CA0E300A81BE92A -S21902785C0DC0A0E1F0DF2DE904B04CE243DE4DE208D04DE24C58 -S219027871040BE50080A0E350140BE504A0A0E379FEFFEBB491E3 -S2190278869FE5080050E10970A0E18800000A426E4BE208604612 -S21902789BE20600A0E19C519FE5012BA0E30510A0E10B0400EBB8 -S2190278B0433E4BE2083043E20C3043E200308DE5434E4BE204EC -S2190278C5808DE5084044E274319FE5084044E2008083E50400C4 -S2190278DAA0E168319FE56C10A0E308308DE50820A0E10230A0D0 -S2190278EFE3AAF5FFEB0120A0E304018DE84C041BE548319FE5A6 -S21902790408808DE550141BE50C308DE50430A0E1ADF5FFEB0812 -S2190279190050E16500000A1E0000EA0700A0E144241BE50A10A0 -S21902792EA0E1A5FEFFEB010080E2050050E300F19F9716000057 -S219027943EA5C790200AC79020070790200747902008879020063 -S219027958987902000500A0E10610A0E1012BA0E3DC0300EB5119 -S21902796D0000EA0180A0E3100097E5A2FFFFEB00A08AE014706B -S21902798287E2050000EA090057E1147047120970A00101000058 -S219027997EAB4009FE5510500EBB0309FE5030057E1DDFFFF1ADD -S2190279AC000058E34000000AA0309FE5A0209FE50540A0E100DC -S2190279C13084E50400A0E1F82384E5FF1FA0E375FFFFEBFC030A -S2190279D684E584309FE584409FE5002093E5001094E57C009F70 -S2190279EBE5817042E0730700EB000050E32E00000A001094E52F -S219027A000700A0E1114D4BE2084044E20420A0E1F10C00EB005C -S219027A156050E21500000A48441BE50600A0E1930D00EB0410F2 -S219027A2AA0E10030A0E138009FE50620A0E12A0500EB1D000074 -S219027A3FEA0C0603006C33030084C3030090F70200BCEF02000A -S219027A54A8F70200AC060300CEFAAD0BADDEADDE5C3303006038 -S219027A69330300BCF7020020F202000700A0E10510A0E1012BB8 -S219027A7EA0E30430A0E1240D00EB006050E20900000A48441B4C -S219027A93E50600A0E1760D00EB0410A0E10030A0E108009FE52B -S219027AA80620A0E10D0500EB000000EAE8F70200F0AF1BE90DA3 -S219027ABDC0A0E1F0DF2DE904B04CE20480A0E30070A0E101505C -S219027AD2A0E10290A0E1D8609FE5E2FDFFEBD4A09FE500005037 -S219027AE7E33100000A0A0056E12C00000AC4309FE50710A0E1DE -S219027AFC000096E5034088E0190500EB000050E31F00001A10C3 -S219027B110096E5090050E11800001A013040E2050053E303F1EF -S219027B269F97130000EA447B0200447B0200B47B0200787B0268 -S219027B3B00507B0200647B0200003094E5003085E5F0AF1BE99A -S219027B500500A0E10410A0E10420A0E35F0300EBF0AF1BE90562 -S219027B6500A0E10410A0E10620A0E35A0300EBF0AF1BE900401A -S219027B7A85E5F0AF1BE93C009FE50710A0E1D60400EBF0AF1B0B -S219027B8FE9100096E51BFFFFEB008088E0146086E20A0056E15D -S219027BA4D2FFFF1A18009FE50710A0E1CC0400EBF0AF1BE90C3D -S219027BB9060300AC0603006C33030014F8020040F802000DC03B -S219027BCEA0E130D82DE90030A0E304B04CE294509FE504D04DDE -S219027BE3E2003085E59FFDFFEB000050E33F00000A80309FE5D4 -S219027BF880009FE580409FE5001090E5012BA0E300C093E504B9 -S219027C0D00A0E18C1041E0310300EB0400A0E1FF1FA0E3E1FEF9 -S219027C22FFEBFC3394E5030050E10700001A002094E54C309FAB -S219027C37E5030052E10300001AF82394E540309FE5030052E13B -S219027C4C1100000A38009FE5A30400EB0400A0E130209FE5005A -S219027C6130A0E3003082E50310A0E1012BA0E33A0500EB1E0032 -S219027C7600EA74C30300603303005C3303006C330300CEFAAD8F -S219027C8B0BADDEADDE60F8020084C3030018104BE23C009FE503 -S219027CA00120A0E384FFFFEB18301BE5000053E30700000A2800 -S219027CB5009FE528109FE50420A0E37DFFFFEB20009FE5201092 -S219027CCA9FE50220A0E379FFFFEB0130A0E3003085E5040000C1 -S219027CDFEACCF60200E4F6020084C303000CF70200E8C2030003 -S219027CF430A81BE90DC0A0E100D82DE9803260E0030180E00006 -S219027D090180E014209FE50002A0E1483092E504B04CE20FE002 -S219027D1EA0E103F0A0E100A81BE9500000000DC0A0E1F0DF2D0E -S219027D33E904B04CE206DD4DE298010BE5041090E59C110BE5A8 -S219027D480020A0E3A4210BE5007091E5A0210BE549F3FFEB51B9 -S219027D5DF3FFEB47F3FFEB043097E5010053E3A200001A07005F -S219027D72A0E10410A0E3C30B00EB043097E5040053E302000038 -S219027D870AD4029FE5550400EBF1FFFFEA0700A0E12010A0E324 -S219027D9C632F4BE2013CA0E390310BE500C0A0E394C10BE565AE -S219027DB14F4BE200408DE5193E4BE28C0A00EB000050E363AF3E -S219027DC64BE20700000A94329FE528104BE2F32091E1410F528D -S219027DDBE30200000A84029FE53F0400EBDBFFFFEA0700A0E11A -S219027DF00030A0E394310BE51510A0E3653F4BE200308DE50AEA -S219027E0520A0E1193E4BE2780A00EB000050E31B00000A628F86 -S219027E1A4BE20840A0E10130D4E444929FE5000053E3020000DB -S219027E2F0A0130D4E4000053E3FCFFFF1A0460A0E10130D4E42C -S219027E44000053E3FCFFFF1A0450A0E10130D4E4000053E3FCE8 -S219027E59FFFF1AA4111BE5000051E30100000A04029FE51D0456 -S219027E6E00EB0900A0E10610A0E10820A0E100408DE50530A0BC -S219027E83E1170400EB0700A0E11A10A0E30050A0E394510BE51F -S219027E98653F4BE200308DE50A20A0E1193E4BE2510A00EB05E1 -S219027EAD0050E10800000A0A00A0E190111BE58C204BE2260B40 -S219027EC200EB8C301BE5A0111BE5050050E10310A011A0110B96 -S219027ED7E5A0211BE5000052E30200001A8C019FE5FE0300EB9B -S219027EEC9AFFFFEA0510A0E180519FE507CDA0E30500A0E10828 -S219027F013097E5813083E00C20D3E70120C0E7011081E205007D -S219027F1651E3F8FFFFDA0700A0E10030A0E394310BE51B10A090 -S219027F2BE3653F4BE200308DE50A20A0E1193E4BE22C0A00EB94 -S219027F40000050E32900000A0A00A0E190111BE574204BE2C70B -S219027F550A00EB000050E32000000A9C111BE570201BE5003051 -S219027F6A91E5101093E5024081E09C211BE5044082E5A0111B16 -S219027F7FE574205BE50700A0E1450A00EB1F30D4E51F30C4E56B -S219027F940720D4E5800012E30200001A0730D4E5800013E3FCFE -S219027FA9FFFF0A98111BE5003091E50100A0E1202093E5051016 -S219027FBEA0E10FE0A0E100F092E59C211BE5343092E50140A0D6 -S219027FD3E30C4083E5B2F2FFEB0400A0E12B0000EA94009FE5BB -S219027FE8BE0300EB5AFFFFEA8C009FE5BB0300EB57FFFFEA0592 -S219027FFD0053E30200001A7C009FE5B60300EB52FFFFEAA4F2A2 -S219028012FFEB3200A0E336FFFFEBA4311BE5000053E301000088 -S2190280271A5C009FE5AD0300EBA4111BE554009FE5011081E2A7 -S21902803CA4110BE5A80300EBA4211BE50000A0E30A0052E30F57 -S21902805100000A0700A0E1CD0100EB88F2FFEB3DFFFFEAA4F8A3 -S21902806602009EFEFFFFC0F80200DCF80200D8F80200ECF8021A -S21902807B00B404030008F902001CF9020038F9020058F902008E -S21902809078F90200F0AF1BE90DC0A0E170D82DE90040A0E10849 -S2190280A56094E5045096E504B04CE2E70A00EB0000A0E3D80AF4 -S2190280BA00EB000085E5344085E50600A0E117FFFFEB70A81BBD -S2190280CFE90DC0A0E100D82DE904B04CE204C090E504109CE5C0 -S2190280E42130A0E30030C1E5FF20A0E30720C1E5213043E20FE2 -S2190280F930C1E530308CE500A81BE90DC0A0E110D82DE904E0E8 -S21902810E90E504B04CE204C09EE52130A0E30030CCE54820A0FA -S219028123E30E20CCE50000A0E30B00CCE50A00CCE5013043E22E -S2190281380C30CCE5462042E20D20CCE5203083E20430CCE51824 -S21902814D008EE514008EE508308EE50140A0E12C008EE56010A0 -S219028162A0E30110CCE53F3083E20330CCE57E2082E20220CC14 -S219028177E5203043E210308EE57F2082E20720CCE5203043E28F -S21902818C0F30CCE50C20A0E10110C2E40710CCE50030D4E700D0 -S2190281A130C2E7010080E2050050E3FAFFFFDA2230A0E3003077 -S2190281B6CCE50020A0E30D20CCE51E3043E20C30CCE501208278 -S2190281CBE230208EE510A81BE90DC0A0E100D82DE9010C51E2BB -S2190281E00100A01304B04CE200A81BE90DC0A0E100D82DE90401 -S2190281F52090E504B04CE2143092E50000A0E3000053E1020083 -S21902820A000A183092E5000053E10000001A0100A0E300A81BFA -S21902821FE90DC0A0E100D82DE904B04CE204C090E504009CE57E -S2190282342230A0E30030C0E50520C0E54224A0E10620C0E50404 -S21902824910C0E5043083E20030C0E50120A0E32C208CE500A8ED -S21902825E1BE90DC0A0E1F0DF2DE904B04CE20090A0E10380A0B7 -S219028273E13F0058E3044099E50850A0C14050A0D304309BE562 -S2190282880160A0E1087094E502A0A0E1040094E5400057E304E9 -S21902829D00001A147084E51C3084E5245084E55030A0E3030026 -S2190282B200EA187084E5203084E5285084E54030A0E30830848C -S2190282C7E52230A0E30030C0E50A50C0E54534A0E10B30C0E533 -S2190282DC0020A0E30820C0E502E0A0E10970C0E54030A0E3079B -S2190282F130C0E5122082E20020C0E50A005EE10F0000AA8E3180 -S219028306A0E1062083E004C092E501E08EE2061093E70C20A069 -S21902831BE101C04CE2000052E3F4FFFFDA0C20A0E10130D1E4E2 -S21902833001C04CE21030C0E5000052E3F9FFFFCAEDFFFFEA058D -S2190283450058E1040000AA0030A0E305E068E01030C0E501E08F -S21902835A5EE2FCFFFF1A2C2094E50730D0E5400013E3FCFFFFD2 -S21902836F0A000052E30800001A143094E5030057E10130A003C5 -S2190283840230A0130C3084E50900A0E10710A0E10520A0E1A0EB -S219028399FFFFEBF0AF1BE90DC0A0E170D82DE904D04DE200602D -S2190283AEA0E1045096E5044095E50C20D4E56230A0E30030C4B7 -S2190283C3E50710D4E5403043E20030C4E504B04CE22A0000EA85 -S2190283D80430A0E30000A0E30A30C4E50B00C4E5800052E308FB -S2190283ED00C4E56020A0030920C4E5103095E5020053E10200E4 -S219028402001A013041E20330C4E5210000EA0010A0E11C004B11 -S219028417E2102085E54030A0E30730C4E50A20A0E30020C4E584 -S21902842C1030D4E50130C0E7011081E2030051E3FAFFFF9A190D -S219028441305BE51A105BE50600A0E1002096E5031481E120C0CA -S21902845692E5041041E20FE0A0E104F09CE51B305BE501304378 -S21902846BE20330C4E56220A0E30020C4E50710D4E52230A0E3C4 -S2190284800030C4E50320D4E5FF1001E2012082E2010052E1CFB1 -S219028495FFFF1A70A81BE90DC0A0E170D82DE904B04CE200C049 -S2190284AAA0E30C40A0E10260A0E1040090E5060054E104E0905B -S2190284BFE50150A0E1060000AA0520A0E106C0A0E1043092E5A2 -S2190284D401C05CE2034084E0082082E2FAFFFF1A2230A0E30073 -S2190284E930CEE50A40CEE54434A0E10B30CEE50420A0E30820E1 -S2190284FECEE51010D0E500C0A0E30910CEE54030A0E30730CED3 -S219028513E5062082E20020CEE506005CE10D0000AA8C21A0E1E2 -S219028528053082E0041093E5050092E7000051E301208CE203D0 -S21902853D00000A1030DEE50130C0E4011051E2FBFFFF1A02C027 -S219028552A0E106005CE1F1FFFFBA70A81BE90DC0A0E170D82DC1 -S219028567E90050A0E1044095E5043094E50C2094E504B04CE24C -S21902857C0410D3E5010052E30300001A1C6094E50030A0E31408 -S2190285913084E5020000EA206094E50030A0E3183084E51410C8 -S2190285A694E50030A0E32C3084E5030051E10500000A242094AC -S2190285BBE50500A0E116FFFFEB0130A0E30C3084E5090000EAEE -S2190285D0181094E5000051E30500000A282094E50500A0E10D57 -S2190285E5FFFFEB0230A0E30C3084E5000000EA0C1084E50500C3 -S2190285FAA0E1003095E50610A0E120C093E50020A0E30FE0A019 -S21902860FE108F09CE570A81BE90DC0A0E100D82DE90C009FE50D -S2190286240C109FE504B04CE22D0200EB00A81BE97CF9020080FB -S219028639F902000DC0A0E1F0D82DE90050A0E1047095E50460DB -S21902864E97E52230A0E30030C6E50720D6E504B04CE2FF4002DF -S219028663E2000054E31600000A0740C6E5303097E5000053E3BE -S2190286781400000A0A0014E30200000A0500A0E10410A0E1B3ED -S21902868DFFFFEB050014E30200000A0500A0E10410A0E13EFF88 -S2190286A2FFEB300014E30200000A0500A0E10410A0E1D7FFFFAF -S2190286B7EB0730D6E5FF4003E2000054E3E8FFFF1A000097E5F3 -S2190286CC730900EBF0A81BE90DC0A0E100D82DE9043090E500AA -S2190286E12093E504B04CE2200092E500A81BE90DC0A0E130D86A -S2190286F62DE98C209FE58C309FE504B04CE2001092E50040A099 -S21902870BE1005093E5000051E30400001A0130A0E3003082E50C -S2190287203500A0E30120A0E1F7F0FFEB0E33A0E3083084E502AB -S2190287352CA0E30C2084E53E3383E2103084E50123A0E314208A -S21902874A84E5033383E2183084E58300A0E31C2084E53530A0AE -S21902875FE3203084E58010A0E386E0FFEB010515E30200001AE5 -S2190287740130A0E3043084E530A81BE90030A0E3043084E5303C -S219028789A81BE9BC040300000004900DC0A0E100D82DE9243041 -S21902879E9FE5002093E504B04CE2010512E30200001A0130A0D9 -S2190287B3E3043080E500A81BE90030A0E3043080E500A81BE98A -S2190287C8000004900DC0A0E100D82DE9803260E0030180E0006F -S2190287DD0180E014209FE50002A0E1483092E504B04CE20FE024 -S2190287F2A0E103F0A0E100A81BE9500000000DC0A0E170D82DB7 -S219028807E9040051E304B04CE24CD04DE20040A0E12900001A03 -S21902881C045094E5010055E32600001A8300A0E38110A0E3548C -S219028831E0FFEB1E00A0E3E3FFFFEB8300A0E30310A0E3023026 -S219028846A0E3043084E50060A0E34CE0FFEB0500A0E1DBFFFF9E -S21902885BEB8300A0E30330A0E3043084E50510A0E145E0FFEB18 -S2190288700500A0E3D4FFFFEB020000EA0A00A0E3D1FFFFEB0173 -S2190288856086E2090056E30C0000CA0400A0E12010A0E300308F -S21902889AA0E360300BE560204BE200208DE55C304BE258204B04 -S2190288AFE2CF0700EB000050E3EFFFFF0A0430A0E3043084E58C -S2190288C470A81BE90DC0A0E100D82DE93500A0E304B04CE28620 -S2190288D9F0FFEB00A81BE90DC0A0E100D82DE904B04CE202C01D -S2190288EEA0E100E0A0E103005CE30200009A003081E103001306 -S219028903E30A00000A0C30A0E101C04CE2000053E30500000A70 -S2190289180C20A0E10130D1E401C04CE20130CEE4000052E3F9B0 -S21902892DFFFF1A00A81BE900E0A0E10F005CE30E00009A0430DF -S21902894291E404308EE4042091E404208EE4043091E404308E64 -S219028957E4042091E410C04CE204208EE40F005CE3F4FFFF8A29 -S21902896C020000EA043091E404C04CE204308EE403005CE3FA86 -S219028981FFFF8A0C30A0E101C04CE2000053E30500000A0C2035 -S219028996A0E10130D1E401C04CE20130CEE4000052E3F9FFFF60 -S2190289AB1A00A81BE90DC0A0E1F0DF2DE904B04CE250D04DE286 -S2190289C00170A0E178404BE200A0A0E3005050E20260A0E10339 -S2190289D580A0E10490A0E10300001A3030A0E378304BE57740E1 -S2190289EA4BE2090000EA0500A0E10610A0E1241700EB0030D806 -S2190289FFE70610A0E10130C4E40500A0E1C31500EB005050E23A -S219028A14F5FFFF1A090054E10500000A0920A0E1013074E501B7 -S219028A29A08AE20130C7E4020054E1FAFFFF1A0A00A0E1003045 -S219028A3EA0E30030C7E5F0AF1BE90DC0A0E1F0DF2DE904B04CE7 -S219028A53E234D04DE24C200BE50180A0E148204BE250200BE59F -S219028A680060A0E30140D8E40070A0E158600BE5060054E1FE40 -S219028A7D00000A250054E3ED00001A0030A0E354300BE5014008 -S219028A92D8E40350A0E12D0054E30200001A0120A0E354200B95 -S219028AA7E50140D8E4300054E30200001A0140D8E40190A0E33D -S219028ABC060000EA0390A0E1040000EA053185E08330A0E130AD -S219028AD13043E2045083E00140D8E4303044E2090053E3F7FFC5 -S219028AE6FF9A2E0054E30600001A0140D8E4019089E20000005D -S219028AFBEA0140D8E4303044E2090053E3FBFFFF9A00A0A0E3FD -S219028B106C0054E30140D804584044E2200054E304F19F9772D7 -S219028B250000EACC8B0200F48C0200F48C0200F48C0200F48CEB -S219028B3A0200F48C0200F48C0200F48C0200F48C0200F48C0293 -S219028B4F00F48C0200D08C0200CC8B0200F48C0200F48C0200CD -S219028B64F48C0200F48C0200F48C0200F48C0200F48C0200F477 -S219028B798C0200F48C0200F48C0200F48C0200AC8B0200F48C13 -S219028B8E0200F48C0200B08C0200F48C0200F48C0200F48C0283 -S219028BA300F48C0200CC8B02003000A0E30FE0A0E107F0A0E140 -S219028BB87800A0E30FE0A0E107F0A0E10190A0E30850A0E34C83 -S219028BCD301BE5040093E44C300BE5200054E304F19F972F00C4 -S219028BE200EA908C0200A48C0200A48C0200A48C0200A48C02A7 -S219028BF700A48C0200A48C0200A48C0200A48C0200A48C020068 -S219028C0CA48C0200A48C0200688C0200A48C0200A48C0200A4EA -S219028C218C0200A48C0200A48C0200A48C0200A48C0200A48CB1 -S219028C360200A48C0200A48C0200A48C0200848C0200A48C0246 -S219028C4B00A48C0200A48C0200A48C0200A48C0200A48C020013 -S219028C60A48C0200848C0200000050E32DA0A0B3000060B24807 -S219028C75104BE2B4319FE50A20A0E3050000EA48104BE2A83143 -S219028C8A9FE5010000EA48104BE2A0319FE51020A0E343FFFF91 -S219028C9FEB58000BE548204BE250200BE5140000EA4C301BE517 -S219028CB4042093E450200BE54C300BE50200A0E19C0000EB58DB -S219028CC9000BE50C0000EA4C301BE5043083E24C300BE50160C7 -S219028CDE86E2040053E5019088E20FE0A0E107F0A0E15D000096 -S219028CF3EA3F00A0E30FE0A0E107F0A0E1016086E258201BE590 -S219028D08055062E000005AE301504512000059E30800000A3055 -S219028D1D40A0E300005AE30600000A0A00A0E10FE0A0E107F038 -S219028D32A0E1016086E200A0A0E3000000EA2040A0E358201B58 -S219028D47E5019088E254301BE5012042E25C200BE5000053E3C5 -S219028D5C0800001A030000EA0400A0E10FE0A0E107F0A0E1017E -S219028D716086E20530A0E1015045E2000053E3F7FFFFCA0000FB -S219028D865AE30300000A0A00A0E10FE0A0E107F0A0E10160862D -S219028D9BE25C201BE558301BE50F0000EA50301BE50140D3E465 -S219028DB0016086E250300BE50400A0E10FE0A0E107F0A0E10AF7 -S219028DC50054E30300001A0D00A0E30FE0A0E107F0A0E1016065 -S219028DDA86E258301BE50320A0E1012042E258200BE5000053E9 -S219028DEFE3ECFFFFCA54301BE5000053E31A00000A0530A0E13D -S219028E04015045E2000053E3160000DA2000A0E30FE0A0E1079A -S219028E19F0A0E1016086E20530A0E1015045E2000053E3F7FFA9 -S219028E2EFFCA0D0000EA90F902009CF90200B0F902000400A0F7 -S219028E43E10FE0A0E107F0A0E1016086E20A0054E3019088E245 -S219028E580300001A0D00A0E30FE0A0E107F0A0E1016086E200A0 -S219028E6D40D8E50980A0E1000054E300FFFF1A0600A0E1F0AF6D -S219028E821BE90DC0A0E100D82DE918309FE5002093E50100C26D -S219028E97E40010A0E3002083E504B04CE20010C2E500A81BE97B -S219028EAC6C3703000DC0A0E10E002DE900D82DE918309FE500D8 -S219028EC10083E510B04CE204109BE50C009FE508208BE2DBFEAD -S219028ED6FFEB010000EA6C370300848E020000A81BE90DC0A0D8 -S219028EEBE10F002DE900D82DE910009FE514B04CE204109BE55D -S219028F0008208BE2CFFEFFEB000000EA8891020000A81BE90D4B -S219028F15C0A0E100D82DE90030A0E10120A0E10310A0E1080022 -S219028F2A9FE504B04CE2C4FEFFEB00A81BE9889102000DC0A0E5 -S219028F3FE100D82DE90020A0E30130D0E404B04CE2020053E1A7 -S219028F540300000A0130D0E4012082E2000053E3FBFFFF1A023F -S219028F6900A0E100A81BE90DC0A0E100D82DE90130D1E400207D -S219028F7EA0E10100D2E404B04CE2030050E10500001A0000501A -S219028F93E30400000A0100D2E40130D1E4030050E1F9FFFF0AFF -S219028FA8000063E000A81BE90DC0A0E100D82DE90130D1E4009C -S219028FBD0053E304B04CE20300000A0130C0E40130D1E40000B8 -S219028FD253E3FBFFFF1A0030A0E30030C0E500A81BE90DC0A099 -S219028FE7E100D82DE900E0A0E10120DEE404B04CE2020000EA8D -S219028FFC000050E30F00000A0120DEE401C0D1E4200082E2FF31 -S2190290110000E2413042E2190053E30200A08120308CE2FF207D -S21902902603E241304CE2190053E30C30A0810230A09103005048 -S21902903BE1EEFFFF0A000063E000A81BE90DC0A0E100D82DE917 -S219029050000052E304B04CE200C0A0E10300001A0200A0E1000C -S219029065A81BE9000063E000A81BE90100DCE40130D1E40300AA -S21902907A50E1F9FFFF1A000050E30100000A012052E2F7FFFF10 -S21902908F1A0000A0E300A81BE90DC0A0E110D82DE9000052E3FB -S2190290A404B04CE20040A0E10500001A0200A0E110A81BE900AF -S2190290B90063E010A81BE9012052E21000000A01C0D4E401E0D3 -S2190290CED1E420008CE2FF0000E241304CE2190053E30C00A0C8 -S2190290E38120308EE2FFC003E241304EE2190053E30E30A0813D -S2190290F80C30A091030050E1ECFFFF1A000050E3ECFFFF1A0080 -S21902910D00A0E310A81BE90DC0A0E100D82DE904B04CE202C027 -S219029122A0E1070000EA0120D0E40130D1E4030052E1030000CB -S2190291370A013050E5010051E5030060E000A81BE90C30A0E1C9 -S21902914C01C04CE2000053E3F3FFFFCA0000A0E300A81BE90DEB -S219029161C0A0E100D82DE9012052E2FF1001E204B04CE2020098 -S219029176004A0110C0E4012052E2FCFFFF5A00A81BE90DC0A01C -S21902918BE1F0D92DE9BC309FE504B04CE2004093E5FF6000E2BD -S2190291A0000054E31900001AA8309FE50000E0E30380A0E134F2 -S2190291B52093E50850A0E10FE0A0E102F0A0E10070A0E13430F5 -S2190291CA95E50400A0E10FE0A0E103F0A0E1143095E500009355 -S2190291DFE5014084E20C3093E50610A0E10FE0A0E103F0A0E1B9 -S2190291F4000054E3F2FFFFDA343098E50700A0E10FE0A0E10382 -S219029209F0A0E1F0A91BE940209FE5143092E5000053E3050061 -S21902921E000A000093E50C3093E50610A0E10FE0A0E103F0A064 -S219029233E1F0A91BE9183092E5000093E50C3093E50610A0E11F -S2190292480FE0A0E103F0A0E1F0A91BE9E0C20300500000000D87 -S21902925DC0A0E110D82DE930209FE504B04CE2143092E5004005 -S219029272A0E1000053E30500000A000093E5103093E50FE0A05B -S219029287E103F0A0E10000C4E510A81BE9183092E5F7FFFFEA73 -S21902929C500000000DC0A0E1F0DF2DE9E0309FE504B04CE200BD -S2190292B160A0E1004093E50390A0E1000054E31C00001A000087 -S2190292C6E0E3C4309FE50450A0E10380A0E1342093E50870A094 -S2190292DBE10FE0A0E102F0A0E100A0A0E1343097E50500A0E12C -S2190292F00FE0A0E103F0A0E1143097E5000093E51C3093E5067C -S21902930510A0E10FE0A0E103F0A0E1004050E20C00001A0150EE -S21902931A85E2000055E3F0FFFFDA343098E50A00A0E10FE0A0D5 -S21902932FE103F0A0E1130000EA54209FE5143092E5000053E3E7 -S2190293440800000A080000EA0130A0E3003089E5302098E505E5 -S21902935900A0E10FE0A0E102F0A0E10400A0E1F0AF1BE9183024 -S21902936E92E5000093E51C3093E50610A0E10FE0A0E103F0A096 -S219029383E10040A0E10400A0E1F0AF1BE9E0C20300500000000F -S2190293980DC0A0E1F0D92DE9D8309FE504B04CE2004093E50066 -S2190293AD60A0E1000054E31C00001AC4309FE50000E0E3038098 -S2190293C2A0E1342093E50850A0E10FE0A0E102F0A0E10070A076 -S2190293D7E1343095E50400A0E10FE0A0E103F0A0E114C095E504 -S2190293EC00005CE30500000A00009CE50710A0E314309CE50631 -S21902940120A0E10FE0A0E103F0A0E1014084E2000054E3EFFFFE -S219029416FFDA343098E50700A0E10FE0A0E103F0A0E10A00000A -S21902942BEA50309FE514C093E50380A0E100005CE30500000A99 -S21902944000009CE50710A0E314309CE50620A0E10FE0A0E10316 -S219029455F0A0E118C098E500005CE30500000A00009CE507104F -S21902946AA0E314309CE50620A0E10FE0A0E103F0A0E1F0A91B5F -S21902947FE9E0C20300500000000DC0A0E1F0DD2DE904B04CE2E0 -S21902949404D04DE20250A0E10060A0E10640A0E10070A0E3B497 -S2190294A9819FE5002098E5000052E30600000A0030D2E50000D9 -S2190294BE53E30300000A0130D2E425304BE5002088E516000040 -S2190294D3EA060054E10030A0130130A003000055E30030A0D3C6 -S2190294E8000053E30D00000A3200A0E3A7FFFFEB000000EA32BA -S2190294FD5045E2000055E3030000DA25004BE263FFFFEB0070B9 -S21902951250E2F8FFFF0A000057E30300001A0000E0E3510000A0 -S219029527EA25004BE24AFFFFEB25205BE50030A0E30D0052E33F -S21902953C0030C4E50200A0E11B00000A080000CA080050E32C59 -S21902955100000A020000CA030050E30C00000A380000EA0A00B0 -S21902956650E31200000A350000EA2B0050E32E00000A020000E3 -S21902957BCA240050E32B00000A2F0000EA7F0050E31D00000A8C -S2190295902C0000EA060054E10300001AC4009FE550FEFFEB01D0 -S2190295A500E0E3300000EA0100C4E4B4A09FE5270000EA2520F6 -S2190295BA5BE5A8A09FE50A0052E30200001A0030DAE50D0053DF -S2190295CFE32000000A0D0052E30200001A0030DAE50A0053E3E6 -S2190295E41B00000A0D00A0E3E5FEFFEB0A00A0E3E3FEFFEB256C -S2190295F9305BE50030CAE50100A0E3190000EA5CA09FE50600FA -S21902960E54E11000000A0800A0E3DAFEFFEB2000A0E3D8FEFF2C -S219029623EB0800A0E3D6FEFFEB014044E2080000EA060054E163 -S2190296380200001AF8E1FFEB0000A0E3090000EACEFEFFEB25E6 -S21902964D305BE514A09FE50130C4E425305BE50030CAE591FF7C -S219029662FFEA84C30300C4F90200C0040300F0AD1BE90DC0A025 -S219029677E1F0DF2DE904B04CE20060A0E1060051E106704180DF -S21902968C0170A091000057E30290A0E13B0000DA000059E3037F -S2190296A100000AE4009FE5061069E00DFEFFEB020000EAD40027 -S2190296B69FE50610A0E109FEFFEB0050A0E3108047E210A086CA -S2190296CBE2070055E1030000AAB8009FE50510D6E701FEFFEBC0 -S2190296E0010000EAAC009FE5FEFDFFEBC54FA0E1053064E0015F -S2190296F530C3E3053063E0010053E30100001A90009FE5F6FDB2 -S21902970AFFEBA43EA0E1033085E00730C3E3053063E0070053AF -S21902971FE30100001A70009FE5EEFDFFEB015085E20F0055E368 -S219029734E4FFFFDA60009FE5E9FDFFEB0050A0E3070055E10495 -S2190297490000AA0510D6E7203041E25E0053E32E10A083000020 -S21902975E00EA2010A0E338009FE5DEFDFFEB015085E20F0055B5 -S219029773E3F2FFFFDA28009FE5D9FDFFEB0A60A0E1007058E22C -S219029788C3FFFFCAF0AF1BE9C8F90200D4F90200DCF90200E04E -S21902979DF90200E4F90200E8F90200ECF902000DC0A0E100D8E6 -S2190297B22DE90020A0E304B04CE2ACFFFFEB00A81BE90DC0A052 -S2190297C7E10F002DE930D82DE914B04CE208D04DE248409FE55D -S2190297DC04009BE5005094E508108BE2C9FDFFEB38009FE5BC77 -S2190297F1FDFFEB1C004BE20020A0E3002084E50810A0E31FFF47 -S219029806FFEB1C305BE5590053E30000A0130100A0037900531E -S21902981BE30100A003005084E5010000EA84C30300F0F90200D1 -S21902983030A81BE90DC0A0E1F0DF2DE904B04CE20050A0E10159 -S21902984570A0E14C419FE50260A0E12CC014E503A0A0E1000019 -S21902985A5CE30300000A0A30A0E300308AE50000E0E3F0AF1BCD -S21902986FE90100A0E3710C00EB0000C4E52004A0E10100C4E510 -S2190298840500A0E10030D0E5022084E2000053E30300000A0191 -S21902989930C2E40130F0E5000053E3FBFFFF1A0030A0E30130AA -S2190298AEC2E4030056E1E4009F050200000A010056E3E6FFFF0C -S2190298C31AD8009FE50030D0E5D4809FE5D4609FE5000053E368 -S2190298D80300000A0130C2E40130F0E5000053E3FBFFFF1A0839 -S2190298ED40A0E10400A0E10050A0E30050C2E50510A0E10C208D -S219029902A0E315FEFFEB144044E20190A0E3BA91C4E10500A0A6 -S219029917E13D0C00EB140084E5003096E5B000D6E1093083E0F4 -S21902992C003086E5420C00EBB801C4E1B430D7E1050053E10216 -S21902994100001A4500A0E33C0C00EBB400C7E1180088E20720F0 -S219029956A0E150109FE50830A0E11F0A00EB000050E307000089 -S21902996BBA149008E50C5084E50030E0E3103084E5085084E573 -S219029980045084E50500A0E1F0AF1BE90000E0E30930A0E30066 -S219029995308AE5F0AF1BE99C37030008FA020014FA02008437CF -S2190299AA0300C8040300050200000DC0A0E100D82DE90000A0EC -S2190299BFE308309FE504B04CE2000083E500A81BE9703703004D -S2190299D40DC0A0E1F0DF2DE904B04CE218D04DE234000BE50027 -S2190299E930A0E33C300BE538100BE50280A0E10C629FE5010025 -S2190299FE53E1870000AA2C5046E20C3095E5000053E315000043 -S219029A13DA34001BE538C01BE53C201BE5341295E50C4062E087 -S219029A28040053E10340A0B10420A0E1A9FBFFEB34C01BE534FB -S219029A3D3295E504C08CE034C00BE50C2095E5043083E03432AA -S219029A5285E5022064E00C2085E53C101BE5041081E03C100B7A -S219029A67E5690000EA103095E5020C53E36A00003A0530A0E351 -S219029A7C88019FE50020A0E330300BE5209085E22C200BE51467 -S219029A91A085E274119FE530304BE200308DE50920A0E10A3096 -S219029AA6A0E1140A00EB004050E20470A0E31C0000AA04309522 -S219029ABBE5013083E2043085E5050053E3020000CA083095E5BD -S219029AD0000053E30100001A0830A0E3470000EA0700A0E1D5E0 -S219029AE50B00EB0000C6E52004A0E10100C6E5B800D5E1D00B2A -S219029AFA00EB0200C6E50710A0E12004A0E10300C6E50920A004 -S219029B0FE1F4009FE50A30A0E1B10900EB000050E33B0000AA69 -S219029B240930A0E3340000EA0030D6E50100D6E5000483E1C07C -S219029B390B00EB030050E32000001A0230D6E50300D6E50004FB -S219029B4E83E1BA0B00EB083095E5013083E2030050E105000066 -S219029B631A044044E2104085E50C4085E5043086E2343285E586 -S219029B78080085E50700A0E1AE0B00EB0000C6E52004A0E101E2 -S219029B8D00C6E5B800D5E1A90B00EB0200C6E50710A0E120049B -S219029BA2A0E10300C6E50920A0E158009FE50A30A0E18A0900A4 -S219029BB7EB000050E3140000AA0930A0E30D0000EA0030D6E518 -S219029BCC0100D6E5000483E1990B00EB050050E30600001A0270 -S219029BE130D6E50300D6E5000483E1930B00EB000088E5000061 -S219029BF6E0E30A0000EA0B30A0E3003088E50000E0E306000078 -S219029C0BEA9C370300050200003C201BE538301BE5030052E17C -S219029C2078FFFFBA3C001BE5F0AF1BE90DC0A0E100D82DE901DC -S219029C350040E204B04CE20B0050E300F19F97230000EA789C89 -S219029C4A0200809C0200889C0200909C0200989C0200A09C0216 -S219029C5F00A89C0200B09C0200B89C0200C09C0200C89C02003B -S219029C74D09C020060009FE500A81BE95C009FE500A81BE958F2 -S219029C89009FE500A81BE954009FE500A81BE950009FE500A88F -S219029C9E1BE94C009FE500A81BE948009FE500A81BE944009FCF -S219029CB3E500A81BE940009FE500A81BE93C009FE500A81BE928 -S219029CC838009FE500A81BE934009FE500A81BE930009FE50000 -S219029CDDA81BE92CFA02003CFA020050FA020074FA02008CFA1D -S219029CF20200A0FA0200B4FA0200C4FA0200D8FA0200F4FA0284 -S219029D070008FB02001CFB02001CFA02000DC0A0E170D82DE95E -S219029D1CAC309FE504B04CE20160A0E1004093E50350A0E1007B -S219029D310054E31800001AD50D00EB90009FE5043090E505001E -S219029D4653E30500001AB831D0E1000053E30000001AFD0D00B8 -S219029D5BEB0400A0E170A81BE9000053E30400001A2D0100EBF3 -S219029D700A30A0E30030C6E50100A0E370A81BE950409FE5800B -S219029D8520A0E30410A0E10F0E00EB44309FE5000085E50040E0 -S219029D9A83E5000095E5000050E30800000A2CC09FE500109C6A -S219029DAFE50130D1E40030C6E5002095E50100A0E300108CE553 -S219029DC4012042E2002085E570A81BE9D0040300B439030008C9 -S219029DD9400300884003000DC0A0E170D82DE904B04CE204D0FE -S219029DEE4DE26440A0E30060A0E119504BE2090000EA01405404 -S219029E03E20200001A0F0000EB6440A0E3040000EA28309FE55A -S219029E18482093E56400A0E30FE0A0E102F0A0E10600A0E105F8 -S219029E2D10A0E1B7FFFFEB000050E3F0FFFF0A19005BE5000064 -S219029E4200EA5000000070A81BE90DC0A0E1F0DD2DE99C709FD2 -S219029E57E504B04CE20760A0E194509FE594A09FE594809FE588 -S219029E6C0A0000EA0400A0E1002095E50610A0E10F0E00EB0028 -S219029E810050E3030000DA003095E5006086E0033060E00030A2 -S219029E9685E57D0D00EB003095E5000053E30900000A58409FA7 -S219029EABE5043094E5050053E30100001A0400A0E1A40D00EB92 -S219029EC0043094E5000053E3E8FFFF1AD50000EB00708AE544C0 -S219029ED53098E50040A0E3004085E5040053E10200000A04000F -S219029EEAA0E1CEE4FFEB444088E5F0AD1BE98C400300D4040303 -S219029EFF008C41030050000000B43903000DC0A0E110D82DE9EB -S219029F14A8209FE5A8409FE5003092E5FF1001E20110C3E42404 -S219029F290051E3003082E504B04CE20130A003003084050020C2 -S219029F3E94E5230051E30030A0130130A003000052E30030A07B -S219029F5303000053E30500000A68209FE50130A0E3003082E553 -S219029F6860109FE5013043E2003081E558209FE5003092E50159 -S219029F7D3083E2003082E5010C53E30900000A38309FE500203A -S219029F9293E5000052E30800000A2C209FE5003092E5013083C9 -S219029FA7E2003082E5030053E30200001AA4FFFFEB0030A0E390 -S219029FBC003084E510A81BE98C410300A8390300AC390300B0E8 -S219029FD1390300D40403000DC0A0E110D82DE904B04CE27600B9 -S219029FE600EB0040A0E114009FE514109FE5EE20A0E3BAFBFF2E -S219029FFBEB0400A0E17F0000EB10A81BE9F8FB020000FC0200C1 -S21902A0100DC0A0E110D82DE904B04CE2680000EB0040A0E114DE -S21902A025009FE514109FE5012CA0E3ACFBFFEB0400A0E17100BC -S21902A03A00EB10A81BE9F8FB020010FC02000DC0A0E1F0D82D1D -S21902A04FE904B04CE20060A0E10150A0E17AFFFFEB44209FE52C -S21902A064003092E540709FE5033183E08340A0E1030000EA48F5 -S21902A0793097E56400A0E30FE0A0E103F0A0E10600A0E10510B8 -S21902A08EA0E11FFFFFEB000050E30200001A014044E201007402 -S21902A0A3E3F3FFFF1AF0A81BE9CC040300500000000DC0A0E1A6 -S21902A0B80E002DE930D82DE910B04CE204309BE50050A0E304D1 -S21902A0CD3043E2030053E303F19F97200000EA1CA10200ECA06A -S21902A0E202003CA1020050A1020054409FE554309FE5001094CA -S21902A0F7E50120A0E3002083E5000051E30100001A830500EB7A -S21902A10C000084E5000094E5C4D9FFEB100000EA28309FE520D8 -S21902A121209FE5005093E5000092E50010A0E3001083E5B0D9AB -S21902A136FFEB080000EA04309FE5005093E5050000EAD80403E3 -S21902A14B00DC04030010209FE508309BE5005092E5003082E54B -S21902A1600500A0E1000000EACC04030030A81BE90DC0A0E13046 -S21902A175D82DE904B04CE204D04DE20040A0E10200A0E1015066 -S21902A18AA0E159EAFFEB0400A0E10030A0E3003085E515104BC9 -S21902A19FE2DBFEFFEB000050E30300000A15305BE5030053E301 -S21902A1B40130A003003085050100A0E330A81BE90DC0A0E13023 -S21902A1C9D82DE92C409FE50000E0E3343094E504B04CE20FE02B -S21902A1DEA0E103F0A0E10050A0E1343094E50000A0E30FE0A0B0 -S21902A1F3E103F0A0E10500A0E130A81BE9500000000DC0A0E1FB -S21902A20800D82DE910309FE5342093E504B04CE20FE0A0E10268 -S21902A21DF0A0E100A81BE9500000000DC0A0E110D82DE9381024 -S21902A2329FE538209FE50030A0E3003081E530409FE5000092E1 -S21902A247E5343094E504B04CE20FE0A0E103F0A0E11C209FE5B3 -S21902A25C303094E5000092E50FE0A0E103F0A0E110A81BE9E016 -S21902A271C203000040030050000000044003000DC0A0E170D89C -S21902A2862DE964309FE50150A0E3005083E504B04CE258409FE9 -S21902A29BE50060E0E3342094E50600A0E10FE0A0E102F0A0E168 -S21902A2B044309FE5000083E5342094E50500A0E10FE0A0E1026D -S21902A2C5F0A0E1301094E50600A0E10FE0A0E101F0A0E120309A -S21902A2DA9FE5000083E5302094E50500A0E10FE0A0E102F0A02B -S21902A2EFE170A81BE9E0C20300500000000040030004400300D7 -S21902A3040DC0A0E170D82DE9AC609FE5003096E504B04CE20074 -S21902A3190053E31E00001A9C409FE5343094E50000E0E30FE0CB -S21902A32EA0E103F0A0E10050A0E1343094E50100A0E30FE0A05D -S21902A343E103F0A0E1141094E574309FE574209FE5043081E532 -S21902A35870309FE5082081E50C3081E568209FE568309FE5105D -S21902A36D2081E5143081E560209FE560309FE5182081E51C30A2 -S21902A38281E5342094E50500A0E10FE0A0E102F0A0E10130A052 -S21902A397E3003086E540309FE540409FE5B010D3E10400A0E13B -S21902A3AC3E0C00EB34209FE5043094E5003082E570A81BE9E048 -S21902A3C104030050000000D89F020010A002000C9F0200E09DD4 -S21902A3D60200B4A0020070A1020048A0020070C30300B43903F0 -S21902A3EB00FC3F03000DC0A0E130D82DE904B04CE2240C00EBAF -S21902A40078309FE578109FE5002093E50350A0E1040091E50121 -S21902A41540A0E1000052E11400000A040050E30E00001A94FF27 -S21902A42AFFEB54309FE554009FE5000083E550109FE50130A02F -S21902A43FE3003081E548109FE548309FE50D20A0E30020C0E53B -S21902A454003081E53C209FE50030A0E3003082E5043094E5007F -S21902A4690053E30000001AA3FFFFEB043094E5003085E530A8DC -S21902A47E1BE9FC3F0300B43903008840030008400300D00403A3 -S21902A493008C4103008C400300D40403000DC0A0E1F0D92DE906 -S21902A4A868319FE5001093E504B04CE2000051E30900001A5862 -S21902A4BD019FE558219FE50130A0E3003080E5001082E54C31C4 -S21902A4D29FE54C119FE5003081E50080A0E1150000EA40019F93 -S21902A4E7E530119FE50120A0E371F5FFEB34019FE528119FE545 -S21902A4FC0220A0E314419FE56CF5FFEB0410A0E120019FE50140 -S21902A51120A0E368F5FFEB18019FE518119FE50520A0E364F5F9 -S21902A526FFEB10019FE50480A0E10C119FE50520A0E35FF5FFF9 -S21902A53BEB04419FE50030A0E3003084E5FC509FE5110300EB35 -S21902A550480800EBF4309FE50460A0E1030055E10370A0E109F1 -S21902A56500000A0140A0E30500A0E10FE0A0E104F095E50000A8 -S21902A57A50E30C4085150C008505105085E2070055E1F6FFFF1E -S21902A58F1ABC309FE5002093E5000052E30200001AB0009FE509 -S21902A5A44FFAFFEBF0A91BE9003098E5000053E30600000A9C3C -S21902A5B9009FE5C80500EB000050E30200000A90009FE545FAB8 -S21902A5CEFFEB010000EA0130A0E3003086E5003096E50000534F -S21902A5E3E30A00000A4C009FE56C0000EB0010A0E168009FE5C1 -S21902A5F83AFAFFEB40009FE5670000EB0010A0E158009FE53571 -S21902A60DFAFFEB3BFFFFEBF0A91BE974C30300ECC2030028C5B4 -S21902A62203002823000070C3030074FB02004CFB0200A4FB023D -S21902A63700C0FB0200F0040300E8FB0200A4C30300BCC4030081 -S21902A64CB4060300C40603002CC503001CFC020090C303003CC8 -S21902A661FC020068FC020070FC02000DC0A0E1F0DF2DE904B024 -S21902A6764CE20040A0E10190A0E100A0A0E30A80A0E10160A098 -S21902A68BE30070A0E301C0D4E40A50A0E307005CE13500000A04 -S21902A6A030005CE30030A0130130A003030016E10A00000A006A -S21902A6B530D4E5411043E2202083E2FF2002E2190051E3023003 -S21902A6CAA091780053E30200001A1050A0E3014084E201C0D45A -S21902A6DFE400E0A0E30E60A0E130104CE2FF0001E241204CE24A -S21902A6F4FF3002E2050053E3090050830200009A61304CE205C0 -S21902A7090053E30000008A01E0A0E300005EE31200000A0000B3 -S21902A71EA0E3FF3001E2090053E30100A0910600009A61304C9C -S21902A733E2050053E357004C920200009AFF3002E2050053E3CE -S21902A74837004C92050050E1040000AA01C0D4E4950727E000E0 -S21902A75D005CE3CEFFFF1A030000EA2E005CE30100000A000056 -S21902A772A0E3F0AF1BE9033068E28331A0E117A38AE1018088C5 -S21902A787E2030058E3BDFFFFDA0A00A0E19E0800EB000089E577 -S21902A79C0100A0E3F0AF1BE90DC0A0E110D82DE90010A0E10895 -S21902A7B1D04DE20230D1E528409FE500308DE50320D1E504201A -S21902A7C68DE50020D1E50130D1E504B04CE210109FE50400A01E -S21902A7DBE1B3F9FFEB0400A0E1010000EA9041030088FC020021 -S21902A7F010A81BE90DC0A0E1F0D82DE904B04CE200E0A0E1081A -S21902A805C09EE5FF1001E204609BE50250A0E1000096E503705D -S21902A81AA0E108208EE2140092E8044082E000C08CE014000095 -S21902A82FEA010052E10E00001A0230DCE508009EE502E093E2F2 -S21902A8440500000A0E10A0E10030DCE5011051E20130C5E40239 -S21902A859C08CE2FAFFFF1A00E087E50C3060E0003086E501003F -S21902A86EA0E3F0A81BE90230DCE58330A0E1043083E203C08CA0 -S21902A883E004005CE10300002A0020DCE5FF3002E2FF0053E342 -S21902A898E4FFFF1A0000A0E3F0A81BE90DC0A0E100D82DE90845 -S21902A8AD3090E5FF2002E20120C3E704B04CE200A81BE90DC0C1 -S21902A8C2A0E100D82DE90610A0E3002090E504B04CE201C0D268 -S21902A8D7E45C31A0E1010013E30100000A0130D2E4A32382E062 -S21902A8EC011051E2F8FFFF5A002080E500A81BE90DC0A0E1003D -S21902A901D82DE9002090E50130D2E404B04CE21C1003E21C00C1 -S21902A91651E301208212033003E2030053E30120821200208096 -S21902A92BE500A81BE90DC0A0E1F0DF2DE904B04CE20040A0E3A7 -S21902A9400090A0E100C099E50460A0E10120DCE401E0A0E16024 -S21902A9553002E2A332A0E14430CEE5800012E34100000A012074 -S21902A96ADCE40470A0E10F3002E2013083E240308EE503005726 -S21902A97FE13A0000AA303002E223A2A0E12283A0E10750A0E16F -S21902A99403005AE30AF19F97130000EAF0A90200B0A90200B88B -S21902A9A9A90200CCA902000160DCE40D0000EA0120DCE5003046 -S21902A9BEDCE5026483E102C08CE2080000EA0300DCE50020DC10 -S21902A9D3E50230DCE50110DCE5002C82E10338A0E1013483E1DA -S21902A9E8036082E104C08CE20E6085E7030058E308F19F971301 -S21902A9FD0000EA50AA020010AA020018AA02002CAA02000140BF -S21902AA12DCE40D0000EA0120DCE50030DCE5024483E102C08CA6 -S21902AA27E2080000EA0300DCE50020DCE50230DCE50110DCE5D5 -S21902AA3C002C82E10338A0E1013483E1034082E104C08CE20141 -S21902AA514084E220308EE2054083E7017087E240309EE50450B3 -S21902AA6685E2030057E1C8FFFFBA00C089E5F0AF1BE90DC0A074 -S21902AA7BE130D82DE904B04CE204D04DE200C0A0E118000BE592 -S21902AA900C10A0E10130D1E40250A0E1FF3003E218100BE51B0D -S21902AAA50053E30800000A18C00BE510009FE510109FE500202D -S21902AABADCE5BCE3FFEB0000A0E3240000EA94FC0200B8FC025D -S21902AACF00010081E218000BE50120D1E5011080E218100BE59D -S21902AAE43F3002E20030C5E5800012E30300000A0130D0E501C0 -S21902AAF930C5E5012081E218200BE518301BE50140D3E4024039 -S21902AB0EC5E518300BE5010014E30100000A18004BE266FFFF9D -S21902AB23EB020014E30100000A18004BE262FFFFEB040014E39C -S21902AB380100000A18004BE26DFFFFEB080014E30200000A1838 -S21902AB4D004BE2041085E275FFFFEB0100A0E330A81BE90DC0B9 -S21902AB62A0E100D82DE904B04CE200C0A0E10130DCE402E0A0D2 -S21902AB77E11A0053E30500000A90009FE590109FE501205CE5E8 -S21902AB8C88E3FFEB0000A0E300A81BE901C08CE20100DCE40039 -S21902ABA130A0E301C08CE200308EE5031010E20500004A03209C -S21902ABB6A0E10130DCE7022483E1011051E2FBFFFF5A00208E3F -S21902ABCBE5033000E2013083E203C08CE00010A0E33C3000E2CE -S21902ABE02331A0E1013083E204308EE5030051E1060000AA085A -S21902ABF5008EE20130DCE40130C0E704209EE5011081E20200EE -S21902AC0A51E1F9FFFFBA0100A0E300A81BE994FC0200CCFC02BF -S21902AC1F000DC0A0E100D82DE9001050E204B04CE20300000AAC -S21902AC3410009FE55DE3FFEB0000A0E300A81BE904009FE5008F -S21902AC49A81BE9DCFC0200B04103000DC0A0E130D82DE904B055 -S21902AC5E4CE20050A0E31C409FE5005084E50400A0E19EF6FF28 -S21902AC73EB2C4084E2015085E2000055E3F8FFFFDA30A81BE96C -S21902AC88B04103000DC0A0E100D82DE904B04CE2D8F6FFEB00E6 -S21902AC9DA81BE90DC0A0E100D82DE904B04CE205F7FFEB00A843 -S21902ACB21BE90DC0A0E110D82DE940409FE51C3094E504B04C6D -S21902ACC7E2000053E30100000A0000A0E310A81BE9030084E8A0 -S21902ACDC980200EB000050E30500001A083094E50120A0E31C14 -S21902ACF12084E5003063E2103084E510A81BE910A81BE900C563 -S21902AD0603000DC0A0E100D82DE93C209FE50010A0E11C3092A3 -S21902AD1BE504B04CE2000053E30100001A0700A0E300A81BE9CE -S21902AD30143092E5030051E10300003A183092E50000A0E30395 -S21902AD450051E10000003A0100A0E300A81BE900C503000DC0C1 -S21902AD5AA0E100D82DE930009FE504B04CE21C3090E502C0A0B5 -S21902AD6FE1000053E30500000A143090E5003081E5182090E5A6 -S21902AD8400208CE50000A0E300A81BE90700A0E300A81BE900BD -S21902AD99C503000DC0A0E100D82DE92C209FE51C3092E504B053 -S21902ADAE4CE2000053E30500000A083092E5003080E50C209214 -S21902ADC3E5002081E50000A0E300A81BE90700A0E300A81BE9A4 -S21902ADD800C503000DC0A0E1F0DF2DE904B04CE200A0A0E3005F -S21902ADED50A0E10180A0E108C19FE50290A0E11C309CE50C70CE -S21902AE02A0E10A0053E10100001A0700A0E3F0AF1BE900609736 -S21902AE17E5E8109FE5E8209FE50600A0E1022061E0ACF6FFEBBC -S21902AE2C0E02A0E3021A80E2202090E4000031E1FCFFFF1A1609 -S21902AE410F07EE9A0F07EE0000A0E10000A0E10000A0E10000D0 -S21902AE56A0E10000A0E10000A0E1101F11EE011AC1E3101F0140 -S21902AE6BEE151F07EE0000A0E10000A0E10000A0E10000A0E1B0 -S21902AE800000A0E10000A0E1103097E5034005E00410A0E10833 -S21902AE955085E070009FE50520A0E110F8FFEB68809FE50400F0 -S21902AEAA00EA083097E560009FE50130C3E3034084E009F8FF8C -S21902AEBFEB050054E10600002A0400A0E10FE0A0E106F0A0E1B6 -S21902AED4730200EB00A050E2F2FFFF0A004089E5101F11EE0159 -S21902AEE91A81E3031081E3101F01EE0800A0E1FAF7FFEB0A00CC -S21902AEFEA0E1F0AF1BE900C5030054B9020074BA0200F8FC0217 -S21902AF130014FD020010FD02000DC0A0E1F0DF2DE904B04CE2EB -S21902AF2804D04DE20270A0E10090A0E30050A0E1A4C09FE5014A -S21902AF3D60A0E11C209CE50CA0A0E12C300BE5090052E107009E -S21902AF52A0034300000A00809AE584109FE584209FE50800A00C -S21902AF67E1022061E05BF6FFEB0E02A0E3021A80E2202090E48A -S21902AF7C000031E1FCFFFF1A160F07EE9A0F07EE0000A0E1005A -S21902AF9100A0E10000A0E10000A0E10000A0E10000A0E1101FF0 -S21902AFA611EE011AC1E3101F01EE151F07EE0000A0E10000A069 -S21902AFBBE10000A0E10000A0E10000A0E10000A0E11C009FE5F5 -S21902AFD00610A0E1072086E00530A0E1C1F7FFEB090000EA00F6 -S21902AFE5C5030074BA0200B4BB020018FD020070009FE5077065 -S21902AFFA64E0B9F7FFEB0130C4E3035085E0036086E0000057AD -S21902B00FE30D0000DA0500A0E108309AE50610A0E1030057E14C -S21902B0240740A0B10340A0A10420A0E10FE0A0E108F0A0E11A4C -S21902B0390200EB009050E2EBFFFF0A2C301BE5005083E5101F16 -S21902B04E11EE011A81E3031081E3101F01EE0C009FE5A0F7FFAD -S21902B063EB0900A0E1010000EA10FD020014FD0200F0AF1BE9AC -S21902B0780DC0A0E100D82DE904B04CE2070050E300F19F971726 -S21902B08D0000EAB0B00200B8B00200C0B00200C8B00200D0B085 -S21902B0A20200D8B00200E0B00200E8B0020040009FE500A81B53 -S21902B0B7E93C009FE500A81BE938009FE500A81BE934009FE508 -S21902B0CC00A81BE930009FE500A81BE92C009FE500A81BE928D8 -S21902B0E1009FE500A81BE924009FE500A81BE920009FE500A883 -S21902B0F61BE938FD020058FD020070FD020088FD0200A4FD0213 -S21902B10B00BCFD0200CCFD0200F0FD020014FE02000DC0A0E151 -S21902B12000D82DE9003090E5000053E104B04CE20500000A0457 -S21902B1353090E5001083E5043090E5090081E8041080E500A8A5 -S21902B14A1BE9041083E5001083E5043081E5003081E500A81BFE -S21902B15FE90DC0A0E100D82DE90010A0E1000091E504B04CE2C6 -S21902B174010050E10400000A003090E5003081E5002090E504AB -S21902B1891082E500A81BE90000A0E300A81BE90DC0A0E170D8C2 -S21902B19E2DE93C309FE53C209FE53C509FE5043083E504B04C03 -S21902B1B3E2003083E50F40A0E3042082E50260A0E1002082E53F -S21902B1C80600A0E10510A0E1D1FFFFEB615E85E2014054E2F9FE -S21902B1DDFFFF5A70A81BE9E4410300DC410300EC4103000DC09D -S21902B1F2A0E130D82DE90620A0E304B04CE20050A0E1100085B1 -S21902B207E20140A0E1B3F5FFEB0410A0E118009FE50620A0E31B -S21902B21CAFF5FFEB10309FE5005083E50500A0E1020000EB3069 -S21902B231A81BE920C503002CC503000DC0A0E100D82DE900300D -S21902B246A0E1101080E204B04CE200C093E50020A0E30FE0A09D -S21902B25BE100F09CE500A81BE90DC0A0E1F0DF2DE944319FE5AD -S21902B27004B04CE288D04DE23CC19FE50540A0E34C8093E500CC -S21902B28590A0E100509CE50270A0E1AC100BE5000058E31000E1 -S21902B29A000A0850A0E100C095E514219FE520309CE524308C11 -S21902B2AFE50C3095E520208CE5000053E30700001A0500A0E15A -S21902B2C4F8109FE50320A0E10FE0A0E100F09CE50C3095E501A6 -S21902B2D93083E30C3085E5D0609FE50A0000EA003095E50500C6 -S21902B2EEA0E10FE0A0E118F093E5C8009FE5483096E50140440F -S21902B303E20FE0A0E103F0A0E1000054E33E0000DA003095E56F -S21902B3180500A0E10FE0A0E10CF093E5000050E3EEFFFF0AA8DE -S21902B32D900BE50EA0A0E3A4A00BE5AC301BE59C700BE5A03077 -S21902B3420BE50500A0E17C409FE50030A0E3003084E5A8104BEA -S21902B357E200C095E50220A0E300408DE50A3087E00FE0A0E156 -S21902B36C10F09CE558309FE5002093E50460A0E1000052E3186E -S21902B38100000A8EFBFFEB0040A0E140009FE5D4F6FFEB0900F1 -S21902B396A0E10A10A0E102F9FFEBAC001BE50710A0E1FFF8FF60 -S21902B3ABEB0400A0E193FBFFEB0B0000EA500000002CC5030065 -S21902B3C0E404030020C50300400D0300F0A8030028C50300249F -S21902B3D5FE0200002095E50500A0E10FE0A0E118F092E500301D -S21902B3EA96E5000053E3F8FFFF0A000058E30400000A00309588 -S21902B3FFE5242093E5202083E50010A0E3241083E5F0AF1BE917 -S21902B4140DC0A0E100D82DE930309FE5030051E104B04CE200E5 -S21902B429C0A0E10200001A0130A0E3003081E500A81BE9003084 -S21902B43E9CE50C00A0E124C093E50FE0A0E108F09CE500A81BDC -S21902B453E9F0A803000DC0A0E1F0D92DE9DC309FE5DC209FE51C -S21902B46804B04CE20070A0E14C6093E50180A0E1005092E50008 -S21902B47D0056E31000000A0650A0E100C095E5B8209FE52030A3 -S21902B4929CE524308CE50C3095E520208CE5000053E3070000B4 -S21902B4A71A0500A0E19C109FE50320A0E10FE0A0E100F09CE534 -S21902B4BC0C3095E5013083E30C3085E5003095E50500A0E10F42 -S21902B4D1E0A0E118F093E574009FE51FFFFFEB004050E20D00FF -S21902B4E6000A0700A0E10C1084E20E20A0E3F9F4FFEB0800A006 -S21902B4FBE1082094E51A1084E20E2042E2F4F4FFEB44009FE537 -S21902B5100410A0E100FFFFEB080094E5000000EA0400A0E100B1 -S21902B5250056E30400000A003095E5242093E5202083E50010A5 -S21902B53AA0E3241083E5F0A91BE9500000002CC50300E404030A -S21902B54F0020C50300E4410300DC4103000DC0A0E1F0D92DE983 -S21902B56404B04CE20050A0E30280A0E1080055E10160A0E10DE6 -S21902B5790000AA34709FE58541A0E1060094E7001097E506404A -S21902B58E84E0042094E5D1F4FFEB003097E5042094E5015085D2 -S21902B5A3E2023083E0003087E5080055E1F2FFFFBAF0A91BE9F4 -S21902B5B8F4A803000DC0A0E1F0D92DE904B04CE280D04DE2004A -S21902B5CD60A0E10C019FE50170A0E1E0FEFFEB008050E20C5028 -S21902B5E288120800001AF5FAFFEB0040A0E1F0009FE5F0109FE4 -S21902B5F7E50720A0E1EC509FE538F6FFEB0400A0E1FDFAFFEB6D -S21902B60CA0500BE50600A0E19C700BE5A0104BE2003096E50136 -S21902B62120A0E30FE0A0E114F093E5C0209FE5003092E5000073 -S21902B63653E30B00000AE0FAFFEB0040A0E1AC009FE526F6FFDD -S21902B64BEB0500A0E10E10A0E354F8FFEB0E0085E20E1047E2DF -S21902B66051F8FFEB0400A0E1E5FAFFEB003096E5242093E500E6 -S21902B6750052E31200000A1E1085E274009FE50420A0E3A1F69D -S21902B68AFFEB000050E30C00000A64309FE5002096E5005083EB -S21902B69FE5144092E524C092E554309FE50600A0E1143082E54A -S21902B6B40710A0E10FE0A0E104F09CE5003096E5144083E50096 -S21902B6C90058E30E00000A087088E52C009FE50810A0E18EFE58 -S21902B6DEFFEB0C0000EADC41030034FE020054FE0200ECA20337 -S21902B6F30028C5030064FE0200F0040300F4A803005CB502003E -S21902B708E4410300A0001BE59C101BE524F8FFEBF0A91BE90D01 -S21902B71DC0A0E100D82DE914309FE5000093E5002090E504B058 -S21902B7324CE20FE0A0E11CF092E500A81BE92CC503000DC0A0CD -S21902B747E1F0D82DE9F8209FE5F8109FE5022061E004B04CE2BA -S21902B75CF0709FE55CD04DE2004097E50400A0E15BF4FFEB0E0A -S21902B77102A0E3021A80E2202090E4000031E1FCFFFF1A160FBA -S21902B78607EE9A0F07EE0000A0E10000A0E10000A0E10000A0F1 -S21902B79BE10000A0E10000A0E1101F11EE011AC1E3101F01EEA4 -S21902B7B0151F07EE0000A0E10000A0E10000A0E10000A0E10050 -S21902B7C500A0E10000A0E150504BE20500A0E10FE0A0E104F0AF -S21902B7DAA0E1101F11EE011A81E3031081E3101F01EE0560A08B -S21902B7EFE140404BE20400A0E158109FE50320A0E310F6FFEBA9 -S21902B804000050E31400000A48009FE5B4F5FFEB3430A0E3246D -S21902B819308DE504E0A0E10F00BEE80DC0A0E10F00ACE80F0057 -S21902B82EBEE80F00ACE800309EE500308CE50F0096E8C2E0FF33 -S21902B843EB0800A0E3150000EA7CBC0200B4BB020000C5030001 -S21902B85874FE020078FE02000532A0E3143087E530C0D5E52FA5 -S21902B86D10D5E52EE0D5E52D20D5E50C1481E18134A0E10E243C -S21902B88282E1012082E2083087E50114A0E10C2087E59102035A -S21902B897E08330A0E1053283E2183087E5F0A81BE90DC0A0E147 -S21902B8AC10D82DE944309FE504B04CE20040A0E1033004E000D0 -S21902B8C10053E30A00000A30009FE50410A0E184F5FFEB28301D -S21902B8D69FE5033004E0000053E30100000A0400A0E310A81B20 -S21902B8EBE90200A0E310A81BE90300A0E110A81BE97E007E00DB -S21902B90098FE0200100010000DC0A0E100D82DE934309FE5004F -S21902B91520A0E3030050E104B04CE20100008A030051E1040099 -S21902B92A008A1C309FE5030050E10200008A030051E1000000B2 -S21902B93F9A0120A0E30200A0E100A81BE94400020048E7020008 -S21902B9540DC0A0E130D82DE904B04CE20040A0E1103F11EE2357 -S21902B96951A0E1015015E21000000A0E02A0E3021A80E220203D -S21902B97E90E4000031E1FCFFFF1A160F07EE9A0F07EE0000A0BB -S21902B993E10000A0E10000A0E10000A0E10000A0E10000A0E132 -S21902B9A8101F11EE0C10C1E3101F01EE161F07EE98C09FE598D9 -S21902B9BDE09FE598309FE5A41BA0E194209FE5811BA0E10030F9 -S21902B9D281E58C309FE5002081E5003084E5000091E50E3000E0 -S21902B9E7E00E0053E10100000A01C05CE2F9FFFF1A6C309FE5E7 -S21902B9FC6C209FE5033000E0002081E5000053E30B00000A0437 -S21902BA113094E40128A0E3010073E30500001A042042E2000007 -S21902BA2652E3020000DA043094E4010073E3F9FFFF0A0000529D -S21902BA3BE30000A003000055E30200000A101F11EE0F1081E374 -S21902BA50101F01EE30A81BE9404B4C0080008000500050002049 -S21902BA65002000D000D0007E007E00FF00FF000DC0A0E1F0D8F5 -S21902BA7A2DE904B04CE20040A0E10160A0E102E0A0E100C0A052 -S21902BA8FE3103F11EE2351A0E1015015E21000000A0E02A0E380 -S21902BAA4021A80E2202090E4000031E1FCFFFF1A160F07EE9A7A -S21902BAB90F07EE0000A0E10000A0E10000A0E10000A0E1000069 -S21902BACEA0E10000A0E1101F11EE0C10C1E3101F01EE161F0712 -S21902BAE3EEAC309FE5A40BA0E1A8709FE5800BA0E1003080E58C -S21902BAF8070000EA9C309FE5003080E5042094E4043096E4030F -S21902BB0D0052E18CC09F151600001A04E04EE200005EE3130051 -S21902BB2200DA7C309FE5003080E5002096E5002084E500C090F4 -S21902BB37E56C109FE507300CE0070053E10600000A4C209FE5AF -S21902BB4C011051E20700000A00C090E502300CE0020053E1F906 -S21902BB61FFFF1A44309FE503300CE0000053E3E1FFFF0A243026 -S21902BB769FE5003080E5000055E30200000A101F11EE0F108188 -S21902BB8BE3101F01EE0C00A0E1F0A81BE95000500080008000D4 -S21902BBA0FF00FF001099109910001000404B4C007E007E000D39 -S21902BBB5C0A0E100D82DE904B04CE200E0A0E1103F11EE23C1D0 -S21902BBCAA0E101C01CE21000000A0E02A0E3021A80E220209024 -S21902BBDFE4000031E1FCFFFF1A160F07EE9A0F07EE0000A0E107 -S21902BBF40000A0E10000A0E10000A0E10000A0E10000A0E110A0 -S21902BC091F11EE0C10C1E3101F01EE161F07EE50209FE5503085 -S21902BC1E9FE50512A0E3003081E5012042E2000052E3FCFFFFE2 -S21902BC33CA0020A0E3043091E4012082E20130CEE4330052E30F -S21902BC48FAFFFF9A24309FE5003081E500005CE30200000A1085 -S21902BC5D1F11EE0F1081E3101F01EE0000A0E300A81BE9400D90 -S21902BC72030098009800FF00FF000DC0A0E110D82DE94C309F1E -S21902BC87E504B04CE2000093E50140A0E1000050E30000000A63 -S21902BC9C0FF3FFEB0030D4E5020053E30900001A1C0084E224B6 -S21902BCB1109FE50620A0E315F5FFEB000050E30300001A1010D6 -S21902BCC684E210009FE50420A0E302F3FFEB10A81BE9F8A80383 -S21902BCDB0020C50300F00403000DC0A0E1F0DF2DE90010A0E3A8 -S21902BCF04B2FA0E36C319FE504B04CE252DF4DE2000083E5165A -S21902BD055E4BE20500A0E113F5FFEB54419FE554119FE50030ED -S21902BD1AA0E30030C4E50130C4E50230C4E50330C4E50100A07F -S21902BD2FE33C219FE528304BE20200C3E734319FE528204BE2A5 -S21902BD440300C2E72CC19FE50620A0E328304BE20C20C3E720A2 -S21902BD59319FE55C310BE5510F4BE2DDF2FFEBFFC0A0E3053DD2 -S21902BD6EE0E328104BE203C0C1E74F2FE0E30130A0E102C0C3AE -S21902BD83E7F8309FE503C0C1E7F4109FE528304BE201C0C3E72E -S21902BD98EC309FE528104BE203C0C1E7E4109FE528304BE20121 -S21902BDADC0C3E70270A0E3D8309FE528104BE203C0C1E705902A -S21902BDC2A0E1CC109FE528304BE201C0C3E70480A0E1C0309F00 -S21902BDD7E528104BE203C0C1E70850A0E1013083E203C0C1E7C1 -S21902BDEC34004BE2A8209FE54410A0E3390000EB5BAF4BE279E3 -S21902BE010700EB0060A0E10900A0E14B1FA0E34430A0E30030B4 -S21902BE168DE50A20A0E1013043E2A90000EBA00200EB0030D577 -S21902BE2BE5000053E30800001A0130D8E5000053E30500001A7B -S21902BE400230D5E5000053E30200001A0340D5E5000054E31262 -S21902BE5500000A4400A0E3410000EB0000A0E31B0000EAF8A8AC -S21902BE6A0300F004030020C50300C8FEFFFFC9FEFFFFCAFEFF8A -S21902BE7FFF55553412BCFEFFFFBDFEFFFFBEFEFFFFC0FEFFFFD1 -S21902BE94C1FEFFFFC2FEFFFFC4FEFFFF7CBC0200500700EB00DB -S21902BEA90066E07D0E50E3DBFFFF3A0730A0E1017047E2000014 -S21902BEBE53E3CEFFFFCA4400A0E3260000EB08309FE50000E028 -S21902BED3E3004083E5000000EA28C50300F0AF1BE90DC0A0E1FD -S21902BEE870D82DE90118A0E16C309FE504B04CE20040A0E10281 -S21902BEFD50A0E14108A0E100C093E50360A0E100005CE309002A -S21902BF12000A0038A0E12328A0E1B430DCE1020053E1010000AC -S21902BF271A0000E0E370A81BE900C09CE500005CE3F7FFFF1A76 -S21902BF3C0008A0E12008A0E1BD0200EBB400C4E1085084E500F3 -S21902BF513096E5003084E50000A0E3004086E570A81BE9FCA8A2 -S21902BF6603000DC0A0E1F0D92DE90008A0E14008A0E15C309F12 -S21902BF7BE504B04CE20060A0E3005093E50380A0E1060055E1F8 -S21902BF901000000A0078A0E1B440D5E12708A0E1A60200EB0095 -S21902BFA50054E10600001A000056E30200000A003095E500300C -S21902BFBA86E5010000EA003095E5003088E50560A0E100509503 -S21902BFCFE5000055E3EFFFFF1AF0A91BE9FCA803000DC0A0E1A0 -S21902BFE4F0D92DE9BC309FE504D04DE20070A0E1086097E50416 -S21902BFF9B04CE2B620D6E10180A0E1045097E5030052E1003089 -S21902C00EA003B630C601B430D6E1B230C5E1B400D6E1860200B0 -S21902C023EB0040A0E10500A0E10A0200EB0020A0E10600A0E1B0 -S21902C0380410A0E1E30100EB0008B0E11D00001A60309FE500A4 -S21902C04D5093E5000055E31900000AB420D5E1B230D6E103008E -S21902C06252E11200001AB400D6E1730200EB084040E2B000D6A8 -S21902C077E1700200EB0038A0E10500A0E1081086E22338A0E1D4 -S21902C08C00308DE50420A0E10830A0E10FE0A0E108F095E507AF -S21902C0A100A0E1BB0100EB060000EAFFFF0000FCA80300005076 -S21902C0B695E5000055E3E5FFFF1A0700A0E1B30100EBF0A91BE4 -S21902C0CBE90DC0A0E1F0DF2DE90338A0E104B04CE20160A0E1BD -S21902C0E000A0A0E10290A0E1E8C09FE54378A0E1F450DBE10C9C -S21902C0F50056E13500008AD8009FE5840100EB008050E231008A -S21902C10A000A083086E2BC30C8E1084098E50508A0E10450989B -S21902C11FE52008A0E1450200EBB000C4E10708A0E12008A0E1B6 -S21902C134410200EBB200C4E1BC00D8E13E0200EB0030A0E30A0D -S21902C14910A0E1B400C4E10620A0E1B630C4E1080084E2DFF180 -S21902C15EFFEB0C0085E274109FE50420A0E3DBF1FFEB1000856E -S21902C173E20910A0E10420A0E3D7F1FFEB1170A0E30970C5E5B4 -S21902C188B430D4E1B230C5E1BC60D8E10500A0E1AF0100EB0084 -S21902C19D20A0E10400A0E10610A0E1880100EB0008A0E12008A4 -S21902C1B2A0E1210200EB0710A0E1B600C4E10920A0E10800A09D -S21902C1C7E1F10000EB0800A0E1700100EBF0AF1BE9BE05000054 -S21902C1DCEA050000F00403000DC0A0E1F0D92DE904B04CE21042 -S21902C1F1D04DE20080A0E10240A0E10400A0E10170A0E12C606C -S21902C2064BE20610A0E10350A0E1440600EB000050E30F00000D -S21902C21BBAB400D4E1060200EB0048A0E1B400D5E12448A0E1D1 -S21902C230020200EB0038A0E10800A0E10710A0E12338A0E1004D -S21902C245308DE50620A0E10430A0E19DFFFFEB0000A0E30300D3 -S21902C25A00EA0C009FE50C109FE51FF3FFEB0000E0E3010000EE -S21902C26FEAA4FE0200C8FE0200F0A91BE90DC0A0E1F0D92DE993 -S21902C28464009FE50240A0E1004080E55C809FE504B04CE2000C -S21902C2990098E50370A0E1F450DBE14C609FE58CF1FFEB003051 -S21902C2AE96E5000053E30900000A0508A0E12008A0E1DE01009A -S21902C2C3EB001096E5B400C1E1003097E5003081E50020A0E3AE -S21902C2D8002088E5F0A91BE914009FE50410A0E1FEF2FFEBF029 -S21902C2EDA91BE904A9030000A9030008A90300D8FE02000DC0D3 -S21902C302A0E1F0DF2DE904B04CE20CD04DE20050A0E1B400D374 -S21902C317E10160A0E104909BE50270A0E1C50100EB0048A0E1C6 -S21902C32C34004BE214209FE52418A0E1E9FEFFEB000050E30219 -S21902C3410000AA0000E0E31F0000EA7CC2020078109FE57800A6 -S21902C3569FE578309FE5041099E8005081E50480A0E1006080EB -S21902C36BE501A0A0E1007083E50060E0E30070A0E1821262E0ED -S21902C38054009FE5012182E0901C83E02333A0E1825183E01415 -S21902C3950600EB0040A0E1120600EB000064E0050050E1040059 -S21902C3AA002A3E0100EB00309AE5000053E3F7FFFF1A00609738 -S21902C3BFE52808A0E1E7FEFFEB0600A0E1030000EA00A90300DD -S21902C3D404A9030008A90300D34D6210F0AF1BE90DC0A0E11056 -S21902C3E9D82DE90030D0E504B04CE2FF0053E30A00001A0130F9 -S21902C3FED0E5FF0053E30700001A0230D0E5FF0053E3040000F8 -S21902C4131A0330D0E5FF0053E30100001A0100A0E310A81BE97B -S21902C4284C409FE50420A0E30410A0E136F3FFEB000050E3F76F -S21902C43DFFFF0A0030D4E5000053E30900001A0130D4E50000AF -S21902C45253E30600001A0230D4E5000053E30300001A0330D433 -S21902C467E50100A0E3000053E30000000A0000A0E310A81BE9D1 -S21902C47CF00403000DC0A0E1F0D82DE904B04CE20CD04DE20094 -S21902C49150A0E1044095E50160A0E1100084E2CFFFFFEB0000F0 -S21902C4A650E30700000A0400A0E10010D4E50020A0E30F100125 -S21902C4BBE20111A0E1C20000EB0008B0E10200000A0500A0E118 -S21902C4D0B00000EB2D0000EA28704BE20700A0E10C1084E204CB -S21902C4E520A0E3FCF0FFEB24004BE20610A0E10620A0E3F8F049 -S21902C4FAFFEB0030D4E5B200D4E10F3003E20361A0E14B010097 -S21902C50FEB000066E0BC00C5E10930D4E5060053E30C00000A39 -S21902C524020000CA010053E30300000A140000EA110053E30C9A -S21902C53900000A110000EA0500A0E1063084E0083085E5071008 -S21902C54EA0E1420100EB0D0000EA0500A0E1063084E00830854E -S21902C563E50710A0E1B90200EB070000EA0500A0E1063084E088 -S21902C578083085E50710A0E196FEFFEB010000EA0500A0E181FD -S21902C58D0000EBF0A81BE90DC0A0E1F0DF2DE90060A0E10830BF -S21902C5A286E2080113E8038048E004B04CE2045096E54801A0CC -S21902C5B7E1BC30D6E10F0000E2083083E0BC30C6E1400080E322 -S21902C5CC0000C5E50070A0E30170C5E501A0A0E1BC00D6E10204 -S21902C5E190A0E1150100EB80409FE5B200C5E1B000D4E1110119 -S21902C5F600EBB400C5E1B030D4E16C109FE5013083E2B030C415 -S21902C60BE1B670C5E14030A0E30830C5E509A0C5E50420A0E397 -S21902C620BA70C5E10C0085E2ACF0FFEB100085E20910A0E10420 -S21902C63520A0E3A8F0FFEB0500A0E10810A0E10720A0E160009D -S21902C64A00EB0008A0E12008A0E1F90000EB041089E2BA00C5D5 -S21902C65FE1022BA0E30600A0E1CB0000EBF0AF1BE90CA9030096 -S21902C674F00403000DC0A0E1F0D82DE97C209FE5003092E504BC -S21902C689B04CE2000053E31A00001A03E0A0E10130A0E3003005 -S21902C69E82E50E40A0E15C709FE504C0A0E158509FE503E0A006 -S21902C6B3E354609FE50500A0E1001096E507208CE0023002E296 -S21902C6C8022083E05ECE8CE2103085E2042083E70CC08CE200C8 -S21902C6DD1080E501E05EE228309FE50010A0E1BE30C0E114405B -S21902C6F284E2140081E2F0FFFF5A001086E5F0A81BE9000503E8 -S21902C7070060A9030010A9030010C10300EA0500000DC0A0E13D -S21902C71C00D82DE960309FE504B04CE200C093E500005CE31294 -S21902C73100000A00209CE5002083E510309CE504308CE5401003 -S21902C7469FE5143083E208308CE538E09FE50030A0E3BC30CCFA -S21902C75BE1003091E52C209FE5013083E2003081E5001092E5B8 -S21902C77000009EE5033061E0000053E100308EC50C00A0E10072 -S21902C785A81BE910C10300F8040300F4040300FC0403000DC04E -S21902C79AA0E100D82DE920209FE5003092E51C109FE501304385 -S21902C7AFE2003082E5003091E5003080E504B04CE2000081E572 -S21902C7C400A81BE9F804030010C103000DC0A0E100D82DE9029C -S21902C7D91051E204B04CE202C0A0E10300004AB230D0E00210EB -S21902C7EE51E203C08CE0FBFFFF5A010071E30500001A0030D006 -S21902C803E5FF20CEE302E083E1FFECCEE30E38A0E123C88CE064 -S21902C8180C08A0E12C28A0E130109FE520C882E00C3061E0010E -S21902C82D005CE103C0A0C10C00E0E10008A0E12E0880E160E859 -S21902C842A0E1200CA0E10008A0E10E0C80E12008A0E100A81B3C -S21902C857E9FFFF00000DC0A0E100D82DE90020A0E304D04DE2FC -S21902C86CBC30D0E104B04CE210204BE50910D0E50F104BE5BEF6 -S21902C88120D0E1B011D0E1B2C1D0E1023083E0013083E0B0213A -S21902C8965BE10C3083E0B200D0E1023083E0000083E000A81B8D -S21902C8ABE90DC0A0E110D82DE904B04CE210D04DE2B4009FE513 -S21902C8C094FFFFEB004050E20200001AA8009FE584F1FFEBFEC8 -S21902C8D5FFFFEA101094E594209FE520004BE2DBFAFFEBBC00C6 -S21902C8EAC4E10008B0E12600000A84209FE5003092E5B4015BE5 -S21902C8FFE1013083E2003082E54C0000EB020B50E30500000A89 -S21902C91468309FE5030050E10C00000A0400A0E19BFFFFEBE3B5 -S21902C929FFFFEA54309FE5002093E5101094E5012082E200202C -S21902C93E83E5041084E50400A0E11A104BE2CBFEFFEBD9FFFF92 -S21902C953EA30309FE5002093E5101094E5012082E2002083E5BC -S21902C968041084E50400A0E1C70300EBD0FFFFEAEA0500000451 -S21902C97DFF02000C05030006080000040503000805030004005B -S21902C992A0E17FFFFFEB10A81BE90DC0A0E170D82DE904B04C38 -S21902C9A7E210D04DE20050A0E128604BE20600A0E10240A0E1B3 -S21902C9BC0620A0E3C6EFFFEB22004BE238109FE50620A0E3C291 -S21902C9D1EFFFEB0448A0E12408A0E1170000EBBC014BE11010EC -S21902C9E695E5BC20D5E10600A0E11BFAFFEB10209FE50030922D -S21902C9FBE5013083E2003082E5010000EA20C503001005030023 -S21902CA1070A81BE90DC0A0E1203CA0E1003C83E1FF2800E2001A -S21902CA25D82DE9FF0C00E20004A0E1220480E1000083E104B0F6 -S21902CA3A4CE200A81BE90DC0A0E100D82DE90008A0E1FF38000A -S21902CA4FE2200CA0E1230480E104B04CE200A81BE90DC0A0E1D8 -S21902CA6430D82DE90040A0E1080094E504B04CE2B030D0E101E2 -S21902CA7950A0E1080053E31600001ABC10D4E10020A0E34FFFF0 -S21902CA8EFFEB0008A0E120C8B0E11000001A083094E500C0C342 -S21902CAA3E5082094E5B2C0C2E1080094E5BC10D4E10C20A0E12D -S21902CAB844FFFFEB0008A0E12008A0E1DDFFFFEB083094E5018B -S21902CACD10A0E3B200C3E10520A0E10400A0E1ACFEFFEB0400A1 -S21902CAE2A0E12BFFFFEB30A81BE90DC0A0E1F0DF2DE904B04C94 -S21902CAF7E204D04DE20060A0E10140A0E1307086E2048097E593 -S21902CB0C020014E3085097E50290A0E10F00000A1830A0E3BC8D -S21902CB2130C7E10C30D5E550019FE59030C3E3603083E30C30BD -S21902CB36C5E5B5FFFFEB2C104BE22C000BE50420A0E3140085D6 -S21902CB4BE263EFFFEB0030A0E3B831C6E1060000EAB831D6E1DD -S21902CB60143083E2BC30C7E10C20D5E5A020C2E3502082E30C50 -S21902CB7520C5E50C30D5E50F30C3E30C30C5E5580096E5A1FFA6 -S21902CB8AFFEB040085E5540096E59EFFFFEB0030A0E3B031C588 -S21902CB9FE1000059E3080085E508A086E21800001AB401D6E13D -S21902CBB4A1FFFFEBB000C5E1B601D6E19EFFFFEBB200C5E10D2B -S21902CBC940C5E5B831D6E1000053E3083084130D30C515A0000A -S21902CBDE9FE596FFFFEBBE00C5E1B291C5E10420A0E390109F05 -S21902CBF3E50C0088E238EFFFEB100088E20A10A0E10420A0E3FE -S21902CC0834EFFFEB0630A0E30930C8E5BC00D7E188FFFFEBB2CD -S21902CC1D00C8E1BC40D7E10800A0E10BFFFFEB0020A0E105007B -S21902CC32A0E10410A0E1E4FEFFEB0008A0E12008A0E17DFFFF57 -S21902CC47EB0610A0E3B001C5E10A20A0E10700A0E14DFEFFEB8E -S21902CC5C043096E50A0053E30A00001A1C109FE51C0086E2185D -S21902CC71209FE50630A0E1B20200EB110000EAB2050402B2053E -S21902CC860000F0040300C0D4010094CE02000D30D5E503001395 -S21902CC9BE30200001AB831D6E1000053E30600000A1C0086E214 -S21902CCB0FA1FA0E308209FE50630A0E1A10200EB000000EA7879 -S21902CCC5CE0200F0AF1BE90DC0A0E1F0DF2DE904B04CE208D0F3 -S21902CCDA4DE22C000BE52C301BE5089090E5046093E50800990D -S21902CCEFE530100BE546FFFFEB00A0A0E1040099E543FFFFEB16 -S21902CD040080A0E1B200D9E14BFFFFEB0058A0E1B000D9E145EA -S21902CD1958A0E147FFFFEB149086E20048A0E12C301BE5147040 -S21902CD2EA0E3BC70C3E10A00A0E15030A0E30C30C9E54448A0F2 -S21902CD43E132FFFFEB040089E50800A0E12FFFFFEB080089E54F -S21902CD58010BA0E337FFFFEBBE00C9E10030A0E3B231C9E10563 -S21902CD6D58A0E1B031C9E12508A0E130FFFFEBB401C6E10448D7 -S21902CD82A0E12408A0E12CFFFFEBB200C9E10D70C9E50420A007 -S21902CD97E370109FE50C0086E2CEEEFFEB100086E230101BE5C7 -S21902CDAC0420A0E3CAEEFFEB0650A0E30950C6E52C301BE5BC2D -S21902CDC100D3E11DFFFFEBB200C6E12C301BE5BC40D3E1060031 -S21902CDD6A0E19FFEFFEB0020A0E10900A0E10410A0E178FEFF04 -S21902CDEBEB0008A0E12008A0E111FFFFEBB001C9E130201BE56A -S21902CE002C001BE50510A0E1E1FDFFEB000000EAF0040300F0BB -S21902CE15AF1BE90DC0A0E100D82DE94C309FE50010A0E300205F -S21902CE2A93E504B04CE2010052E10D00000A03C0A0E1000052B1 -S21902CE3FE10600001A000051E30200000A003092E5003081E559 -S21902CE54010000EA003092E500308CE50210A0E1002092E50065 -S21902CE690052E3F2FFFF1A00A81BE914C103000DC0A0E100D8C4 -S21902CE7E2DE90010A0E30120A0E304B04CE216FFFFEB00A81BA7 -S21902CE93E90DC0A0E100D82DE90030A0E3043080E504B04CE230 -S21902CEA8DAFFFFEB00A81BE90DC0A0E110D82DE90040A0E144AE -S21902CEBD0094E504B04CE2000050E30500000A003090E54430A3 -S21902CED284E52FFEFFEB440094E5000050E3F9FFFF1A10A81BF0 -S21902CEE7E90DC0A0E110D82DE90030A0E304B04CE20040A0E1A4 -S21902CEFC043084E51C0084E2290200EB0400A0E1E7FFFFEB048C -S21902CF1100A0E1BFFFFFEB10A81BE90DC0A0E1F0D82DE9017082 -S21902CF26A0E1082097E5BC10D7E104B04CE20C30D2E50050A081 -S21902CF3BE1040092E52332A0E10331A0E1014063E0036082E0AA -S21902CF50AFFEFFEB542095E5003062E0000053E3170000CA02B5 -S21902CF653060E0044063E0036086E0000054E3120000DA043099 -S21902CF7A82E0543085E5442095E50030A0E3003087E5030052C9 -S21902CF8FE10600000A000000EA002092E5003092E5000053E337 -S21902CFA4FBFFFF1A007082E5020000EA447085E54C4085E5483F -S21902CFB96085E50100A0E3F0A81BE90000A0E3F0A81BE90DC086 -S21902CFCEA0E130D82DE9083091E50040A0E1080093E504B04CB9 -S21902CFE3E28AFEFFEB583094E50050A0E1053063E0000053E35E -S21902CFF8140000DA1C0084E2EA0100EB582094E5B831D4E10543 -S21902D00D1062E0030051E10310A0A1000051E30B0000DAB8312A -S21902D022D4E1033061E0B831C4E1012082E0582084E50338B0EC -S21902D037E10400000A380094E5B821D4E1140080E2011080E0C8 -S21902D04C23EEFFEB30A81BE90DC0A0E1F0DD2DE90080A0E1BC03 -S21902D06100D8E1086098E504B04CE2044098E50170A0E171FE11 -S21902D076FFEBB200C4E100A0A0E3BC50D8E10400A0E1F3FDFF01 -S21902D08BEB0020A0E10600A0E10510A0E1CCFDFFEB0008B0E194 -S21902D0A0F600001AC4339FE5005093E5000000EA005095E5006D -S21902D0B50055E31200000AB200D6E1B441D5E15DFEFFEB0000B2 -S21902D0CA54E1F7FFFF1AB631D5E1000053E30A00000AB000D699 -S21902D0DFE10340A0E155FEFFEB000054E1EFFFFF1A0700A0E18F -S21902D0F4081085E20420A0E304F0FFEB000050E3E9FFFF1A00E8 -S21902D1090055E3D800000A0C0085E2041087E20620A0E3EFED7B -S21902D11EFFEB043095E5020053E30700000A0D30D6E504001305 -S21902D133E30400000A0500A0E169FFFFEB0800A0E193FDFFEB14 -S21902D148F0AD1BE9043095E5013043E2090053E303F19F97C2FB -S21902D15D0000EA88D10200E8D1020080D4020050D2020050D21A -S21902D1720200FCD2020040D30200D4D3020018D402005CD402F1 -S21902D187000D30D6E5020013E31000000A0230A0E3043085E52F -S21902D19C040096E51BFEFFEB013080E2B000D6E1543085E522EB -S21902D1B1FEFFEBB601C5E1002097E51210A0E3082085E500301A -S21902D1C6A0E3B831C5E10500A0E1B035C5E18C0000EA0800A00C -S21902D1DBE10710A0E1B9FEFFEBA50000EA1C0085E26F0100EBB1 -S21902D1F00D30D6E5041013E20200000A0130A0E3043085E59D27 -S21902D2050000EA020013E30300000A0500A0E10120A0E333FEC3 -S21902D21AFFEB970000EA100013E39500000A080096E5F8FDFF71 -S21902D22FEB583095E5013083E2030050E18F00001A0430A0E3CC -S21902D244043085E5580085E58B0000EA0D30D6E5544095E510E3 -S21902D2590013E30200000A0500A0E10810A0E157FFFFEB050053 -S21902D26EA0E10810A0E128FFFFEB0D30D6E500A0A0E10100134C -S21902D283E30800000A040096E5E0FDFFEB543095E5030050E122 -S21902D2980300001A013080E2543085E50520A0E3042085E55452 -S21902D2AD3095E5040053E10200001AB035D5E1000053E36E0028 -S21902D2C2000AB841D5E1000054E30700001A1C0085E235010086 -S21902D2D7EB0500A0E11010A0E30420A0E100FEFFEBB045C5E1FF -S21902D2EC630000EA0130A0E3B035C5E1600000EA0D30D6E51048 -S21902D3010013E35D00000A0500A0E10810A0E12DFFFFEB080076 -S21902D31696E5BDFDFFEB583095E5013083E2030050E1540000BC -S21902D32B1A0030A0E3043085E50500A0E1B6FEFFEB4F0000EA1E -S21902D3400D30D6E5100013E31700000A0500A0E10810A0E11C77 -S21902D355FFFFEB080096E5ACFDFFEB583095E5013083E2030022 -S21902D36A50E10E00001A0D30D6E5010013E30900000A0500A0A7 -S21902D37FE11010A0E3543095E50A20A0E3042085E5013083E23F -S21902D394543085E50A2042E2D2FDFFEB010000EA0830A0E304DE -S21902D3A93085E50D30D6E5010013E33100000A1C0085E2FB0026 -S21902D3BE00EB0500A0E11110A0E3543095E50920A0E30A00008A -S21902D3D3EA0500A0E10810A0E1CEFEFFEB0D30D6E500A0A0E166 -S21902D3E8010013E32300000A0500A0E11010A0E3543095E50AD4 -S21902D3FD20A0E3042085E5013083E2543085E50020A0E3B5FD0A -S21902D412FFEB190000EA0D30D6E5100013E31600000A0500A04E -S21902D427E10810A0E1E6FEFFEB080096E576FDFFEB583095E5BF -S21902D43C013083E2030050E10D00001A1C0085E2D70000EB0A94 -S21902D45130A0E3043085E5080000EA0500A0E10010A0E3012042 -S21902D466A0E39FFDFFEB030000EA14C103000800A0E10710A09C -S21902D47BE112FEFFEB00005AE30100001A0800A0E1C1FCFFEB32 -S21902D490F0AD1BE90DC0A0E100D82DE904B04CE201FDFFEBD900 -S21902D4A50000EB00A81BE90DC0A0E130D82DE954209FE504B0BC -S21902D4BA4CE20040A0E10158A0E14558A0E10010A0E323EFFFCB -S21902D4CFEB0130A0E3043084E5B451C4E15C2084E2402084E5B0 -S21902D4E4342084E524109FE524209FE5703084E2383084E5BE5A -S21902D4F923C4E1003091E5003084E50000A0E3004081E530A80F -S21902D50E1BE94806000014C10300EA0500000DC0A0E110D82D85 -S21902D523E90040A0E1043094E504B04CE2010000EAD6FFFFEB09 -S21902D538043094E5000053E30200000AB831D4E1000053E3F81C -S21902D54DFFFF1A10A81BE90DC0A0E110D82DE904B04CE2004080 -S21902D562A0E1ECFFFFEB041094E5020051E30030A0130130A0E0 -S21902D57703040051E30320A0110120A003000052E30600000A80 -S21902D58C0400A0E11110A0E30730A0E3043084E50020A0E3510F -S21902D5A1FDFFEB060000EA050051E30400001A0400A0E1063085 -S21902D5B6A0E3043084E51110A0E349FDFFEB0400A0E138FEFFAB -S21902D5CBEB10A81BE90DC0A0E1F0D82DE904B04CE20160A0E1AD -S21902D5E0005052E20040A0E1020000DA4C3094E5000053E303E0 -S21902D5F500001A0000A0E3F0A81BE94C0084E52B0000EA0430E3 -S21902D60A94E5040053E30070A0E3170000EA481094E50600A0E6 -S21902D61FE1AEECFFEB4C3094E5440094E5037087E0002090E569 -S21902D634036086E0442084E5055063E054FCFFEB440094E500B5 -S21902D6490050E3EBFFFF0A081090E50C30D1E5BC20D0E123323E -S21902D65EA0E1032142E04C2084E50C30D1E52332A0E1031181B7 -S21902D673E0481084E5000055E30D00000A4C2094E5020055E18E -S21902D688E2FFFFAA0600A0E1481094E50520A0E190ECFFEB4850 -S21902D69D3094E5057087E04C2094E5053083E0483084E502206C -S21902D6B265E04C2084E50700A0E1F0A81BE90DC0A0E170D82D5B -S21902D6C7E904B04CE20040A0E1380094E5005052E2010000CABB -S21902D6DC0000A0E370A81BE9043094E5043043E2010053E30155 -S21902D6F100009A0000E0E370A81BE9B861D4E1000056E30C0091 -S21902D706001A34309FE5140080E2030055E10350A0210520A07D -S21902D71BE16FECFFEB0400A0E11010A0E3B851C4E10620A0E14F -S21902D730EDFCFFEB0500A0E170A81BE90000A0E370A81BE9B217 -S21902D7450500000DC0A0E170D82DE904B04CE20060A0E1024012 -S21902D75AA0E1041086E50350A0E1200100EB080086E50C40868E -S21902D76FE534309FE5002093E50310A0E1105086E5000052E3A5 -S21902D7840400000A060052E10500000A002092E5000052E3FA6D -S21902D799FFFF1A003091E5003086E5006081E570A81BE918C160 -S21902D7AE03000DC0A0E100D82DE94C109FE50020A0E3003091DC -S21902D7C3E504B04CE2020053E10D00000A000053E10700001AE1 -S21902D7D8000052E30200000A003093E5003082E500A81BE90009 -S21902D7ED3093E5003081E500A81BE90320A0E1003093E50000EA -S21902D80253E3F1FFFF1A00A81BE918C103000DC0A0E170D82D80 -S21902D817E970309FE504B04CE20050A0E3004093E50360A0E197 -S21902D82C050054E11500000AEC0000EB0C0094E9000063E002E2 -S21902D8410050E10C00003A000055E30200000A003094E5003037 -S21902D85685E5010000EA003094E5003086E5100094E50FE0A005 -S21902D86BE10CF094E5004096E50050A0E3010000EA0450A0E1FD -S21902D880004094E5000054E3E9FFFF1A70A81BE918C103000D96 -S21902D895C0A0E1F0D92DE90070A0E1045097E5B200D5E104B07A -S21902D8AA4CE263FCFFEB0040A0E1B000D5E160FCFFEB0100502D -S21902D8BFE3020B54033B00001A186085E20600A0E1EC809FE55B -S21902D8D40420A0E30810A0E10CEEFFEB000050E33300001AB6DE -S21902D8E900D5E153FCFFEB010050E31C00001A0200A0E34FFCFA -S21902D8FEFFEB0E4085E20410A0E1B600C5E10420A0E30600A031 -S21902D913E1F1EBFFEB126085E20600A0E1085085E20510A0E19C -S21902D9280620A0E3EBEBFFEB0400A0E10810A0E10420A0E3E7CE -S21902D93DEBFFEB0500A0E17C109FE50620A0E3E3EBFFEB1C30B6 -S21902D952A0E3BC30C7E10700A0E168209FE50610A0E10CFCFF70 -S21902D967EB120000EAB600D5E132FCFFEB020050E30E00001ADC -S21902D97C4C409FE5003094E5000053E30A00000A0E1085E208FF -S21902D9910094E50420A0E3DDEDFFEB006050E20400001A0810DE -S21902D9A685E2040094E50620A0E3CAEBFFEB006084E50700A0C9 -S21902D9BBE175FBFFEBF0A91BE9F004030020C50300060800008B -S21902D9D01CC103000DC0A0E1F0DF2DE904B04CE208D04DE2003F -S21902D9E590A0E12C00A0E30180A0E148FBFFEB007050E2040091 -S21902D9FA001A470000EA0700A0E163FBFFEB0400A0E14400002D -S21902DA0FEA044097E50100A0E308FCFFEBB600C4E10100A0E300 -S21902DA2405FCFFEBB000C4E1020BA0E302FCFFEBB200C4E106D1 -S21902DA3960A0E30460C4E50450A0E30550C4E50520A0E18410D2 -S21902DA4E9FE50E0084E2A1EBFFEB080084E278109FE50620A00E -S21902DA63E19DEBFFEB180084E20910A0E10520A0E199EBFFEB28 -S21902DA78FF30A0E330304BE52F304BE52E304BE52D304BE52C7A -S21902DA8D304BE52B304BE544209FE5016086E2048082E530A026 -S21902DAA24BE2089082E5FE3043E2003082E50280A0E11C30A063 -S21902DAB7E3BC30C7E10700A0E11C209FE50A10A0E1B3FBFFEB61 -S21902DACC460000EB0050A0E1070000EAF004030020C503001C50 -S21902DAE1C10300060800006FFBFFEB004098E5000054E3C1FF4F -S21902DAF6FF0A3B0000EB000065E0F90050E3F7FFFF9A0630A00F -S21902DB0BE1016046E2000053E3E6FFFFCA0700A0E11DFBFFEB26 -S21902DB200000E0E3F0AF1BE90DC0A0E1F0DD2DE904B04CE20070 -S21902DB3580A0E10150A0E1A0A09FE50070A0E30A60A0E1080057 -S21902DB4AA0E10640A0E10410A0E10420A0E36DEDFFEB00305077 -S21902DB5FE20E00000A0C6084E2017087E20F0057E3F4FFFFDAEF -S21902DB740500A0E10810A0E10420A0E356EBFFEB0800A0E10417 -S21902DB891085E290FFFFEB000050E3050000AA0000E0E3F0AD4E -S21902DB9E1BE9070096E8070085E80300A0E1F0AD1BE930E09F9A -S21902DBB3E500C09EE5070095E88C308CE003318AE0070083E872 -S21902DBC801C08CE200C08EE510005CE30030A00300308E0500FA -S21902DBDD00A0E3F0AD1BE928C10300140503000DC0A0E100D8DA -S21902DBF22DE928309FE5FA0FA0E3482093E504B04CE20FE0A048 -S21902DC07E102F0A0E114109FE5003091E5013083E20300A0E145 -S21902DC1C003081E500A81BE950000000180503000DC0A0E1F0FC -S21902DC31DF2DE904B04CE214D04DE20270A0E101A0A0E12C00AC -S21902DC460BE5006053E2BF00001A0A0057E14200009A010857E6 -S21902DC5BE30300002AFF0057E30800A0830000A093020000EA1A -S21902DC70010457E31800A0231000A03340139FE53220A0E102EF -S21902DC8530D1E7003083E0200073E20600000A1770A0E12C103F -S21902DC9A1BE5203060E23133A0E11AA083E11110A0E12C100BF0 -S21902DCAFE50798A0E12998A0E10A00A0E12788A0E10810A0E1BE -S21902DCC4710200EB0040A0E10A00A0E10810A0E1110100EB0004 -S21902DCD960A0E1990602E02C101BE52138A0E1044883E1020005 -S21902DCEE54E10500002A016046E2074094E00200002A020054F0 -S21902DD03E10160463207408430044062E00400A0E10810A0E1AB -S21902DD185C0200EB0050A0E10400A0E10810A0E1FC0000EB9937 -S21902DD2D0002E02C101BE50138A0E12338A0E1055883E1020063 -S21902DD4255E10400002A010040E2075095E00100002A020055F0 -S21902DD57E10100403206C880E1E60000EA000057E30300001A06 -S21902DD6C0100A0E30210A0E1E90000EB0070A0E1010857E30775 -S21902DD8120A0E10300002AFF0057E30800A0830000A09302001F -S21902DD9600EA010457E31800A0231000A03318129FE53220A0EA -S21902DDABE10230D1E7003083E0200073E20130A00330300B0545 -S21902DDC00AA067003400000A202060E21770A0E12C101BE53AF8 -S21902DDD552A0E13132A0E11110A0E12C100BE51AA083E12788E0 -S21902DDEAA0E10798A0E12998A0E10500A0E10810A0E1230200F6 -S21902DDFFEB0040A0E10500A0E10810A0E1C30000EB0060A0E1AE -S21902DE14990602E02A38A0E1044883E1020054E10500002A0177 -S21902DE296046E2074094E00200002A020054E101604632074017 -S21902DE3E8430044062E00400A0E10810A0E10F0200EB0050A084 -S21902DE53E10400A0E10810A0E1AF0000EB990002E00A38A0E1DC -S21902DE682338A0E1055883E1020055E10500002A010040E20770 -S21902DE7D5095E00200002A020055E10100403207508530066873 -S21902DE9280E105A062E030600BE50798A0E12998A0E10A00A0A0 -S21902DEA7E12788A0E10810A0E1F60100EB0040A0E10A00A0E187 -S21902DEBC0810A0E1960000EB0060A0E1990602E02C101BE52171 -S21902DED138A0E1044883E1020054E10500002A016046E2074096 -S21902DEE694E00200002A020054E10160463207408430044062CF -S21902DEFBE00400A0E10810A0E1E10100EB0050A0E10400A0E1EA -S21902DF100810A0E1810000EB990002E02C101BE50138A0E1235C -S21902DF2538A0E1055883E1020055E10400002A010040E2075086 -S21902DF3A95E00100002A020055E10100403206C880E16D0000E4 -S21902DF4FEA0A0056E10020A08330200B8502C0A0816800008A93 -S21902DF64010856E30620A0E10300002AFF0056E30800A0830028 -S21902DF7900A093020000EA010456E31800A0231000A033301031 -S21902DF8E9FE53220A0E10230D1E7003083E0200073E208000026 -S21902DFA31A2C301BE506005AE10700539101C0A0E300C0A031EB -S21902DFB80010A0E330100BE5500000EA24FF0200202060E23772 -S21902DFCD32A0E1166083E11770A0E12C101BE53A52A0E13132F7 -S21902DFE2A0E11110A0E12C100BE51AA083E12698A0E10628A0A9 -S21902DFF7E12228A0E10500A0E134200BE50910A0E1A00100EB72 -S21902E00C0040A0E10500A0E10910A0E1400000EB34201BE50098 -S21902E02180A0E1980202E02A38A0E1044883E1020054E1050097 -S21902E036002A018048E2064094E00200002A020054E101804813 -S21902E04B3206408430044062E00400A0E10910A0E18B0100EB71 -S21902E0600050A0E10400A0E10910A0E12B0000EB34201BE590BA -S21902E0750202E00A38A0E12338A0E1055883E1020055E105000E -S21902E08A002A010040E2065095E00200002A020055E1010040BD -S21902E09F320650853008C880E105A062E02C08A0E12738A0E17B -S21902E0B40018CCE10328C7E191020EE0900202E0930101E090BE -S21902E0C90303E0011092E00138832201E89EE02138A3E00A00A7 -S21902E0DE53E10500008A2C101BE50030A0130130A0030000531D -S21902E0F3E301005E110000009A01C04CE20020A0E330200BE552 -S21902E1083CC00BE530301BE540204BE238300BE5030092E9F05C -S21902E11DAF1BE9000051E31F00000A0130A0E30020A0E301007E -S21902E13250E11900003A010251E3000051310112A0310332A0DB -S21902E14731FAFFFF3A020151E3000051318110A0318330A031BA -S21902E15CFAFFFF3A010050E10100402003208221A10050E1A1A9 -S21902E171004020A3208221210150E12101402023218221A1016E -S21902E18650E1A1014020A3218221000050E32332B0112112A0C7 -S21902E19B11EFFFFF1A0200A0E10EF0A0E104E02DE5640100EB08 -S21902E1B00000A0E30080BDE80DC0A0E1F0DF2DE904B04CE22472 -S21902E1C5D04DE20260A0E10180A0E138000BE530C04BE234C021 -S21902E1DA0BE5007053E29700001A080056E11800009A01085693 -S21902E1EFE30300002AFF0056E30800A0830000A093020000EA82 -S21902E204010456E31800A0231000A033D4129FE53220A0E102C3 -S21902E21930D1E7003083E0203073E23C300BE55200000A166398 -S21902E22EA0E138101BE5203063E23C201BE53133A0E118828318 -S21902E243E11112A0E138100BE5490000EA000056E30300001A79 -S21902E2580100A0E30210A0E1AEFFFFEB0060A0E1010856E306D3 -S21902E26D20A0E10300002AFF0056E30800A0830000A09302002F -S21902E28200EA010456E31800A0231000A03354129FE53220A0BE -S21902E297E10230D1E7003083E0203073E23C300BE5088066001E -S21902E2AC3100000A3C201BE53C304BE2081093E83C101BE52027 -S21902E2C12062E21663A0E13852A0E13C32A0E140200BE51CC1BC -S21902E2D6A0E138C00BE5188183E12678A0E106A8A0E12AA8A006 -S21902E2EBE10500A0E10710A0E1E50000EB0040A0E10500A0E101 -S21902E3000710A0E185FFFFEB9A0002E02838A0E1044883E102EC -S21902E3150054E10300002A064094E00100002A020054E1064028 -S21902E32A8430044062E00400A0E10710A0E1D40000EB0050A0D1 -S21902E33FE10400A0E10710A0E174FFFFEB9A0002E00838A0E12A -S21902E3542338A0E1055883E1020055E10300002A065095E001DF -S21902E36900002A020055E106508530058062E006A8A0E12AA863 -S21902E37EA0E10800A0E12678A0E10710A0E1BF0000EB0040A038 -S21902E393E10800A0E10710A0E15FFFFFEB9A0002E038C01BE5B0 -S21902E3A82C38A0E1044883E1020054E10300002A064094E001A5 -S21902E3BD00002A020054E106408430044062E00400A0E10710C7 -S21902E3D2A0E1AD0000EB0050A0E10400A0E10710A0E14DFFFFDD -S21902E3E7EB9A0002E038101BE50138A0E12338A0E1055883E114 -S21902E3FC020055E10300002A065095E00100002A020055E1066C -S21902E411508530055062E038500BE534201BE5000052E39600BC -S21902E426000A38301BE53CC01BE5333CA0E148300BE50010A064 -S21902E43BE344100BE58B0000EA080057E10500009A48000BE512 -S21902E45044800BE540204BE20C0012E930C04BE2860000EA01DA -S21902E4650857E30720A0E10300002AFF0057E30800A083000020 -S21902E47AA093020000EA010457E31800A0231000A03358109F63 -S21902E48FE53220A0E10230D1E7003083E0203073E23C300BE53B -S21902E4A41100001A38301BE5070058E1060053910200003A065D -S21902E4B9C053E00780C8E038C00BE534101BE5000051E36C0059 -S21902E4CE000A38201BE548200BE544800BE540204BE20C001219 -S21902E4E3E901C0A0E1640000EA240003003C301BE53CC01BE515 -S21902E4F838201BE5203063E240300BE540101BE53633A0E1176A -S21902E50D7C83E1166CA0E13851A0E13231A0E1122CA0E138200A -S21902E5220BE5188C83E12798A0E10738A0E12338A0E10500A064 -S21902E537E14C300BE50910A0E1520000EB0040A0E10500A0E15D -S21902E54C0910A0E1F2FEFFEB4C201BE500A0A0E19A0202E0280C -S21902E56138A0E1044883E1020054E10500002A01A04AE20740BB -S21902E57694E00200002A020054E101A04A3207408430044062F4 -S21902E58BE00400A0E10910A0E13D0000EB0050A0E10400A0E1F7 -S21902E5A00910A0E1DDFEFFEB4C201BE5900202E00838A0E1233C -S21902E5B538A0E1055883E1020055E10500002A010040E20750EF -S21902E5CA95E00200002A020055E10100403207508530058062F6 -S21902E5DFE00A3880E12308A0E126C8A0E10018C3E10C28C6E1EB -S21902E5F491020EE0900202E09C0101E0900C0CE0011092E0018C -S21902E609C88C2201E89EE021C8ACE008005CE10500008A381087 -S21902E61E1BE50030A0130130A003000053E301005E1102000081 -S21902E6339A06205EE007C0CCE002E0A0E134301BE5000053E35D -S21902E6480D00000A38201BE50E1052E00C80C8E03CC01BE53196 -S21902E65D3CA0E140101BE5183183E148300BE5388CA0E1448076 -S21902E6720BE534C01BE540204BE20C0012E90C008CE830304BE9 -S21902E687E2030093E8F0AF1BE9000051E32600000A0130A0E35C -S21902E69C010050E10EF0A031010251E3000051310112A03103C1 -S21902E6B132A031FAFFFF3A020151E3000051318110A03183304A -S21902E6C6A031FAFFFF3A0020A0E3010050E101004020A100500E -S21902E6DBE1A1004020E3208221210150E121014020632182219F -S21902E6F0A10150E1A1014020E321822103C0A0E1000050E323F8 -S21902E70532B0112112A011EEFFFF1A0E2212E20EF0A001EC016B -S21902E71A12E1A10180106C0112E121018010EC0012E1A10080AC -S21902E72F100EF0A0E104E02DE5010000EB0000A0E30080BDE8B5 -S20802E7440EF0A0E14B -S21902E74853707572696F757320496E74657272757074212121FB -S21902E75D202D20766563746F723A2025642C20646174613A207D -S21902E77225780A000000303132333435363738396162636465E8 -S21902E7876600000000503031004F4B0000453031004530330077 -S21902E79C45303200423031003031323334353637383941424344 -S21902E7B144454600000000303132333435363738394142434466 -S21902E7C64546000000003C42616420666F726D61742073747247 -S21902E7DB696E673A2000000000203A00003E0A00003C6E756C5D -S21902E7F06C3E00003C4E6F74206120737472696E673A203078BC -S21902E8050000003E000000253038583A2000002530325800009B -S21902E81A00002020000020000000207C0000256300007C0A00D8 -S21902E82F003C746F7069633E0048656C702061626F75742068E8 -S21902E844656C703F0000000068656C70000000005B2D77203C34 -S21902E85974696D656F75743E5D205B656E7472795D000045783A -S21902E86E656375746520636F64652061742061206C6F63617414 -S21902E883696F6E0000676F00003C6C6F636174696F6E3E205B0F -S21902E8983C6C656E6774683E5D000000446973706C61792028ED -S21902E8AD6865782064756D702920612072616E6765206F662048 -S21902E8C26D656D6F72790000000064756D70000000005B4F4EF3 -S21902E8D7207C204F46465D00004D616E616765206D61636869C6 -S21902E8EC6E652063616368657300000063616368650000000AB8 -S21902E901526564426F6F7428746D2920646562756720656E7689 -S21902E91669726F6E6D656E74202D206275696C742025732C20E8 -S21902E92B25730A000030383A35383A3433000000004175672041 -S21902E9403234203230303000436F707972696768742028432906 -S21902E95520323030302C20526564204861742C20496E632E0A82 -S21902E96A0A0052414D3A2025702D25700A003D3D2045786563CD -S21902E97F7574696E6720626F6F742073637269707420696E20B5 -S21902E9942564207365636F6E6473202D20656E746572205E4383 -S21902E9A920746F2061626F72740A00526564426F6F743E200000 -S21902E9BE0000496C6C6567616C20636F6D6D616E643A20257392 -S21902E9D30A00000000556E62616C616E63656420737472696EE1 -S21902E9E867210A00416D626967756F757320636F6D6D616E64D6 -S21902E9FD20272573272C2063686F69636573206172653A2025F7 -S21902EA127300202573000A00000055736167653A0A0020202515 -S21902EA277325732025730A0000257320616C72656164207365ED -S21902EA3C740A0000696E76616C6964206E756D62657220272544 -S21902EA51732720666F722025730A00696E76616C696420666C0D -S21902EA66616720272563270A0000257320616C72656164792012 -S21902EA7B7365740A006E6F2064656661756C742F6E6F6E2D663A -S21902EA906C616720617267756D656E747320737570706F727403 -S21902EAA565640A000000006F6E00006F666600496E76616C6907 -S21902EABA64206361636865206D6F64653A2025730A00636163E0 -S21902EACF686573203F0A00000025730A20202025732025730A26 -S21902EAE40000000044756D702077686174205B6C6F63617469B5 -S21902EAF96F6E5D3F0A0000496E76616C69642073746172742049 -S21902EB0E616464726573733A2025730A0000496E76616C696442 -S21902EB23206C656E6774682F656E6420616464726573733A206E -S21902EB3825730A00776169742074696D656F75740000000073D0 -S21902EB4D74617274696E6720616464726573730000000041620A -S21902EB626F757420746F20737461727420657865637574696F68 -S21902EB776E206174202570202D2061626F7274207769746820E9 -S21902EB8C5E432077697468696E202564207365636F6E64730A57 -S21902EBA10000005B2D7261775D205B2D62203C6D656D5F616460 -S21902EBB664723E5D5D004C6F616420612066696C65006C6F6178 -S21902EBCB6400000000454C4620696D61676573206E6F74207359 -S21902EBE07570706F727465640A000000496E76616C6964205362 -S21902EBF52D7265636F7264206174206F66667365742025702CDB -S21902EC0A20696E7075743A2025630A00000042616420532D7299 -S21902EC1F65636F726420636F756E74206174206F6666736574E7 -S21902EC342025700A0000000041646472657373206F666673650C -S21902EC4974203D2025700A00000000417474656D707420746F3D -S21902EC5E206C6F616420532D7265636F7264206461746120746D -S21902EC736F20616464726573733A202570205B6E6F7420696E5E -S21902EC882052414D5D0A00002A2A2A205761726E696E67212054 -S21902EC9D436865636B73756D206661696C757265202D2041640E -S21902ECB264723A20256C782C202530326C58203C3E2025303235 -S21902ECC76C580A0000456E74727920706F696E743A2025702CEC -S21902ECDC20616464726573732072616E67653A2025702D257038 -S21902ECF10A0000496E76616C696420532D7265636F7264206196 -S21902ED0674206F6666736574203078256C782C20747970653ABD -S21902ED1B2025780A00256308000A00000075736167653A206CA0 -S21902ED306F6164203C66696C655F6E616D653E205B2D725D20C2 -S21902ED455B2D765D205B2D68203C686F73743E5D205B2D6D205D -S21902ED5A7B54465450207C205A4D4F44454D7D5D205B2D622058 -S21902ED6F3C626173655F616464726573733E5D0A007665726218 -S21902ED846F7365006C6F61642072617720646174610000006CFC -S21902ED996F6164206164647265737300000000646F776E6C6F91 -S21902EDAE6164206D6F6465202854465450206F72205A4D4F44DE -S21902EDC3454D290000686F7374206E616D652028495020616434 -S21902EDD8647265737329000066696C65206E616D65000000492B -S21902EDED6E76616C696420495020616464726573733A202573DB -S21902EE020A007A6D6F64656D00007466747000000000544654B2 -S21902EE1750206D6F6465207265717569726573206120776F7241 -S21902EE2C6B696E67206E6574776F726B0A000000496E76616CF3 -S21902EE41696420276D6F6465273A2025730A0046696C65206ECB -S21902EE56616D65206D697373696E670A000043616E2774206C10 -S21902EE6B6F616420272573273A2025730A000000004572726FBD -S21902EE80722072656164696E6720686561646572207669612001 -S21902EE95544654503A2025730A0000536F7272792C207A6D6F66 -S21902EEAA64656D20646F776E6C6F6164206E6F7420796574209B -S21902EEBF617661696C61626C650A000000526177206C6F6164A2 -S21902EED42072657175697265732061206D656D6F727920616473 -S21902EEE964726573730A005261772066696C65206C6F616465D3 -S21902EEFE642025702D25700A0000454C4600556E7265636F6769 -S21902EF136E697A656420696D61676520747970653A20256C7860 -S21902EF280A0000007B636D64737D00004D616E61676520464C29 -S21902EF3D41534820696D6167657300666973005B2D6C5D0000B3 -S21902EF5200004D616E61676520636F6E66696775726174696F30 -S21902EF676E206B65707420696E20464C415348206D656D6F7287 -S21902EF7C7900000066636F6E666967005B2D665D000000004990 -S21902EF916E697469616C697A6520464C41534820496D6167650A -S21902EFA62053797374656D205B4649535D00696E69740000003C -S21902EFBB0000000000446973706C617920636F6E74656E7473D6 -S21902EFD0206F6620464C41534820496D61676520537973746567 -S21902EFE56D205B4649535D000000006C69737400000000446980 -S21902EFFA73706C61792066726565205B617661696C61626C65F4 -S21902F00F5D206C6F636174696F6E732077697468696E20464C37 -S21902F02441534820496D6167652053797374656D205B464953EF -S21902F0395D000066726565000000002D66203C666C6173685F60 -S21902F04E616464723E202D6C203C6C656E6774683E00457261E0 -S21902F063736520464C41534820636F6E74656E7473000000009D -S21902F07865726173650000006E616D6500000000446973706CCF -S21902F08D617920616E20696D6167652066726F6D20464C415361 -S21902F0A24820496D6167652053797374656D205B4649535D00A8 -S21902F0B70064656C65746500004C6F616420696D6167652066A1 -S21902F0CC726F6D20464C41534820496D61676520537973746511 -S21902F0E16D205B4649535D20696E746F2052414D0000006C6F37 -S21902F0F66164000000002D62203C6D656D5F626173653E202D8A -S21902F10B6C203C6C656E6774683E205B2D66203C666C617368E8 -S21902F1205F616464723E5D205B2D65203C656E7472795F706F65 -S21902F135696E743E5D205B2D72203C72616D5F616464723E5D8D -S21902F14A203C6E616D653E00000043726561746520616E2069A2 -S21902F15F6D6167650063726561746500002A2A2A20696E76613A -S21902F1746C696420276669732720636F6D6D616E643A202573A5 -S21902F1890A0000666973200000000066756C6C20696E6974690E -S21902F19E616C697A6174696F6E2C2065726173657320616C6C62 -S21902F1B3206F6620666C6173680000000041626F757420746F1F -S21902F1C820696E697469616C697A65205B666F726D61745D2058 -S21902F1DD464C41534820696D6167652073797374656D002A2A6C -S21902F1F22041626F727465640A002A2A2A20496E697469616CAE -S21902F207697A6520464C41534820496D616765205379737465DA -S21902F21C6D0A0000202020696E697469616C697A6174696F6E17 -S21902F231206661696C65642025703A202578282573290A00009D -S21902F2460000202020205761726E696E673A206465766963658C -S21902F25B20636F6E74656E7473206E6F74206572617365642CD8 -S21902F27020736F6D6520626C6F636B73206D6179206E6F742018 -S21902F285626520757361626C650A00526564426F6F740052659A -S21902F29A64426F6F745B6261636B75705D00526564426F6F7483 -S21902F2AF20636F6E6669670000464953206469726563746F724F -S21902F2C4790000004572726F722077726974696E6720696D6130 -S21902F2D967652064657363726970746F72732061742025703A97 -S21902F2EE202578282573290A00004E616D6520202020202020F3 -S21902F30320202020202020464C41534820616464722020204D38 -S21902F318656D2061646472202020204C656E67746820202020EA -S21902F32D456E74727920706F696E740A000000252D3136732012 -S21902F3422030782530386C5820202030782530386C58202030CD -S21902F357782530366C58202030782530386C580A0020203078A8 -S21902F36C2530386C58202E2E2030782530386C580A0000006D28 -S21902F381656D6F727920626173652061646472657373007261B0 -S21902F3966D2062617365206164647265737300000000656E74E6 -S21902F3AB727920706F696E74206164647265737300464C4153E5 -S21902F3C048206D656D6F7279206261736520616464726573736F -S21902F3D50000006C656E677468000066696C65206E616D650039 -S21902F3EA0000696E76616C696420617267756D656E747300002A -S21902F3FF00726571756972656420706172616D65746572206D23 -S21902F414697373696E670000496E76616C696420464C415348FA -S21902F42920616464726573733A20257020282573290A0020207F -S21902F43E2076616C69642072616E67652069732025702D2570E2 -S21902F4530A00000000496E76616C69642052414D206164647211 -S21902F4686573733A2025700A000000004E616D65206973207433 -S21902F47D6F6F206C6F6E672C206D757374206265206C657373F2 -S21902F492207468616E2025642063686172730A00000043616E9D -S21902F4A72774206C6F6361746520256C64206279746573206634 -S21902F4BC72656520696E20464C4153480A000000496D61676586 -S21902F4D120666F756E642C2062757420464C4153482061646475 -S21902F4E67265737320696E636F72726563740A000000416E208B -S21902F4FB696D616765206E616D656420272573272065786973EE -S21902F5107473000043616E27742070726F6772616D20746869CE -S21902F5257320726567696F6E202D20636F6E7461696E73206364 -S21902F53A6F646520696E20757365210A000043616E27742065BC -S21902F54F7261736520726567696F6E2061742025703A202578B0 -S21902F564282573290A00000043616E27742070726F6772616DD3 -S21902F57920726567696F6E2061742025703A2025782825732948 -S21902F58E0A004572726F722065726173696E672061742025709A -S21902F5A33A202578282573290A000000004572726F7220707256 -S21902F5B86F6772616D6D696E672061742025703A202578282588 -S21902F5CD73290A000000006D697373696E6720617267756D65E1 -S21902F5E26E7400000000696D616765206E616D65000044656C52 -S21902F5F765746520696D61676520272573270000004E6F20694B -S21902F60C6D616765202725732720666F756E640A000000004EAE -S21902F6216F742061206C6F616461626C6520696D6167650A00E8 -S21902F6360000464C4153483A2064726976657220696E69742070 -S21902F64B6661696C6564212C207374617475733A2025780A002C -S21902F660464C4153483A202570202D2025702C20256420626C6C -S21902F6756F636B73206F662025702062797465732065612E0ABA -S21902F68A0000746F6F2066657720617267756D656E74730000BA -S21902F69F00756E7265636F676E697A656420636F6D6D616E6443 -S21902F6B40000000052756E2073637269707420617420626F6FFB -S21902F6C9740000626F6F745F73637269707400426F6F742073E2 -S21902F6DE637269707400626F6F745F7363726970745F646174AE -S21902F6F36100000000426F6F74207363726970742074696D6582 -S21902F7086F757400626F6F745F7363726970745F74696D656F68 -S21902F71D75740025733A2000000000257320007472756500007D -S21902F732000066616C7365000000256420003078253032580080 -S21902F747003A000000200000003F3F00000A0000002E2E202523 -S21902F75C730A0000456E746572207363726970742C20746572CA -S21902F7716D696E617465207769746820656D707479206C696E70 -S21902F786650A000000003E3E20006C69737420636F6E6669670A -S21902F79B75726174696F6E206F6E6C79002A2A20696E76616CE0 -S21902F7B0696420656E7472790A000000557064617465205265DA -S21902F7C564426F6F74206E6F6E2D766F6C6174696C6520636F46 -S21902F7DA6E66696775726174696F6E0000004572726F722077CC -S21902F7EF726974696E6720636F6E66696720646174612061742C -S21902F8042025703A202578282573290A00000000526571756547 -S21902F819737420666F7220636F6E6669672076616C756520276B -S21902F82E257327202D2077726F6E6720747970650A0043616E67 -S21902F84327742066696E6420636F6E6669672076616C7565205A -S21902F858272573270A000000464C41534820636F6E666967752B -S21902F86D726174696F6E20636865636B73756D206572726F7235 -S21902F882206F7220696E76616C6964206B65790A0000657468AE -S21902F897300000000073635F6C7065000043462063617264204C -S21902F8AC776F6E277420676F207265616479210A000000004EAD -S21902F8C16F742061205343204C50452C20736F7272790A00007B -S21902F8D600000A00000025733A2025732025732025730A000008 -S21902F8EB00436F756C646E27742066696E6420434F5220706F3D -S21902F900696E746572210A0043616E2774207061727365204353 -S21902F91549530A0000000043616E277420666574636820636F67 -S21902F92A6E66696720696E666F0A00000000436F6D7061637480 -S21902F93F20466C61736820636172642072656D6F766564210AA7 -S21902F954000000002E2E2E2057616974696E6720666F72206E25 -S21902F9696574776F726B20636172643A2000002E00000025730C -S21902F97E0A0073635F6C70655F4275664576656E7400303132DC -S21902F9933334353637383900003031323334353637383961620E -S21902F9A8636465660000000030313233343536373839414243DE -S21902F9BD444546000000005E430A003078253038583A200000CD -S21902F9D2000025303258000000002020000020000000207C003E -S21902F9E700256300007C0A0000202D2061726520796F75207341 -S21902F9FC7572652028792F6E293F20004E45544153434949006D -S21902FA110000004F43544554000000556E6B6E6F776E20657273 -S21902FA26726F7200000066696C65206E6F7420666F756E640024 -S21902FA3B006163636573732076696F6C6174696F6E0000000048 -S21902FA506469736B2066756C6C206F7220616C6C6F63617469B2 -S21902FA656F6E20657863656564656400000000696C6C656761E3 -S21902FA7A6C2054465450206F7065726174696F6E0000756E6B67 -S21902FA8F6E6F776E207472616E736665722049440066696C65C7 -S21902FAA420616C726561647920657869737473006E6F2073759F -S21902FAB963682075736572000000006F7065726174696F6E2096 -S21902FACE74696D6564206F757400736F6D6520736F7274206F66 -S21902FAE366206E6574776F726B206572726F720000696E76617F -S21902FAF86C696420706172616D6574657200000070726F746FA4 -S21902FB0D636F6C2076696F6C6174696F6E000066696C65206980 -S21902FB2273206C6172676572207468616E206275666665720052 -S21902FB370047444220636F6E6E656374696F6E20706F727400B0 -S21902FB4C6764625F706F7274000000004E6574776F726B2064DE -S21902FB616562756720617420626F6F742074696D6500006E657A -S21902FB76745F646562756700000055736520424F4F5450206642 -S21902FB8B6F72206E6574776F726B20636F6E6669677572617401 -S21902FBA0696F6E00626F6F74700000004C6F63616C204950201B -S21902FBB56164647265737300000000626F6F74705F6D795F691D -S21902FBCA700044656661756C74207365727665722049502061F9 -S21902FBDF646472657373000000626F6F74705F7365727665726B -S21902FBF45F69700025732E25640A00006E65745F696F5F77729E -S21902FC09697465000000006E65745F696F5F72656164004E6F67 -S21902FC1E206E6574776F726B20696E74657266616365732066D6 -S21902FC336F756E640A0000000043616E27742067657420424F37 -S21902FC484F545020696E666F202D206E6574776F726B2064697D -S21902FC5D7361626C6564210A00000049503A20257300002C201E -S21902FC7244656661756C74207365727665723A2025730A0000FE -S21902FC870025642E25642E25642E2564002573202D2063616C7E -S21902FC9C6C6564207769746820696E76616C6964204349533AFB -S21902FCB12025780A00000063665F70617273655F6366746162CE -S21902FCC66C650000000063665F70617273655F636F6E66696739 -S21902FCDB0050434D4349413A20496E76616C696420736C6F745D -S21902FCF02025640A000000002E2E2E2045726173652066726F44 -S21902FD056D2025702D25703A2000002E0000000A0000002E2E10 -S21902FD1A2E2050726F6772616D2066726F6D2025702D2570203C -S21902FD2F61742025703A2000004E6F206572726F72202D206FF1 -S21902FD447065726174696F6E20636F6D706C657465000000497F -S21902FD596E76616C696420464C4153482061646472657373007C -S21902FD6E00004572726F7220747279696E6720746F2065726157 -S21902FD8373650000004572726F7220747279696E6720746F20A2 -S21902FD986C6F636B2F756E6C6F636B004572726F722074727962 -S21902FDAD696E6720746F2070726F6772616D0047656E65726987 -S21902FDC263206572726F720000004465766963652F7265676952 -S21902FDD76F6E2069732077726974652D70726F746563746564F5 -S21902FDEC00000000464C415348207375622D73797374656D2031 -S21902FE016E6F7420696E697469616C697A656400000000556E1B -S21902FE166B6E6F776E206572726F7200000045746865726E658E -S21902FE2B742073656E643A0A0025733A207061636B6574206F40 -S21902FE40662025642062797465732064726F707065640A0065D3 -S21902FE5574685F6472765F726563760000000045746865726E95 -S21902FE6A657420726563763A0A005152590043616E277420695D -S21902FE7F64656E7469667920464C4153482C20736F7272790A51 -S21902FE9400000000457272203D2025780A00000025733A2043D0 -S21902FEA9616E27742066696E642061646472657373206F6620F7 -S21902FEBE7365727665720A0000005F5F7564705F73656E647403 -S21902FED36F000000007564705F7265637666726F6D202D2064C7 -S21902FEE8726F70706564207061636B6574206F662025642062BC -S21902FEFD797465730A00005F5F656E65745F706F6C6C3A206ED2 -S21902FF126F206D6F726520627566666572730A00000000010277 -S21902FF2702030303030404040404040404050505050505050568 -S21902FF3C05050505050505050606060606060606060606060633 -S21902FF5106060606060606060606060606060606060606070714 -S21902FF66070707070707070707070707070707070707070707EC -S21902FF7B070707070707070707070707070707070707070707D7 -S21902FF90070707070707070707070707070707070707070708C1 -S21902FFA508080808080808080808080808080808080808080898 -S21902FFBA08080808080808080808080808080808080808080883 -S21902FFCF0808080808080808080808080808080808080808086E -S21902FFE408080808080808080808080808080808080808080859 -S21902FFF908080808080808080808080808080808080808080844 -S21903000E0808080808080808080808080808080808080808082D -S21903002308000102020303030304040404040404040505050573 -S21903003805050505050505050505050506060606060606060639 -S21903004D06060606060606060606060606060606060606060618 -S219030062060607070707070707070707070707070707070707F0 -S219030077070707070707070707070707070707070707070707D9 -S21903008C070707070707070707070707070707070707070707C4 -S2190300A10707070808080808080808080808080808080808089D -S2190300B608080808080808080808080808080808080808080885 -S2190300CB08080808080808080808080808080808080808080870 -S2190300E00808080808080808080808080808080808080808085B -S2190300F508080808080808080808080808080808080808080846 -S21903010A08080808080808080808080808080808080808080830 -S20903011F0808080808AB -S219030124000000006432020064320200643202006432020064FA -S2190301393202006432020064320200643202006432020064327F -S21903014E0200643202006432020064320200643202006432029A -S21903016300643202006432020064320200643202006432020087 -S2190301786432020064320200643202006432020064320200640E -S21903018D3202006432020064320200643202006432020064322B -S2190301A202006432020064320200643202006432020064320246 -S2190301B700643202006432020064320200643202006432020033 -S2190301CC643202006432020064320200643202006432020064BA -S2190301E1320200643202006432020064320200643202006432D7 -S2190301F6020064320200643202006432020064320200643202F2 -S21903020B0064320200643202006432020000000000000000000E -S219030220000000000000000000000000000000000000000000C1 -S219030235000000000000000000000000000000000000000000AC -S21903024A00000000000000000000000000000000000000000097 -S21903025F00000000000000000000000000000000000000000082 -S2190302740000000000000000000000000000000000000000006D -S21903028900000000000000000000000000000000000000000058 -S21903029E00000000000000000000000000000000000000000043 -S2190302B30000000000000000000000000000000000000000002E -S2190302C800000000000000000000000000000000000000000019 -S2190302DD00000000000000000000000000000000000000000004 -S2190302F2000000000000000000000000000000000000000000EF -S219030307000000000000000000000000000000000000000000D9 -S21903031C000000000000000000000000000000000000000000C4 -S219030331000000000000000000000000000000000000000000AF -S2190303460000000000000000000000000000000000000000009A -S21903035B00000000000000000000000000000000000000000085 -S21903037000000000000000000000000000000000000000000070 -S2190303850000000000000000000000000000000000000000005B -S21903039A00000000000000000000000000000000000000000046 -S2190303AF00000000000000000000000000000000000000000031 -S2190303C40000000000000000000000000000000000000000001C -S2190303D900000000000000000000000000000000000000000007 -S2190303EE000000000000000000002000000000000000A41D020F -S21903040300F41D0200000000000000000000000000FFFFFFFFCD -S219030418000000000000000000000000F0C10300000000000013 -S21903042D0000000000000000000000FEFFFFFFFEFFFFFF0000BC -S21903044200000000000000000180E80300000F0000000000051D -S21903045780E80300001100000000000000000000007C2F2D5CD8 -S21903046C7C2D00000000000004810200D0800200D4810200ECAE -S219030481810200608202009C8402003C860200D4860200E404CD -S21903049603000000000074040300C0C4030094F80200000000B6 -S2190304AB00000000000000000008881234567800000000000090 -S2190304C000000000141E0000141E0000F40100000000000000C6 -S2190304D5000000000000000000000000000000F0B10200BCB5F6 -S2190304EA020014B4020000000000000000000000000000000029 -S2190304FF000000000000000000000000000000000000000000E0 -S219030514000000000000000000000000000000000000000000CA -S21903052900000064F1020054F10200FCF00200C4670200B8F054 -S21903053E020088F0020080F00200306F020078F0020060F00255 -S2190305530044F00200586D02003CF00200F8EF0200BCEF0200CA -S21903056818660200B4EF020090EF020088EF020080620200F083 -S21903057DEF0200C0EF0200BCEF020084650200F4F00200C0F091 -S219030592020080F0020020710200F8E80200E0E80200D4E802DB -S2190305A70084540200CCE80200A4E802008CE8020074560200D7 -S2190305BC48EF020034EF02002CEF02005073020080EF0200541D -S2190305D1EF02004CEF02005C78020088E802006CE8020054E805 -S2190305E60200245702004CE8020038E8020030E802002456028B -S2190305FB00C8EB0200BCEB0200A4EB0200285E0200CCF60200A8 -S219030610B8F60200000000000100000001000000E4F60200D867 -S219030625F60200CCF6020001000000040000000CF70200F8F604 -S21903063A0200CCF602000100000002000000A4FB020080FB02BC -S21903064F00000000000100000001000000C0FB0200ACFB020026 -S219030664A4FB02000000000005000000E8FB0200CCFB0200A481 -S219030679FB020000000000050000004CFB020038FB02000000E4 -S21903068E0000010000000200000074FB020058FB020000000086 -S2190306A3000100000001000000CC7B0200A0A402009CF8020013 -S2140306B8988002009C04030000000000683B0200C8 +S219020449F0A0E1803D03008041030080510300803C0300003DD2 +S21902045E0300803D0300003C0300A0F90300A0F9030000330312 +S2190204730000330300003C030004330300F4330300E434030079 +S219020488000002000033030065436F73203A20004A616E2033B0 +S21902049D30203230303100000002000000020080F703000DC0E5 +S2190204B2A0E170D82DE904B04CE2BCD04DE2BC304BE2C0204B6E +S2190204C7E200308DE50040A0E104208DE530604BE2E4319FE5E8 +S2190204DC0600A0E108308DE50150A0E1D8319FE57710A0E3006A +S2190204F1C093E50120A0E3C4C00BE50030A0E30E2400EB0120AE +S219020506A0E300208DE5C4304BE204308DE50400A0E1AC319FFC +S21902051BE50040A0E30C308DE50510A0E108408DE50630A0E167 +S2190205300E2400EB040050E16700000AC0301BE5040053E10CB8 +S21902054500000A80019FE5C4101BE5BC201BE5E42000EB3800B4 +S21902055A4BE2BC201BE50810A0E3823262E0032182E08221A022 +S21902056FE1412200EB020070E35700000A50C19FE550319FE5F1 +S2190205840420A0E103306CE0030052E10600002AB8004BE203E9 +S21902059910A0E104309CE4023180E7012082E2010052E1FAFFB5 +S2190205AEFF3A00300FE100400FE1C04084E304F029E10E02A093 +S2190205C3E3021A80E2202090E4000031E1FCFFFF1A0000A0E35E +S2190205D8160F07EE9A0F07EE101F11EE011AC1E3101F01EE0044 +S2190205ED10A0E3151F07EE0000A0E10000A0E10000A0E10000B3 +S219020602A0E10000A0E10000A0E1101F11EE0C10C1E3101F013B +S219020617EE0010A0E3161F07EE0E02A0E3021A80E2202090E457 +S21902062C000031E1FCFFFF1A0000A0E3160F07EE9A0F07EE0051 +S21902064110A0E3151F07EE151F08EE0000A0E10000A0E10000B5 +S219020656A0E10000A0E10000A0E10000A0E10010A0E3161F07B5 +S21902066BEE171F08EEC4301BE5B8204BE2032182E20F32C3E3F1 +S219020680033183E20350A0E10210A0E101F0A0E100000FE100FC +S219020695F069E11F00C0E3120080E300F029E105E0A0E105D0A3 +S2190206AAA0E10010A0E3101F01EE0000A0E31910A0E30EF0B025 +S2190206BFE1050000EAC011030060F80300D0110300E411030044 +S2190206D490060200DC06020070A81BE90DC0A0E100D82DE9082E +S2190206E9009FE504B04CE27D2000EB00A81BE93C1203000DC03D +S2190206FEA0E1F0D92DE904B04CE20150A0E10070A0E30530A004 +S219020713E1015045E2070053E10080A0E10260A0E1470000DA31 +S2190207280FE0A0E108F0A0E1FF4000E20FE0A0E108F0A0E100C2 +S21902073D10A0E3302044E2413044E2050053E309005283FFE008 +S21902075200E20200009A613044E2050053E30000008A0110A0E0 +S219020767E3000051E32F00000A00C0A0E330004EE2FF1000E292 +S21902077C41204EE2FF3002E2050053E3090051830200009A61A8 +S219020791304EE2050053E30000008A01C0A0E300005CE3210083 +S2190207A6000A0774A0E100C0A0E3301044E2FF3001E20900531A +S2190207BBE301C0A0910600009A613044E2050053E357C04492CE +S2190207D00200009A413044E2050053E337C044920010A0E3FF40 +S2190207E53000E2090053E30010A0910600009A61304EE2050000 +S2190207FA53E357104E920200009AFF3002E2050053E337104EE7 +S21902080F920C2281E1027087E1000056E30500000A003096E5DE +S219020824023083E0003086E5010000EA0000E0E3F0A91BE90538 +S21902083930A0E1015045E2000053E3B7FFFFCA0700A0E1F0A9A4 +S21902084E1BE90DC0A0E1F0DF2DE90120A0E304B04CE268D04D4C +S219020863E288200BE50070A0E38C700BE50030E0E390300BE57D +S2190208780790A0E180100BE50080A0E1980000EA530052E303BE +S21902088D00000A18029FE50710A0E1132000EB960000EA0FE082 +S2190208A2A0E108F0A0E1027087E200C0A0E10800A0E10110A0EA +S2190208B7E37C204BE20030A0E37C300BE5FF600CE28BFFFFEB69 +S2190208CC005050E27CA04BE2030000AAD4019FE50710A0E101A6 +S2190208E12000EB840000EA017087E2303046E2090053E303F1ED +S2190208F69F97670000EADC0A02002409020024090200240902EA +S21902090B009C0A02009C0A02009C0A0200580A0200580A020010 +S219020920580A02000800A0E12F1046E20A20A0E171FFFFEB0062 +S21902093540A0E12F3047E288201BE5067083E084400BE5000028 +S21902094A52E30A00000A80301BE5000053E30400000A0390645D +S21902095FE050019FE50910A0E1DF1F00EB000000EA80901BE54A +S2190209740020A0E388200BE538319FE5001093E5094084E0907A +S219020989301BE5042069E0030052E10230A03190300BE50100CB +S21902099E54E10300003A14319FE5002093E5020054E103000030 +S2190209B39A08019FE50410A0E1CA1F00EB4D0000EA2E3085E29C +S2190209C8035066E0057087E00530A0E1015045E2000053E30832 +S2190209DD0000DA0800A0E10110A0E30A20A0E142FFFFEB0530FC +S2190209F2A0E1015045E20100C4E4000053E3F6FFFFCA0800A0AB +S219020A07E10110A0E30020A0E339FFFFEB017087E20000E0E1FE +S219020A1C7C205BE5FF3000E27C200BE5020053E10300000A847E +S219020A31101BE58C009FE5AB1F00EB2E0000EA8C201BE50430DC +S219020A4669E0020053E10320A0218C200BE5200000EA0800A0E3 +S219020A5BE13B1066E20A20A0E124FFFFEB5C309FE590201BE593 +S219020A700040A0E154009FE5004083E58C301BE50410A0E19840 +S219020A851F00EB0FE0A0E108F0A0E1000050E3FBFFFFCA170055 +S219020A9A00EA0710A0E12C009FE50620A0E18F1F00EB120000BC +S219020AAFEA5812030084120300A812030058F80300C4F703006D +S219020AC4C0120300FC12030060F8030038130300601303000110 +S219020AD97087E20FE0A0E108F0A0E10A0050E3FAFFFF1A0FE001 +S219020AEEA0E108F0A0E1002050E262FFFFCAF0AF1BE90DC0A066 +S219020B03E130D82DE9D4309FE504B04CE2085193E50340A0E1D8 +S219020B18000055E3010000AA0000E0E330A81BE92600001A14EB +S219020B2D3194E5000053E30900000A183194E5A4209FE503109C +S219020B42D2E7A0009FE5013083E2183184E5651F00EB18319426 +S219020B57E5060053E3185184850C3194E5FF0053E3050000CA35 +S219020B6C143194E5000053E3E9FFFF0A70009FE55A1F00EBE64A +S219020B81FFFFEA043084E20300A0E1011CA0E3043184E5112ED5 +S219020B9684E20FE0A0E100F094E50C0184E5080184E5000050CC +S219020BABE3050000CA143194E5000053E3D8FFFF0A2C009FE5F8 +S219020BC0491F00EBD5FFFFEA083194E5042194E5013043E2085B +S219020BD53184E50100D2E4042184E530A81BE940F50300643677 +S219020BEA03008C130300901303000DC0A0E100D82DE920309F79 +S219020BFFE504B04CE200C0A0E308C183E5012CA0E30C2183E55A +S219020C14000083E5141183E518C183E500A81BE940F503000D9D +S219020C29C0A0E100D82DE914309FE5042083E2042183E50C1185 +S219020C3E93E504B04CE2081183E500A81BE940F503000DC0A06E +S219020C53E1F0DD2DE90C20A0E304B04CE2C0D04DE20080A0E170 +S219020C6830604BE20600A0E10040A0E3B8400BE50170A0E1D0BF +S219020C7D400BE50410A0E19F1D00EB0150A0E3BA524BE1BC42E5 +S219020C924BE1B0304BE200308DE504A0A0E104A08DE5D4339F8A +S219020CA7E50C20A0E3B8224BE17610A0E308308DE5AC404BE2CB +S219020CBCC0339FE50400A0E114C093E50A20A0E130C00BE50247 +S219020CD130A0E3192200EBB4304BE200308DE594004BE29C33EB +S219020CE69FE57210A0E308308DE50A20A0E104A08DE50230A02C +S219020CFBE30F2200EBB8304BE200308DE5BC204BE204208DE588 +S219020D107C004BE270339FE56210A0E308308DE50520A0E10AA8 +S219020D2530A0E1042200EBC0304BE200308DE5C4204BE20420FC +S219020D3A8DE564004BE248339FE56D10A0E308308DE50520A02C +S219020D4FE10530A0E1F92100EBC8304BE200308DE5CC204BE20C +S219020D6404208DE54C004BE220339FE56810A0E308308DE505E3 +S219020D7920A0E10530A0E1EE2100EB0530A0E300308DE5D020C3 +S219020D8E4BE224008DE90800A0E1F8329FE50710A0E10C308DEA +S219020DA3E50520A0E10430A0E1EF2100EB000050E3E500000AD7 +S219020DB8CC301BE5000053E30800000AC8001BE50610A0E1D8A4 +S219020DCD2C00EB000050E30300001ABC029FE5C8101BE5C11EAA +S219020DE200EBD90000EAC4301BE5000053E33400000AC0401BC4 +S219020DF7E5014084E20400A0E1CE1E00EB0020A0E190129FE531 +S219020E0C0400A0E1251F00EB000050E31900001AC0001BE500F0 +S219020E2120D0E5411042E2203082E2FF3003E2190051E3023024 +S219020E36A081790053E30010A0E10800000A020000CA78005396 +S219020E4BE30300000A080000EA7A0053E30400000A050000EAFC +S219020E6001A0A0E3170000EA02A0A0E3150000EA03A0A0E313F4 +S219020E750000EA24029FE59A1E00EBB20000EAC0001BE51812A4 +S219020E8A9FE5D91E00EB000050E30700001A0C329FE50020931D +S219020E9FE500A0A0E1000052E30600001AFC019FE58D1E00EBC5 +S219020EB4A50000EAE4019FE5C0101BE5891E00EBA10000EA003D +S219020EC9005AE30800001AD0301BE5000053E30500001AD00188 +S219020EDE9FE5811E00EBCC019FE5CC119FE57E1E00EB9600001B +S219020EF3EABC301BE5000053E30B00000AB8219FE5B8101BE59D +S219020F08003092E5030051E10300003AA8319FE5002093E502BD +S219020F1D0051E10200009A9C019FE56F1E00EB870000EA0000E0 +S219020F325AE31000001A0610A0E10120A0E3D4C04BE20C30A064 +S219020F47E1D0001BE50C80A0E1302B00EB005050E2030000AA5B +S219020F5CD4001BE5D0401BE5382C00EB0E0000EA58019FE5B0C1 +S219020F71101BE51EFFFFEB120000EA0A10A0E1D4304BE2032062 +S219020F86A0E1D0001BE50380A0E18F2300EB005050E2070000D4 +S219020F9BAAD4001BE5D0401BE59F2400EB0020A0E11C019FE5BC +S219020FB00410A0E14C1E00EB640000EA10019FE50010A0E30ABB +S219020FC5FFFFEB0040A0E304719FE534604BE2010000EA04506B +S219020FDAC6E7014084E2030054E30400008AC4FEFFEB00505093 +S219020FEFE2F8FFFFAA103197E5D4300BE5000055E3480000BA79 +S21902100407FFFFEBB4301BE5000053E31100000ABC301BE500BF +S2190210190053E30200001AB4009FE5301E00EB3E0000EAB840D8 +S21902102E1BE5A8609FE5000000EA0150C4E4AFFEFFEB00505000 +S219021043E2FBFFFFAA0600A0E1B8101BE50420A0E1241E00EBEB +S219021058320000EA33004BE27C109FE50320A0E37B1E00EB00C6 +S21902106D0050E31D00001A6C009FE598FDFFEB290000EA9413D4 +S219021082030070F803009C130300AC130300BC130300E01303A8 +S21902109700F8130300041403001C140300241403003814030057 +S2190210AC9CF9030040140300681403007C140300143603005882 +S2190210C1F80300C4F703008C140300F4BD0200B4140300749F26 +S2190210D6020040F50300CC140300F014030008150300000B02AD +S2190210EB0034305BE5530053E30800001A33305BE5303043E272 +S219021100090053E30400008A08009FE5B8101BE5CEFDFFEB03FA +S2190211150000EA000B020028009FE534101BE5F01D00EB0000DF +S21902112A5AE30100001A0800A0E1262B00EB00005AE30300004C +S21902113F0A0800A0E11F2400EB000000EA0C150300F0AD1BE924 +S2190211540DC0A0E100D82DE9031081E22111A0E10130A0E10167 +S2190211691041E204B04CE200C0A0E10000A0E3000053E1050058 +S21902117E00DA0120A0E1011041E204309CE4000052E303002099 +S219021193E0F9FFFFCA00A81BE90DC0A0E1F0D82DE978309FE59B +S2190211A878409FE5001093E574509FE504B04CE2002094E500A4 +S2190211BD70A0E1000095E5011062E01A1C00EB003094E500602E +S2190211D2A0E3005095E5230456E10E00002A0030D5E5FF0053E2 +S2190211E7E30600000A0700A0E10510A0E1E01D00EB000050E3C0 +S2190211FC0100001A0500A0E1F0A81BE9016086E2003094E50127 +S2190212115C85E2230456E1F0FFFF3A0000A0E3F0A81BE9845184 +S219021226030088510300905103000DC0A0E100D82DE90010A0FD +S21902123BE118009FE504B04CE2A81D00EB10009FE510109FE550 +S21902125010209FE5A42000EB00A81BE908180300E439030074BC +S2190212653A0300281803000DC0A0E1F0DF2DE904B04CE230D0D8 +S21902127A4DE20080A0E344304BE20060A0E140504BE244800B18 +S21902128FE50500A0E100308DE50140A0E14C329FE56610A0E379 +S2190212A408308DE50820A0E104808DE50230A0E3A12000EB0183 +S2190212B930A0E308018DE80600A0E128329FE50410A0E10C30B2 +S2190212CE8DE50220A0E308808DE50530A0E1A32000EB08005037 +S2190212E3E1A800000A08029FE5D91F00EB080050E10200001A96 +S2190212F8FC019FE57A1D00EBA10000EAF4019FE5771D00EBF064 +S21902130D119FE544201BE5EC319FE500E091E50190A0E1006062 +S21902132293E502085EE30E70A0A10278A0B3000052E315000016 +S2190213370A8740A0E1040086E048C04BE2C0119FE50C20A0E1A7 +S21902134C003091E50CA0A0E1023043E29E0301E0011064E04F35 +S2190213612D00EB005050E20B00000A48401BE50500A0E1832E02 +S21902137600EB0410A0E10030A0E188019FE50520A0E1571D0003 +S21902138BEB020000EA7C019FE5541D00EB48A04BE274319FE5D4 +S2190213A00010A0E3004093E5012CA0E30400A0E1D41B00EB6077 +S2190213B5319FE5030093E8030084E8106084E5146084E518703C +S2190213CA84E5012CA0E3024084E00400A0E10010A0E3C91B004C +S2190213DFEB38C19FE50F009CE80F0084E8187084E5073086E0EE +S2190213F4103084E50010A0E3143084E5012CA0E3014C84E2048D +S21902140900A0E1BD1B00EB0CC19FE50F009CE804E0A0E1070033 +S21902141EAEE800519FE50130CEE42324A0E10120CEE42338A0CE +S219021433E10030CEE5002099E5003095E5823043E0103084E513 +S219021448182084E50010A0E3143084E5012CA0E3024084E0044D +S21902145D00A0E1A81B00EBC0C09FE50F009CE804E0A0E1070041 +S219021472AEE80130CEE42334A0E10030CEE5018088E20030957A +S219021487E5018088E2001099E5018088E2036061E0106084E583 +S21902149C018088E2146084E50A20A0E1181084E50600A0E1E6C3 +S2190214B12D00EB0600A0E1001099E50A20A0E1F72C00EB0050E9 +S2190214C650E21800000A48401BE50500A0E12B2E00EB0410A0B0 +S2190214DBE10030A0E128009FE50520A0E1FF1C00EB1F0000EA02 +S2190214F030180300FC1503005C1803008C180300981803008828 +S219021505510300805103008C510300BC180300E418030090510B +S21902151A03002C19030034190300441903008451030054190372 +S21902152F004C309FE50600A0E1001093E50824A0E10A30A0E129 +S219021544222D00EB005050E20700000A48401BE50500A0E10AA6 +S2190215592E00EB0410A0E10030A0E11C009FE50520A0E1DE1CD7 +S21902156E00EB0600A0E1001099E50A20A0E1672D00EB01000036 +S219021583EA9051030064190300F0AF1BE90DC0A0E1F0D82DE92F +S21902159804B04CE22CD04DE20070A0E338304BE20060A0E1348D +S2190215AD504BE238700BE50500A0E100308DE50140A0E1AC3047 +S2190215C29FE56310A0E308308DE50720A0E104708DE50230A089 +S2190215D7E3D81F00EB0130A0E388008DE80600A0E188309FE5BF +S2190215EC0410A0E10C308DE50220A0E308708DE50530A0E1DA81 +S2190216011F00EB070050E12E00000A68E09FE568009FE5683003 +S2190216169FE568409FE538201BE564109FE500C093E507005227 +S21902162BE1003094E50E10A0010C5063E0AB1C00EB003094E560 +S2190216400760A0E1230456E11E00002A0030D5E5FF0053E316CB +S21902165500000A30009FE538301BE5102095E5000053E309006A +S21902166A000AFCC095E5080000EA98190300FC150300F8190356 +S21902167F00AC1903008451030088510300EC190300041A0300AA +S21902169414C095E5183095E500308DE51C3095E504308DE50517 +S2190216A910A0E10C30A0E18D1C00EB016086E2003094E5015C74 +S2190216BE85E2230456E1E0FFFF3AF0A81BE90DC0A0E170D82DD4 +S2190216D3E9B4309FE5B4109FE504B04CE2B0C09FE5002093E5F4 +S2190216E8005091E500009CE50C60A0E1804082E00410A0E105F6 +S2190216FD0054E11C00002A003094E5010073E31500000A040033 +S21902171251E10200000A7C009FE50420A0E1711C00EB0410A0AC +S219021727E1050054E10B00002A003094E5010073E30800000A44 +S21902173C54309FE5002093E50320C2E3021081E0050051E1027D +S21902175100002A003091E5010073E3F9FFFF1A0140A0E1E4FF9F +S219021766FFEA003096E50330C3E3034084E0E0FFFFEA04005136 +S21902177BE10200000A14009FE50420A0E1571C00EB70A81BE9AE +S219021790805103008451030088510300301A03000DC0A0E130EA +S2190217A5D82DE9BC309FE5BC409FE5002093E500E094E504B0A5 +S2190217BA4CE2B0C09FE58E2082E000E09CE50050A0E102C0A04D +S2190217CFE10E005CE11A00002A0400A0E1003092E5010073E30B +S2190217E41100000A02005CE10200000A02306CE0430151E11679 +S2190217F900009A02C0A0E10E005CE10700002A003090E50320B3 +S21902180EC3E302C08CE00E005CE10200002A00309CE50100734E +S219021823E3F9FFFF1A0C20A0E1020000EA003090E50330C3E39E +S219021838032082E00E0052E1E5FFFF3A02005CE10500000A0261 +S21902184D306CE0430151E10200008A00C085E50100A0E330A87B +S2190218621BE90000A0E330A81BE980510300885103008451037F +S219021877000DC0A0E1F0DF2DE904B04CE2F8D04DE20040A0E386 +S21902188CD8400BE5E0400BE5E8400BE5F0400BE50080A0E1F8F7 +S2190218A1400BE5D0604BE200410BE50600A0E104410BE5D430AD +S2190218B64BE200308DE5D8204BE204208DE50170A0E1B4339F14 +S2190218CBE56210A0E308308DE50120A0E30430A0E1171F00EB03 +S2190218E0DC304BE200308DE5E0204BE204208DE5B8004BE28CDD +S2190218F5339FE57210A0E308308DE50120A0E30430A0E10C1FED +S21902190A00EBE4304BE200308DE5E8204BE204208DE5A0004B3D +S21902191FE264339FE56510A0E308308DE50120A0E30430A0E1B4 +S219021934011F00EB88004BE2F0304BE204308DE5EC504BE2403B +S219021949339FE56610A0E308308DE50120A0E300508DE504308E +S21902195EA0E1F61E00EBF4304BE200308DE5F8204BE204208D04 +S219021973E570004BE214339FE56C10A0E308308DE50120A0E3BE +S2190219880430A0E1EB1E00EBFC304BE200308DE5012C4BE20441 +S21902199D208DE558004BE2EC329FE57310A0E308308DE50120A4 +S2190219B2A0E30430A0E1E01E00EB413F4BE200308DE540004B1E +S2190219C7E2CC329FE56E10A0E308308DE50420A0E104408DE59A +S2190219DC0230A0E3D61E00EB0730A0E300308DE5422F4BE2045D +S2190219F1208DE5063043E208308DE50800A0E198329FE5071055 +S219021A06A0E10C308DE50220A0E30630A0E1D51E00EB04005007 +S219021A1BE10570A0E10200001A78029FE500FEFFEB4D0100EA9E +S219021A3004211BE5000052E30200001AD8301BE5000053E30ADC +S219021A4500000A000052E30200000AF0301BE5000053E30500DF +S219021A5A000AF8301BE5000053E30200000A08311BE500005370 +S219021A6FE30200001A2C029FE5ECFDFFEB390100EA00311BE582 +S219021A84F4001BE5000053E3FC000B0514529FE5004095E50468 +S219021A990080E0010040E20410A0E1293C00EB940003E0FC2036 +S219021AAE1BE50590A0E1F4300BE5020053E10200002AE8019F08 +S219021AC3E5881B00EB260100EAF0301BE5000053E31800000A0B +S219021AD8EC001BE53B2B00EB006050E20600001AEC001BE5FC1B +S219021AED301BE5030080E0010040E2342B00EB006050E20D003E +S219021B02000AEC401BE50600A0E19D2C00EB0020A0E198019F7D +S219021B17E50410A0E1721B00EB90019FE590319FE590C19FE591 +S219021B2C001093E500209CE56C1B00EB0A0100EA08011BE57E86 +S219021B411B00EB0F0050E30300009A70019FE51010A0E3641B8C +S219021B5600EB020100EA04311BE5000053E31C00001A58619FA2 +S219021B6BE5D4101BE5003096E550419FE5030051E10400003A62 +S219021B80FC301BE5002094E5033081E0020053E10500003A3447 +S219021B95019FE5531B00EB14019FE5001096E5002094E54F1B2F +S219021BAA00EBF0301BE5000053E30800001AF4101BE50700A011 +S219021BBFE1F6FEFFEB000050E30300001A00019FE5F4101BE572 +S219021BD4441B00EBE20000EADC309FE5001099E5EC409FE50011 +S219021BE980A0E300C093E50120A0E1000094E50CC061E010C1AC +S219021BFE0BE50C10A0E18B1900EB003099E50860A0E100709414 +S219021C13E5230458E13500002A0030D7E5FF0053E32D00000AB9 +S219021C2808011BE50710A0E1511B00EB000050E32800001AF043 +S219021C3D301BE5000053E30300000A102097E5EC301BE503004D +S219021C5252E19E00001A181097E5F4201BE5020051E19D000002 +S219021C671A6C009FE508111BE5781D00EB000050E3BA00000AC7 +S219021C7C0180A0E31B0000EA481A03005C1A0300701A03008454 +S219021C911A0300A01A0300B81A0300D41A0300081B0300141B42 +S219021CA60300281B030088510300441B0300741B0300941B0357 +S219021CBB008051030084510300B01B030058F80300C4F7030082 +S219021CD0E01B03000C1C030090510300981C0300016086E2006B +S219021CE53099E5017C87E2230456E1C9FFFF3A04211BE50000CB +S219021CFA58E30C00001A003099E5E0119FE50860A0E100709160 +S219021D0FE5020000EA016086E2003099E5017C87E2230456E12C +S219021D240200002A0030D7E5FF0053E3F7FFFF1A000052E32CE6 +S219021D3900001AEC101BE5FC301BE50100A0E1031081E0011045 +S219021D4E41E2630C00EB008050E20200000A8C019FE5E11A0032 +S219021D63EB7F0000EA01A0A0E3EC001BE5435F4BE2F4101BE52D +S219021D780520A0E1C82A00EB006050E20800000A0600A0E10C95 +S219021D8D411BE508A0A0E1FB2B00EB0410A0E10030A0E14C012C +S219021DA29FE50620A0E1CF1A00EB00005AE30E00000AEC001BCA +S219021DB7E5D4101BE5FC201BE50530A0E1022B00EB006050E2CB +S219021DCC0700000A0C411BE50600A0E1EA2B00EB0410A0E10081 +S219021DE130A0E10C019FE50620A0E1BE1A00EB0700A0E10010A2 +S219021DF6A0E3012CA0E3411900EB08111BE50700A0E1EB1A00B3 +S219021E0BEBEC301BE5E0201BE5103087E5000052E30500001AB4 +S219021E20F0301BE5000053E3EC201B150200001AD4201BE50004 +S219021E350000EADC201BE5E8301BE5142087E5000053E30200BB +S219021E4A001AA8309FE5003093E5000000EAE4301BE51C30878D +S219021E5FE5F4301BE5183087E5FC201BE5202087E5EC001BE5F6 +S219021E74FC101BE5B5FCFFEBFC0087E510011BE5434F4BE20073 +S219021E891099E50420A0E16E2B00EB10011BE5001099E50420C3 +S219021E9EA0E17F2A00EB006050E20450A0E11600000A0C411B24 +S219021EB3E50600A0E1B22B00EB0410A0E10030A0E134009FE5E1 +S219021EC80620A0E1861A00EB1D0000EA28009FE5831A00EB2170 +S219021EDD0000EA20009FE5801A00EB1E0000EA90510300B41C1A +S219021EF20300E81C03000C1D030060F80300341D0300341C039C +S219021F0700601C03004C309FE510011BE5001093E5002099E508 +S219021F1C0530A0E1AB2A00EB006050E20700000A0C411BE5063D +S219021F3100A0E1932B00EB0410A0E10030A0E11C009FE506205E +S219021F46A0E1671A00EB10011BE5001099E50520A0E1F02A0033 +S219021F5BEB010000EA90510300541D0300F0AF1BE90DC0A0E14B +S219021F70F0D82DE904B04CE254D04DE20040A0E30070A0E14C42 +S219021F85504BE254400BE50500A0E15C400BE550304BE2003050 +S219021F9A8DE554204BE204208DE50160A0E128319FE56610A0AD +S219021FAFE308308DE50120A0E30430A0E15F1D00EB58304BE214 +S219021FC400308DE55C204BE204208DE534004BE200319FE56C9E +S219021FD910A0E308308DE50120A0E30430A0E1541D00EB0220D8 +S219021FEEA0E314008DE8E4309FE50700A0E10C308DE50610A047 +S219022003E108408DE50530A0E1571D00EB040050E10200001AC0 +S219022018C4009FE583FCFFEB460000EA54301BE5000053E3020F +S21902202D00000A5C301BE5000053E30200001AA4009FE57AFC11 +S219022042FFEB3D0000EA50001BE5DF2900EB005050E2060000A6 +S2190220571A50001BE558301BE5030080E0010040E2D82900EB09 +S21902206C005050E20D00000A50401BE50500A0E1412B00EB0052 +S21902208120A0E160009FE50410A0E1161A00EB58009FE55830AA +S2190220969FE558C09FE5001093E500209CE5101A00EB240000AC +S2190220ABEA50101BE558301BE50100A0E1031081E0011041E21D +S2190220C0870B00EB000050E30C00000A28009FE5051A00EB196F +S2190220D50000EA841A0300781D0300FC150300141B0300801DE9 +S2190220EA0300741B0300941B03008051030084510300941D0333 +S2190220FF0050001BE558101BE560204BE2E42900EB005050E2E6 +S2190221140900000A60401BE50500A0E1182B00EB0410A0E100B3 +S21902212930A0E108009FE50520A0E1EC1900EB000000EA341D8C +S21902213E0300F0A81BE90DC0A0E1F0D82DE904B04CE254D04D67 +S219022153E20040A0E30070A0E14C504BE254400BE50500A0E107 +S2190221685C400BE550304BE200308DE554204BE204208DE50148 +S21902217D60A0E1FC309FE56610A0E308308DE50120A0E304303A +S219022192A0E1E91C00EB58304BE200308DE55C204BE204208D0F +S2190221A7E534004BE2D4309FE56C10A0E308308DE50120A0E301 +S2190221BC0430A0E1DE1C00EB0220A0E314008DE8B8309FE507CC +S2190221D100A0E10C308DE50610A0E108408DE50530A0E1E11CBF +S2190221E600EB040050E10200001A98009FE50DFCFFEB3A000058 +S2190221FBEA54301BE5000053E30200000A5C301BE5000053E356 +S2190222100200001A78009FE504FCFFEB310000EA50001BE569DC +S2190222252900EB005050E20600001A50001BE558301BE503000C +S21902223A80E0010040E2622900EB005050E21600000A50401B42 +S21902224FE50500A0E1CB2A00EB0020A0E134009FE50410A0E13A +S219022264A01900EB2C009FE52C309FE52CC09FE5001093E50032 +S219022279209CE59A1900EB180000EA841A0300781D0300FC15BE +S21902228E0300141B0300801D0300741B0300941B030080510347 +S2190222A3008451030050001BE558101BE560204BE2192A00EBB4 +S2190222B8005050E20900000A60401BE50500A0E1AE2A00EB0488 +S2190222CD10A0E10030A0E108009FE50520A0E1821900EB0000FB +S2190222E200EAC81D0300F0A81BE90DC0A0E1F0D82DE904B04C46 +S2190222F7E254D04DE20040A0E30070A0E14C504BE254400BE595 +S21902230C0500A0E15C400BE550304BE200308DE554204BE204AF +S219022321208DE50160A0E1FC309FE56610A0E308308DE50120B8 +S219022336A0E30430A0E17F1C00EB58304BE200308DE55C204BAF +S21902234BE204208DE534004BE2D4309FE56C10A0E308308DE56C +S2190223600120A0E30430A0E1741C00EB0220A0E314008DE8B8A7 +S219022375309FE50700A0E10C308DE50610A0E108408DE50530DC +S21902238AA0E1771C00EB040050E10200001A98009FE5A3FBFF2E +S21902239FEB3A0000EA54301BE5000053E30200000A5C301BE5C1 +S2190223B4000053E30200001A78009FE59AFBFFEB310000EA50D5 +S2190223C9001BE5FF2800EB005050E20600001A50001BE558306C +S2190223DE1BE5030080E0010040E2F82800EB005050E2160000BA +S2190223F30A50401BE50500A0E1612A00EB0020A0E134009FE5DF +S2190224080410A0E1361900EB2C009FE52C309FE52CC09FE500E9 +S21902241D1093E500209CE5301900EB180000EA841A0300781D0E +S2190224320300FC150300141B0300801D0300741B0300941B0361 +S21902244700805103008451030050001BE558101BE560204BE268 +S21902245CFB2900EB005050E20900000A60401BE50500A0E14456 +S2190224712A00EB0410A0E10030A0E108009FE50520A0E1181991 +S21902248600EB000000EAE81D0300F0A81BE90DC0A0E1F0DF2D77 +S21902249BE904B04CE218D04DE20060A0E300608DE52C304BE205 +S2190224B004308DE50120A0E308208DE55C319FE50C308DE5026B +S2190224C52082E00630A0E1271C00EB060050E10200001A4401FC +S2190224DA9FE553FBFFEB6D0000EA3C319FE53C519FE53C419FB5 +S2190224EFE5001093E5002095E50680A0E1000094E5019062E077 +S2190225040910A0E14A1700EB006094E50270A0E3026C86E2052C +S219022519A0A0E1010000EA017087E2016C86E200309AE5230415 +S21902252E57E10D00002A0030D6E5FF0053E3F7FFFF0A2C001BBC +S219022543E50610A0E10B1900EB000050E3F2FFFF1AD8009FE558 +S2190225582C101BE53D1B00EB000050E34C00000A0180A0E3005B +S21902256D0058E30300001ABC009FE52C101BE5DA1800EB45005C +S21902258200EA100096E530404BE2181096E50420A0E1C22800F9 +S219022597EB005050E20470A0E10700000A30401BE50500A0E1BF +S2190225ACF52900EB0410A0E10030A0E17C009FE50520A0E1C955 +S2190225C11800EB0900A0E100109AE50720A0E19E2900EB060082 +S2190225D6A0E1FF10A0E3012CA0E3481700EB0900A0E100109AA8 +S2190225EBE50720A0E1AB2800EB005050E21000000A30401BE57D +S2190226000500A0E1DF2900EB0410A0E10030A0E124009FE50552 +S21902261520A0E1B31800EB170000EA0C1E0300141B030084511D +S21902262A03008851030090510300181E03002C1E0300341D03F7 +S21902263F004C309FE5001093E50900A0E100209AE50730A0E116 +S219022654DE2800EB005050E20700000A30401BE50500A0E1C62A +S2190226692900EB0410A0E10030A0E11C009FE50520A0E19A1803 +S21902267E00EB0900A0E100109AE50720A0E1232900EB0100005C +S219022693EA90510300541D0300F0AF1BE90DC0A0E1F0D82DE91A +S2190226A804B04CE250D04DE20040A0E30070A0E14C504BE25414 +S2190226BD400BE50500A0E158400BE550304BE200308DE5542000 +S2190226D24BE204208DE50160A0E1E4309FE56210A0E308308DF5 +S2190226E7E50120A0E30430A0E1921B00EB58304BE200308DE5AA +S2190226FC34004BE2C4309FE56310A0E308308DE50420A0E104A0 +S219022711408DE50230A0E3881B00EB0220A0E300208DE55C30F4 +S2190227264BE204308DE50110A0E308108DE594309FE50700A0B7 +S21902273BE10C308DE50610A0E10530A0E1881B00EB040050E1E3 +S2190227500200001A78009FE5B4FAFFEB3D0000EA5C001BE58CAE +S219022765FAFFEB005050E20300001A60009FE55C101BE55B1812 +S21902277A00EB350000EA54301BE5000053E31430950550300B16 +S21902278F0544209FE550001BE5003092E5030050E10500003AD7 +S2190227A434309FE518C095E5001093E50C2080E0010052E10A8D +S2190227B900003A20009FE5491800EB230000EA441E0300601EEA +S2190227CE03000C1E0300141B03002C1E030058F80300C4F7032F +S2190227E300741E0300101095E50C20A0E1901600EB50001BE51D +S2190227F84C309FE51C2095E5201095E5002083E551FAFFEB5850 +S21902280D301BE50040A0E1000053E30200000A2C009FE50410B8 +S219022822A0E1301800EBFC1095E5000051E30800000A010054C5 +S219022837E10600000A10009FE50420A0E1281800EB020000EA44 +S21902284C60F803008C1E0300A01E0300F0A81BE90DC0A0E1F0CD +S219022861D92DE944209FE504D04DE2004092E504B04CE20000E8 +S21902287654E32700001A30809FE50118A0E3000098E50130A0B0 +S21902288BE3003082E5010840E2B82700EB001050E20600000A70 +S2190228A010009FE5101800EB0400A0E11B0000EA6C360300C482 +S2190228B5F70300E41E030060709FE560609FE50100A0E15C4052 +S2190228CA9FE50710A0E10620A0E1D12700EB50509FE50400A084 +S2190228DFE10510A0E1DE2700EB44009FE5001097E5002096E587 +S2190228F400C094E5003095E500C08DE5F91700EB003094E5000F +S2190229092098E524109FE5013883E2022063E0002081E50100D3 +S21902291EA0E3050000EA8051030084510300885103008C5103C3 +S21902293300101F030090510300F0A91BE90DC0A0E130D82DE969 +S21902294804B04CE20050A0E1010055E30140A0E1020000CA48B1 +S21902295D009FE532FAFFEB30A81BE9BBFFFFEB000050E30C0005 +S219022972000A34009FE534109FE5042094E59B1A00EB00305002 +S219022987E20400000A0500A0E10410A0E10FE0A0E10CF093E545 +S21902299C30A81BE910009FE521FAFFEB30A81BE9401F0300E488 +S2190229B1390300743A0300541F03000DC0A0E1F0DD2DE904B0C2 +S2190229C64CE24BDF4DE20040A0E10150A0E10330D4E502A0A0AD +S2190229DBE1000053E31000000A131E4BE20100D4E50120A0E3F3 +S2190229F0040080E2000084E0040200EB0220D4E5000052E302FE +S219022A0500000A30311BE5000053E36500000A000052E302006E +S219022A1A001A30311BE5000053E36000001A0320D4E500005544 +S219022A2FE30130D4E5022084E0043083E2037082E00300000ABD +S219022A44B8039FE50510A0E1A61700EB020000EAA8039FE504DA +S219022A591084E2A21700EB0080D4E5013048E2050053E303F184 +S219022A6E9F97490000EA8C2A0200BC2A0200302B0200382B0281 +S219022A8300DC2A0200F42A02004D0F4BE20710A0E10420A0E347 +S219022A98E61500EB64239FE534311BE560139FE560039FE500EE +S219022AAD0053E30210A0018C1700EB370000EA4E0F4BE20710D4 +S219022AC2A0E10420A0E3DA1500EB40039FE538111BE58417004B +S219022AD7EB2F0000EA0700A0E1E12500EB0010A0E120039FE52E +S219022AEC7E1700EB290000EA0050A0E318439FE50510D7E704B2 +S219022B0100A0E1781700EB040055E30100008A04039FE57417E0 +S219022B1600EB015085E2050055E3F5FFFF9AF4029FE56F170036 +S219022B2BEB1A0000EAEC029FE51B0000EAE8029FE50750A0E1E2 +S219022B40691700EB0030D7E50740A0E1000053E31100000AD039 +S219022B55629FE50030D5E50A0053E30200000A0130F4E50A0034 +S219022B6A53E3FCFFFF1A0600A0E10030A0E30030C4E50510A03D +S219022B7FE1591700EB0A30A0E30130C4E40450A0E10030D5E5A9 +S219022B94000053E3EEFFFF1A00005AE30300000A7C029FE54F4E +S219022BA91700EB0200A0E3A30000EA040058E31500000A494F06 +S219022BBE4BE20400A0E1011CA0E30A20A0E1AA1800EB00005001 +S219022BD3E30000E0E30460A0E1980000BA0600A0E1551700EB2B +S219022BE8000050E3EEFFFF0AFF30E0E324204BE20330D2E72E2B +S219022BFD0053E30A00A0018E00000A5E0053E30300A0038B007E +S219022C12000A013048E2050053E303F19F97860000EA3C2C0202 +S219022C2700882C0200382E02006C2D0200CC2C0200082D0200A7 +S219022C3C4D0F4BE20710A0E10420A0E37A1500EB490F4BE24F66 +S219022C514F4BE20410A0E1561B00EB000050E36500000A342103 +S219022C661BE53C311BE5030052E1CDFFFF0A0700A0E10410A09E +S219022C7BE10420A0E36C1500EB6D0000EA4E0F4BE20710A0E1D0 +S219022C900420A0E3671500EB490F4BE2054D4BE20410A0E10081 +S219022CA520A0E30230A0E1E91A00EB000050E35000000A3821E9 +S219022CBA1BE540311BE5030052E1EAFFFF1AB7FFFFEA510F4B0B +S219022CCFE20710A0E10420A0E3561500EB490F4BE2524F4BE21F +S219022CE40410A0E1112500EB000050E34100000A44211BE548F3 +S219022CF9311BE5030052E1DBFFFF1AA8FFFFEA4B4F4BE204000A +S219022D0EA0E10710A0E10620A0E3461500EB0050A0E304A0A08A +S219022D23E1534F4BE2493F4BE250310BE5156E4BE2E0809FE52A +S219022D380410A0E10620A0E150011BE50830A0E1C21A00EB0072 +S219022D4D0050E32500000A0030D4E50530C7E7015085E205007F +S219022D6255E3F3FFFF9A340000EABC009FE50750A0E1DC16006A +S219022D77EB496F4BE2B0709FE5090000EA0030D6E50640A0E127 +S219022D8C000053E30300000A0130C5E40130F4E5000053E3FBD3 +S219022DA1FFFF1A0A30A0E30130C5E40040A0E30040C5E50700B3 +S219022DB6A0E1CB1600EB0600A0E1011CA0E30420A0E12B1800A5 +S219022DCBEB040050E10000E0E31A0000BA0600A0E1D71600EBD6 +S219022DE0040050E1E6FFFF1A140000EA0700A0E10A10A0E1067D +S219022DF520A0E30E1500EB0400A0E30F0000EAE81F0300FC1F6C +S219022E0A0300F41F0300F01F0300042003000C200300142003F4 +S219022E1F00182003001C20030020200300242003002C20030044 +S219022E345820030008009FE5AA1600EB0100A0E3000000EA1C46 +S219022E49200300F0AD1BE90DC0A0E100D82DE9031081E22111C5 +S219022E5EA0E10130A0E1011041E204B04CE200E0A0E10000A00E +S219022E73E300C0A0E1000053E1090000DA0120A0E1011041E232 +S219022E8804309EE40F005CE3133C83E1030020E001C08C120015 +S219022E9DC0A003000052E3F5FFFFCA00A81BE90DC0A0E100D8F2 +S219022EB22DE9010040E204B04CE2050050E300F19F970C00007E +S219022EC7EAE02E0200E02E0200F02E0200F82E0200E02E02008D +S219022EDCE82E02000400A0E300A81BE90800A0E300A81BE90058 +S219022EF100A0E300A81BE9020CA0E300A81BE90DC0A0E1F0DF3C +S219022F062DE904B04CE242DE4DE20CD04DE20080A0E30070A04A +S219022F1BE101A0A0E14DFEFFEB60919FE5080050E16B00000A3F +S219022F30426E4BE2086046E20600A0E14C519FE5012BA0E305BC +S219022F4510A0E1BA1400EB433E4BE2083043E20C3043E200308A +S219022F5A8DE5434E4BE204808DE5084044E224319FE508404462 +S219022F6FE2008083E50400A0E118319FE56C10A0E308308DE581 +S219022F840820A0E10230A0E36B1900EB0120A0E304018DE8FC4A +S219022F99309FE50700A0E10C308DE50A10A0E108808DE5043069 +S219022FAEA0E16E1900EB080050E105A0A0E14700000A08508A82 +S219022FC3E2FE3F8AE2030055E13D00002A0830DAE5080053E194 +S219022FD83A00000A0000D5E50070A0E3B0FFFFEB0120D5E5ACCC +S219022FED409FE50330D5E5002082E0043083E2036082E0000037 +S21902300200EA184084E2090054E10500000A000094E5041085AB +S219023017E2571600EB000050E3F7FFFF1A047094E50500A0E1AE +S21902302C44241BE50710A0E160FEFFEB010080E2050050E300A5 +S219023041F19F97190000EA60300200C8300200783002007C3067 +S219023056020084300200A83002000A00A0E1421E4BE20810415B +S21902306BE2012BA0E3701400EB190000EA0180A0E3065085E087 +S2190230800A0000EA18509FE5080000EAE43B03009451030064F4 +S219023095F803005C200300FC150300243B03009C510300280017 +S2190230AA9FE50E1600EB24309FE5030055E10200002A0030D535 +S2190230BFE5000053E3C4FFFF1A000058E30300000A030000EBC8 +S2190230D4010000EA742003008C550300F0AF1BE90DC0A0E1F099 +S2190230E9DF2DE9A8309FE5FF1FA0E3A4209FE504B04CE2A0709F +S2190230FE9FE5019BA0E3009087E504D04DE2043087E5F82387D2 +S219023113E50700A0E14CFFFFEBFC0387E580409FE580309FE51B +S219023128001094E5002093E578009FE5816042E0461800EB0022 +S21902313D0050E30480A0E13000000A0600A0E12C404BE20010D4 +S21902315298E50420A0E1BC2600EB0600A0E1001098E50420A09A +S219023167E1CD2500EB005050E204A0A0E10F00000A2C401BE562 +S21902317C0500A0E1002700EB0410A0E10030A0E120009FE505B0 +S21902319120A0E1D41500EB150000EACEFAAD0BADDEADDE945133 +S2190231A60300885103008451030088200300BC1803000600A02E +S2190231BBE10710A0E10920A0E10A30A0E1012600EB005050E286 +S2190231D00700000A2C401BE50500A0E1E92600EB0410A0E10051 +S2190231E530A0E118009FE50520A0E1BD1500EB0600A0E1001087 +S2190231FA98E50A20A0E1462600EB000000EAB4200300F0AF1BBF +S21902320FE90DC0A0E1F0DD2DE908319FE504B04CE20080A0E1E9 +S2190232240160A0E1003093E502A0A0E1000053E30100001A038D +S21902323900A0E1F0AD1BE9E4509FE53F3E85E2030055E1300052 +S21902324E002A0000D5E514FFFFEB01C0D5E5041085E20320D595 +S219023263E500E08CE00800A0E1043082E203708EE0022085E095 +S21902327804C08CE20C4082E0BD1500EB000050E31D00001A0033 +S21902328D30D5E50A0053E11500001A01304AE2050053E303F142 +S2190232A29F97100000EAC0320200C0320200FC320200E83202AC +S2190232B700C0320200D43202000600A0E10410A0E10420A0E33C +S2190232CCD91300EB090000EA0600A0E10410A0E10620A0E3D483 +S2190232E11300EB040000EA004086E5020000EA38009FE508107A +S2190232F6A0E17B1500EB0100A0E3F0AD1BE928309FE5075085E3 +S21902330BE0030055E1CEFFFF3A1C009FE50810A0E1721500EBDC +S2190233200000A0E3F0AD1BE9945503009C510300E02003008C02 +S2190233355503000C2103000DC0A0E1F0D92DE904B04CE2007075 +S21902334AA0E10080A0E378519FE50030D5E5000053E34B00002B +S21902335F1A006097E50600A0E1741500EB014080E2100097E532 +S219023374CCFEFFEB043088E0040080E2082097E5008083E00000 +S2190233890052E30400000A0200A0E1691500EB010080E2008016 +S21902339E88E0000000EA0200A0E13F0E58E34200008A0140C5E4 +S2190233B3E50300C5E51030D7E50030C5E50C20D7E50220C5E5E2 +S2190233C80020D6E5045085E2000052E30500000A0030D5E50223 +S2190233DD3083E00130C5E40120F6E5000052E3F9FFFF1A0030F5 +S2190233F2A0E30130C5E4030050E10B00000A086097E50020D63F +S219023407E5030052E10500000A0030D5E5023083E00130C5E426 +S21902341C0120F6E5000052E3F9FFFF1A0030A0E30130C5E410B5 +S2190234313097E5013043E2050053E303F19F970E0000EA5C3490 +S21902344602005C34020080340200803402005C34020070340232 +S21902345B000500A0E1141087E20420A0E3721300EB030000EA3E +S2190234700500A0E1141087E20620A0E36D1300EB100097E58805 +S219023485FEFFEB0100A0E3F0A91BE90000D5E584FEFFEB0120DB +S21902349AD5E50330D5E5002082E0043083E2034082E0045085D6 +S2190234AFE0048088E03F0E58E3A5FFFF3A10009FE5001097E5B0 +S2190234C4081500EB0000A0E3F0A91BE99C510300302103000D73 +S2190234D9C0A0E170D82DE90010A0E370409FE5012BA0E36C5006 +S2190234EE9FE504B04CE268609FE50400A0E1811300EB060055B1 +S219023503E10600000A0500A0E18AFFFFEB000050E30F00000A76 +S219023518185085E2060055E1F8FFFF1A3C209FE5013BA0E300DD +S21902352D3084E5042084E530309FE50400A0E1F83384E5FF1F41 +S219023542A0E341FEFFEBFC0384E51C209FE50130A0E300308233 +S219023557E570A81BE994510300243B0300E43B0300CEFAAD0B6B +S21902356CADDEADDE945503000DC0A0E170D82DE98C609FE50025 +S21902358130A0E388509FE504B04CE2003086E504D04DE200306F +S21902359685E5AFFCFFEB000050E33800000A6C309FE56C009F7A +S2190235ABE56C409FE5001090E5012BA0E300C093E50400A0E1FE +S2190235C08C1041E01B1300EB0400A0E1FF1FA0E31EFEFFEBFCF1 +S2190235D53394E5030050E10700001A042094E538309FE503004D +S2190235EA52E10300001AF82394E52C309FE5030052E10B0000C0 +S2190235FF0A24009FE5B81400EBB2FFFFEB1D0000EA94550300B9 +S21902361464F80300885103008451030094510300CEFAAD0BAD72 +S219023629DEADDE482103001C104BE23C009FE50120A0E3F3FE02 +S21902363EFFEB1C301BE5000053E30700000A0510A0E124009F9A +S219023653E50420A0E3ECFEFFEB1C009FE51C109FE50220A0E306 +S219023668E8FEFFEB0130A0E3003086E5030000EA801F03009800 +S21902367D1F0300D41F0300C8F7030070A81BE90DC0A0E100D815 +S2190236922DE9803260E0030180E0000180E014209FE50002A0F5 +S2190236A7E1483092E504B04CE20FE0A0E103F0A0E100A81BE9C5 +S2190236BC500000000DC0A0E1F0DF2DE90010A0E304B04CE26199 +S2190236D1DF4DE2A4110BE598010BE5042090E59C210BE5A011AA +S2190236E60BE5007092E50130A0E3A8310BE5120F00EB1A0F003F +S2190236FBEB100F00EB042097E5010052E30500000AA8111BE520 +S219023710040052E30030A0130130A003014013E0A400000A00CB +S21902372530A0E3A8310BE5040052E30200000A0700A0E104102B +S21902373AA0E3042400EB043097E5040053E30300000ACC029F79 +S21902374FE5651400EBA8011BE5BB0000EA0700A0E1013CA0E37F +S21902376490310BE52010A0E3A8311BE5632F4BE294310BE56533 +S2190237794F4BE200408DE5193E4BE2CC2200EB000050E363AF64 +S21902378E4BE20700000A88329FE528104BE2F32091E1410F5217 +S2190237A3E30200000A78029FE54E1400EBD0FFFFEA0700A0E190 +S2190237B80030A0E394310BE51510A0E3653F4BE200308DE50A68 +S2190237CD20A0E1193E4BE2B82200EB000050E31B00000A628FAD +S2190237E24BE20840A0E10130D4E438929FE5000053E302000066 +S2190237F70A0130D4E4000053E3FCFFFF1A0460A0E10130D4E4AB +S21902380C000053E3FCFFFF1A0450A0E10130D4E4000053E3FC66 +S219023821FFFF1AA4111BE5000051E30100000AF8019FE52C14C2 +S21902383600EB0900A0E10610A0E10820A0E100408DE50530A03A +S21902384BE1261400EB0700A0E11A10A0E30050A0E394510BE57E +S219023860653F4BE200308DE50A20A0E1193E4BE2912200EB0507 +S2190238750050E10800000A0A00A0E190111BE58C204BE2662366 +S21902388A00EB8C301BE5A0111BE5050050E10310A011A0110B14 +S21902389FE5A0211BE5000052E392FFFF0A0510A0E17C519FE5B1 +S2190238B407CDA0E30500A0E1083097E5813083E00C20D3E7016C +S2190238C920C0E7011081E2050051E3F8FFFFDA0700A0E10030E7 +S2190238DEA0E394310BE51B10A0E3653F4BE200308DE50A20A0AB +S2190238F3E1193E4BE26F2200EB000050E32900000A0A00A0E1E7 +S21902390890111BE574204BE20A2300EB000050E32000000A9C30 +S21902391D111BE570201BE5003091E5101093E5024081E09C214F +S2190239321BE5044082E5A0111BE574205BE50700A0E188220017 +S219023947EB1F30D4E51F30C4E50720D4E5800012E30200001A08 +S21902395C0730D4E5800013E3FCFFFF0A98111BE5003091E50195 +S21902397100A0E1242093E50510A0E10FE0A0E100F092E59C21D3 +S2190239861BE5343092E50140A0E30C4083E5730E00EB0400A0C2 +S21902399BE12A0000EA90009FE5D01300EB52FFFFEA88009FE5F3 +S2190239B0CD1300EB4FFFFFEA050052E30200001A78009FE5C8DF +S2190239C51300EB4AFFFFEA650E00EB3200A0E32CFFFFEBA431B9 +S2190239DA1BE5000053E30100001A58009FE5BF1300EBA4111B17 +S2190239EFE550009FE5011081E2A4110BE5BA1300EBA4211BE56D +S219023A040400A0E10A0052E30E00000A0700A0E16D0400EB499D +S219023A190E00EB35FFFFEA8C2103009EFEFFFFA8210300C42180 +S219023A2E0300C0210300B4360300D4210300E82103000422037B +S219023A43002422030044220300F0AF1BE90DC0A0E170D82DE966 +S219023A580040A0E1086094E5045096E504B04CE22B2300EB00C6 +S219023A6D00A0E31C2300EB000085E5344085E50600A0E10EFFB4 +S219023A82FFEB70A81BE90DC0A0E100D82DE904B04CE204C090B0 +S219023A97E504109CE52130A0E30030C1E5FF20A0E30720C1E580 +S219023AAC213043E20F30C1E530308CE500A81BE90DC0A0E130A8 +S219023AC1D82DE9044090E504B04CE204C094E52130A0E300301F +S219023AD6CCE54820A0E30E20CCE50000A0E30B00CCE50A00CC44 +S219023AEBE5013043E20C30CCE5462042E20D20CCE5203083E27A +S219023B000430CCE5180084E5140084E5083084E50150A0E12C27 +S219023B150084E55010A0E30110CCE53F3083E20330CCE57E2030 +S219023B2A82E20220CCE5303043E2103084E57F2082E20720CC24 +S219023B3FE5103043E20F30CCE59F2042E20020CCE500E0A0E11B +S219023B5401208CE20710CCE50E30D5E70E30C2E701E08EE205C7 +S219023B69005EE3FAFFFFDA2230A0E30030CCE50020A0E30D20A7 +S219023B7ECCE51E3043E20C30CCE5012082E2302084E530A81BE9 +S219023B93E90DC0A0E100D82DE9010C51E20100A01304B04CE21B +S219023BA800A81BE90DC0A0E100D82DE9042090E504B04CE2148A +S219023BBD3092E50000A0E3000053E10200000A183092E50000C3 +S219023BD253E10000001A0100A0E300A81BE90DC0A0E100D82D06 +S219023BE7E904B04CE204C090E504009CE52230A0E30030C0E58F +S219023BFC0520C0E54224A0E10620C0E50410C0E5043083E200DF +S219023C1130C0E50120A0E32C208CE500A81BE90DC0A0E1F0DF98 +S219023C262DE904B04CE20090A0E10380A0E13F0058E30440991E +S219023C3BE50850A0C14050A0D304309BE50160A0E1087094E545 +S219023C5002A0A0E1040094E5400057E30400001A147084E51C17 +S219023C653084E5245084E54830A0E3030000EA187084E52030A4 +S219023C7A84E5285084E54030A0E3083084E52230A0E30030C08B +S219023C8FE50A50C0E54534A0E10B30C0E50020A0E30820C0E5EB +S219023CA402E0A0E10970C0E54030A0E30730C0E5122082E2001E +S219023CB920C0E50A005EE10F0000AA8E31A0E1062083E004C09B +S219023CCE92E501E08EE2061093E70C20A0E101C04CE200005294 +S219023CE3E3F4FFFFDA0C20A0E10130D1E401C04CE21030C0E5AF +S219023CF8000052E3F9FFFFCAEDFFFFEA050058E1040000AA00F9 +S219023D0D30A0E305E068E01030C0E501E05EE2FCFFFF1A2C2054 +S219023D2294E50730D0E5400013E3FCFFFF0A000052E3080000A9 +S219023D371A143094E5030057E10130A0030230A0130C3084E500 +S219023D4C0900A0E10710A0E10520A0E1A0FFFFEBF0AF1BE90D5A +S219023D61C0A0E170D82DE904D04DE20060A0E1045096E50440B0 +S219023D7695E50C20D4E56230A0E30030C4E50710D4E540304361 +S219023D8BE20030C4E504B04CE22A0000EA0430A0E30000A0E331 +S219023DA00A30C4E50B00C4E5800052E30800C4E55020A00309EE +S219023DB520C4E5103095E5020053E10200001A013041E2033096 +S219023DCAC4E5210000EA0010A0E11C004BE2102085E54030A0A5 +S219023DDFE30730C4E50A20A0E30020C4E51030D4E50130C0E7BE +S219023DF4011081E2030051E3FAFFFF9A19305BE51A105BE5067D +S219023E0900A0E1002096E5031481E124C092E5041041E20FE087 +S219023E1EA0E104F09CE51B305BE5013043E20330C4E56220A0B3 +S219023E33E30020C4E50710D4E52230A0E30030C4E50320D4E56D +S219023E48FF1001E2012082E2010052E1CFFFFF1A70A81BE90DA3 +S219023E5DC0A0E170D82DE904B04CE200C0A0E30C40A0E1026056 +S219023E72A0E1040090E5060054E104E090E50150A0E1060000CE +S219023E87AA0520A0E106C0A0E1043092E501C05CE2034084E037 +S219023E9C082082E2FAFFFF1A2230A0E30030CEE50A40CEE54473 +S219023EB134A0E10B30CEE50420A0E30820CEE51010D0E500C03B +S219023EC6A0E30910CEE54030A0E30730CEE5062082E20020CE3C +S219023EDBE506005CE10F0000AA8C31A0E1051093E701008CE2AE +S219023EF0000051E3053083E00600000A042093E5000052E30306 +S219023F0500000A1030DEE50130C1E4012052E2FBFFFF1A00C095 +S219023F1AA0E106005CE1EFFFFFBA70A81BE90DC0A0E170D82D41 +S219023F2FE90050A0E1044095E5043094E50C2094E504B04CE2CA +S219023F440410D3E5010052E30300001A1C6094E50030A0E31486 +S219023F593084E5020000EA206094E50030A0E3183084E5141046 +S219023F6E94E50030A0E32C3084E5030051E10500000A2420942A +S219023F83E50500A0E114FFFFEB0130A0E30C3084E5090000EA6E +S219023F98181094E5000051E30500000A282094E50500A0E10BD7 +S219023FADFFFFEB0230A0E30C3084E5000000EA0C1084E5050041 +S219023FC2A0E1003095E50610A0E124C093E50020A0E30FE0A093 +S219023FD7E108F09CE570A81BE90DC0A0E100D82DE904B04CE23A +S219023FEC00A81BE90DC0A0E1F0D82DE90060A0E1047096E5040D +S2190240015097E52230A0E30030C5E50720D5E504B04CE2FF4026 +S21902401602E2100000EA0A0014E30200000A0600A0E10410A068 +S21902402BE1BDFFFFEB050014E30200000A0600A0E10410A0E1CE +S21902404046FFFFEB300014E30200000A0600A0E10410A0E1E105 +S219024055FFFFEB0730D5E5FF4003E2000054E30300000A0740C6 +S21902406AC5E5303097E5000053E3E8FFFF1A000097E5B9210028 +S21902407FEBF0A81BE90DC0A0E100D82DE9043090E5002093E521 +S21902409404B04CE2200092E500A81BE90DC0A0E100D82DE91C93 +S2190240A9209FE5083090E5030093E8030082E804B04CE20C10C1 +S2190240BE9FE50130A0E3003081E500A81BE99C55030098550388 +S2190240D3000DC0A0E1F0DF2DE904B04CE245DF4DE20070A0E178 +S2190240E8D0504BE20500A0E1FC304BE200308DE5012C4BE20490 +S2190240FD208DE50160A0E174339FE56E10A0E308308DE501203C +S219024112A0E30030A0E3081500EB413F4BE200308DE5422F4B48 +S219024127E204208DE5B8004BE24C339FE57410A0E308308DE56B +S21902413C0120A0E30030A0E3FD1400EB433F4BE200308DE511B2 +S2190241512E4BE204208DE5A0004BE224339FE56910A0E3083085 +S2190241668DE50120A0E30230A0E1F21400EB453F4BE200308D15 +S21902417BE5462F4BE204208DE588004BE2FC329FE56810A0E3A9 +S21902419008308DE50120A0E30230A0E1E71400EB473F4BE20079 +S2190241A5308DE5122E4BE204208DE570004BE2D4329FE56C10B6 +S2190241BAA0E308308DE50120A0E30030A0E3DC1400EB58004BE7 +S2190241CFE2493F4BE200308DE50040A0E3B0329FE57610A0E369 +S2190241E408308DE50420A0E104408DE50230A0E3D11400EB4AEB +S2190241F93F4BE200308DE54B2F4BE204208DE540004BE284323C +S21902420E9FE57210A0E308308DE50120A0E30430A0E1C614002E +S219024223EB0730A0E318008DE80700A0E164329FE50610A0E114 +S2190242380C308DE50120A0E308408DE50530A0E1C81400EB04DD +S21902424D0050E10200001A44029FE5A31100EBCB0000EA1031A9 +S2190242621BE5000053E30900000ADC304BE20C011BE50310A0FE +S219024277E1AD1F00EB000050E30800001A18029FE50C111BE583 +S21902428C961100EBBE0000EADC304BE20300A0E10420A0E30078 +S2190242A1129FE5E30F00EB18311BE5000053E31000000AE840CD +S2190242B64BE214011BE50410A0E19B1F00EB000050E3D4019FC9 +S2190242CBE50600000AE8004BE2F8404BE20410A0E11C1E00EBAE +S2190242E0000050E3060000AABC019FE514111BE57D1100EBA55B +S2190242F50000EAB0019FE57A1100EBA20000EA2C311BE500002F +S21902430A53E3FA3FA00328310B0520311BE5000053E34030A085 +S21902431F031C310B0500311BE5000053E30A30A003FC300B05A2 +S21902433408311BE5000053E3FA3FA00304310B05DC004BE2C70D +S2190243491F00EB0010A0E15C019FE500A0A0E3631100EBE80072 +S21902435E4BE2C11F00EB0010A0E148019FE55E1100EB44019FAF +S219024373E50A70A0E1981900EB660000EA012C4BE2BC3152E1E8 +S219024388084098E5083083E2BC30C8E10060A0E3045098E50866 +S21902439D30A0E30030C4E5017087E20160C4E50708A0E1B260F2 +S2190243B2C4E12008A0E1801900EBB600C4E10620A0E1BC10D877 +S2190243C7E10400A0E1DE1800EB0008A0E12008A0E1781900EBE5 +S2190243DCDC104BE2B200C4E10420A0E30C0085E2910F00EB10A0 +S2190243F10085E2E8104BE20420A0E38D0F00EB0140A0E30940E9 +S219024406C5E5BC00D8E16B1900EB0410A0E1B200C5E1F8204BBC +S21902441BE20800A0E1161800EB0800A0E1B91800EB7B1500EB41 +S21902443088209FE5006082E504311BE50060A0E1034086E002BC +S21902444550A0E1000000EAF51800EB003095E5000053E30200C6 +S21902445A001A6F1500EB040050E1F8FFFF3A6C1500EB0080A0CC +S21902446FE16A1500EB28311BE5034080E0110000EAAC2203001E +S219024484D0220300FC22030010230300202303003C23030050D8 +S21902449923030070230300742303009823030010390300B823CC +S2190244AE0300E42303000824030020240300A04002009855039D +S2190244C300D71800EB541500EB040050E1FBFFFF3A0900A0E1BD +S2190244D8EC104BE20420A0E3540F00EB003095E5000053E30AC0 +S2190244ED00000A24311BE501A08AE2000053E30600000A74305D +S2190245029FE5B600D3E12C1900EB0010A0E168009FE508206674 +S219024517E0F31000EBFC301BE5030057E10E0000AAEC504BE232 +S21902452C0500A0E14C409FE50420A0E30410A0E13D0F00EB0466 +S21902454100A0E1DC104BE20420A0E3390F00EB30009FE54E18D0 +S21902455600EB008050E20490A0E186FFFF1A2A1900EB1C009F10 +S21902456BE5FC201BE50A10A0E1DC1000EB040000EA9C550300DF +S2190245802824030010390300EA0500004C240300F0AF1BE90D72 +S219024595C0A0E100D82DE930309FE530009FE5001093E504B007 +S2190245AA4CE228C09FE50C3091E50C308CE50C3090E51020918A +S2190245BFE50C3081E510208CE5103090E5103081E500A81BE9B1 +S2190245D4BC36030020000200A45503000DC0A0E100D82DE91C60 +S2190245E9209FE51C109FE5000092E50C3091E50C3080E5102068 +S2190245FE91E504B04CE2102080E500A81BE9BC360300A4550317 +S219024613000DC0A0E130D82DE96C209FE504B04CE2003092E586 +S2190246280040A0E1000053E30500000A443094E5040053E30247 +S21902463D00001A003092E5383084E530A81BE940509FE50030AF +S21902465295E5013083E2003085E5010053E30000001ACAFFFF89 +S219024667EB28309FE5004083E5400400EB003095E5013043E299 +S21902467C003085E5000053E30000001AD4FFFFEB30A81BE9FCA3 +S219024691360300C455030008F703000DC0A0E130D82DE92430F6 +S2190246A69FE504B04CE220409FE50350A0E1030054E10300009F +S2190246BB3A0FE0A0E104F014E4050054E1FBFFFF2A30A81BE914 +S2190246D0FC3B0300FC3B03000DC0A0E100D82DE90030A0E1016C +S2190246E520A0E104B04CE20C009FE50310A0E15D0E00EB0000BC +S2190246FAA0E300A81BE9742403000DC0A0E100D82DE904B04C9E +S21902470FE2FEDEFFE700A81BE90DC0A0E110D82DE970209FE5DE +S21902472470309FE570109FE50040A0E3004082E5004083E564DB +S219024739209FE50130A0E3003081E55C309FE5004082E500407F +S21902474E83E5082082E20F32E0E3003082E504B04CE2CF00000F +S219024763EB40309FE5004083E50922A0E3004082E5030C00EB64 +S219024778101F11EE0F1081E3101F01EE101F11EE011A81E303A6 +S21902478D1081E3101F01EE10A81BE904000590080005900C0080 +S2190247A205901000049014000490100000900DC0A0E130D82DF7 +S2190247B7E90030A0E1010040E2000053E304B04CE21B0000DA1C +S2190247CC6C509FE500E0A0E3014040E2001095E5002095E501A6 +S2190247E10052E10300001A50309FE5002093E5010052E1FCFFA1 +S2190247F6FF0A09C2A0E300309CE5000053E30400000A012052E8 +S21902480BE000309C450320824002E08EE0010000EA023061E00D +S21902482003E08EE002005EE3EAFFFFDA0030A0E10400A0E100F0 +S2190248350053E3E4FFFFCA30A81BE9100000900DC0A0E100D8E3 +S21902484A2DE984309FE5002093E504B04CE2FF0812E31000A0DE +S21902485F130500001AFF0C12E30800A0130200001AFF0012E340 +S2190248741800A0030000A01358109FE558C09FE55230A0E1012E +S2190248890013E30C00000A0B0050E30700001A003091E50C20D6 +S21902489E03E05230A0E1010013E30300001A010080E21B005036 +S2190248B3E3F9FFFF9A00A81BE9200080E200A81BE9010080E238 +S2190248C8070010E3ECFFFF1A0000E0E300A81BE90000059018BA +S2190248DD00049000F8FF0F0DC0A0E100D82DE92A0050E30B0081 +S2190248F2A0C314109FE50120A0E3003091E504B04CE21230C36E +S219024907E1003081E500A81BE9040005900DC0A0E100D82DE99C +S21902491C2A0050E30B00A0C314109FE50120A0E3003091E504BE +S219024931B04CE2123083E1003081E500A81BE9040005900DC03E +S219024946A0E100D82DE90B3040E21F0053E304B04CE20400004E +S21902495B9A1F3000E20120A0E308109FE51223A0E1002081E5F9 +S21902497000A81BE9180004900DC0A0E100D82DE90B3040E21F1B +S2190249850053E304B04CE23400009A000051E31900000A0000D9 +S21902499A52E30B00000A1F1000E2BC009FE50120A0E300309002 +S2190249AFE51221A0E1B0109FE5023083E1003080E5003091E53E +S2190249C4023083E1003081E500A81BE91F1000E28C009FE501DD +S2190249D920A0E3003090E51221E0E180109FE5023003E000302D +S2190249EE80E5003091E5023003E0003081E500A81BE9000052F9 +S219024A03E30B00000A1F1000E254009FE50120A0E3003090E56D +S219024A181221A0E148109FE5023083E1003080E5003091E5021F +S219024A2D30C3E1003081E500A81BE91F1000E228009FE5012079 +S219024A42A0E3003090E51221A0E114109FE5023083E10030808E +S219024A57E5003091E50230C3E1003081E500A81BE910000490FC +S219024A6C140004900DC0A0E100D82DE904B04CE21CC09FE50008 +S219024A81309CE50030C3E1010000E0003083E100308CE5122448 +S219024A96A0E3003082E500A81BE9600100000DC0A0E100D82D8A +S219024AABE92C209FE5003092E528109FE5FF3F83E3003082E598 +S219024AC0003091E504B04CE2FF3F83E3003081E5102042E2FFC5 +S219024AD53FA0E3003082E500A81BE91C000490040004900DC0AB +S219024AEAA0E110D82DE90D40A0E110D09FE504B04CE20FE0A08E +S219024AFFE100F0A0E104D0A0E110A81BE9FCFFFF010DC0A0E1EF +S219024B1430D82DE9A4209FE5A4309FE504B04CE2001092E5005E +S219024B2940A0E1005093E5000051E30600001A0130A0E30030AF +S219024B3E82E53500A0E30120A0E11F0A00EB3500A0E3180A00AC +S219024B53EB0E33A0E3083084E5022CA0E30C2084E53E3383E2DA +S219024B68103084E50123A0E3142084E5033383E2183084E51CDC +S219024B7D2084E53530A0E3203084E5010515E30900001A34306D +S219024B929FE5002093E5010012E30200000A0430A0E30430847A +S219024BA7E530A81BE90130A0E3043084E530A81BE90030A0E351 +S219024BBC043084E530A81BE9C036030000000490600100000D69 +S219024BD1C0A0E100D82DE924309FE5002093E504B04CE2010541 +S219024BE612E30200001A0130A0E3043080E500A81BE90030A0D9 +S219024BFBE3043080E500A81BE9000004900DC0A0E100D82DE9A6 +S219024C10803260E0030180E0000180E014209FE50002A0E1484E +S219024C253092E504B04CE20FE0A0E103F0A0E100A81BE950000A +S219024C3A00000DC0A0E170D82DE9040051E304B04CE24CD04D2F +S219024C4FE20040A0E12900001A045094E5010055E32600001A1D +S219024C648300A0E38110A0E37FFFFFEB1E00A0E3E3FFFFEB83C2 +S219024C7900A0E30310A0E30230A0E3043084E50060A0E377FF5B +S219024C8EFFEB0500A0E1DBFFFFEB8300A0E30330A0E304308462 +S219024CA3E50510A0E170FFFFEB0500A0E3D4FFFFEB020000EAF0 +S219024CB80A00A0E3D1FFFFEB016086E2090056E30C0000CA04B4 +S219024CCD00A0E12010A0E30030A0E360300BE560204BE2002097 +S219024CE28DE55C304BE258204BE2721D00EB000050E3EFFFFF4C +S219024CF70A0430A0E3043084E570A81BE90DC0A0E100D82DE9EB +S219024D0C3500A0E304B04CE2A70900EB00A81BE90DC0A0E1F06C +S219024D21D82DE9E8209FE5E8109FE5022061E004B04CE2E070EB +S219024D369FE55CD04DE2004097E50400A0E13B0D00EB0E02A05E +S219024D4BE3021A80E2202090E4000031E1FCFFFF1A0000A0E38E +S219024D60160F07EE9A0F07EE101F11EE011AC1E3101F01EE0074 +S219024D7510A0E3151F07EE0000A0E10000A0E10000A0E10000E3 +S219024D8AA0E10000A0E10000A0E150504BE20500A0E10FE0A0A8 +S219024D9FE104F0A0E1101F11EE011A81E3031081E3101F01EE60 +S219024DB40560A0E140404BE20400A0E158109FE50320A0E32316 +S219024DC90F00EB000050E31400000A48009FE5C30E00EB343097 +S219024DDEA0E324308DE504E0A0E10F00BEE80DC0A0E10F00AC4D +S219024DF3E80F00BEE80F00ACE800309EE500308CE50F0096E883 +S219024E08FF0C00EB0800A0E3150000EA2CE0020064DF0200902B +S219024E1DF70300A4240300A82403000532A0E3143087E530C08B +S219024E32D5E52F10D5E52EE0D5E52D20D5E50C1481E18134A00B +S219024E47E10E2482E1012082E2083087E50114A0E10C2087E582 +S219024E5C910203E08330A0E1053283E2183087E5F0A81BE90D97 +S219024E71C0A0E110D82DE954309FE504B04CE20040A0E1033008 +S219024E8604E0000053E30E00000A40009FE50410A0E1930E00E4 +S219024E9BEB38309FE5033004E0000053E30100000A0400A0E345 +S219024EB010A81BE924009FE5000004E0000050E30200A01308AE +S219024EC500A00310A81BE90300A0E110A81BE97E007E00C8244A +S219024EDA030010001000200020000DC0A0E100D82DE934309F1A +S219024EEFE50020A0E3030050E104B04CE20100008A030051E149 +S219024F040400008A1C309FE5030050E10200008A030051E1003E +S219024F1900009A0120A0E30200A0E100A81BE944000200781140 +S219024F2E03000DC0A0E100D82DE90C309FE50F0000E20000D3A4 +S219024F43E704B04CE200A81BE9D42403000DC0A0E100D82DE9A6 +S219024F5820209FE5000092E504B04CE2000050E3010000CA32F0 +S219024F6D0600EB00A81BE90030E0E3003082E500A81BE9DC3643 +S219024F8203000DC0A0E100D82DE9FF0000E2613040E2050053E8 +S219024F97E30010A0E104B04CE20100008A570040E200A81BE9F8 +S219024FAC302040E2FF3002E2090053E30100008A0200A0E10017 +S219024FC1A81BE9413040E2050053E30100009A0000E0E300A854 +S219024FD61BE9370041E200A81BE90DC0A0E110D82DE90030A099 +S219024FEBE304B04CE214D04DE214304BE524404BE21C000BE5C1 +S219025000D2FFFFEBFF0000E20410A0E1020000EB010050E3F949 +S219025015FFFF1A10A81BE90DC0A0E170D82DE90140A0E11050DD +S21902502AD4E504B04CE2000055E30800001A240050E3280000F6 +S21902503F1A0130A0E31030C4E50C5084E5005084E5023043E2C9 +S219025054043084E5210000EA010055E31700001A230050E306D2 +S21902506900001A080094E50C1094E50030A0E30130C0E702204E +S21902507EA0E31020C4E5160000EA0C1094E5020B51E3030000E1 +S2190250931A0030A0E31030C4E50000E0E370A81BE9003094E5C3 +S2190250A8082094E5003083E0003084E50100C2E7013081E20CD5 +S2190250BD3084E5070000EA020055E30700001AFF0000E2ABFF67 +S2190250D2FFEB0002A0E1040084E50330A0E31030C4E50000A0A9 +S2190250E7E370A81BE9030055E32300001AFF0000E2A1FFFFEBCB +S2190250FC043094E50020D4E5003083E1043084E5030052E102A9 +S21902511100000A2D00A0E3BA0500EBDCFFFFEA2B00A0E3B705F0 +S21902512600EB082094E50230D2E53A0053E31000001A0000D28C +S21902513BE50C6094E5B00500EB083094E50100D3E5AD0500EBE7 +S2190251500500A0E1060050E10700008A0210E0E3083094E5006F +S21902516520D3E7033080E0010080E20120C3E7060050E1F8FF65 +S21902517AFF9A0100A0E370A81BE90000E0E30030A0E31030C466 +S21902518FE570A81BE90DC0A0E1F0D92DE904B04CE20070A0E103 +S2190251A468809FE52400A0E3950500EB0050A0E30540D7E7057C +S2190251B960A0E1050054E10700000A0400A0E18E0500EB01604A +S2190251CE86E2043085E00640D7E7FF5003E2000054E3F7FFFF60 +S2190251E31A2300A0E3860500EB2502D8E7840500EB0F3005E2FA +S2190251F80300D8E7810500EB52FFFFEB7F0000E22B0050E3E589 +S21902520DFFFF1AF0A91BE9D42403000DC0A0E1F0DF2DE9900012 +S2190252229FE50020A0E38C309FE504D04DE2002083E504B04C7E +S219025237E2001090E503A0A0E1020051E14B0000DA0090A0E166 +S21902524C6C809FE56C309FE5002093E5000052E31900000A00C6 +S2190252613090E554109FE5030053E30300009A003098E503001E +S21902527613E30440A0030800000A30209FE5003092E50140A0D1 +S21902528BE3040053E10300009A003091E5010013E30140A013BE +S2190252A00240A0032C004BE2001091E50420A0E1DB0700EB07B5 +S2190252B50000EAC8650300E0360300CC650300D465030000300A +S2190252CA98E50020D3E50140A0E32C204BE500309AE500005331 +S2190252DFE32400001A03C0A0E104005CE1150000AA2C604BE295 +S2190252F470E09FE50A70A0E16C509FE50600DCE700109EE52013 +S21902530932D5E70130C1E4002097E500108EE5000052E315005B +S21902531E001A0F3000E20320D5E70120C1E400309AE500108E46 +S219025333E5000053E30E00001A01C08CE204005CE1EDFFFFBA06 +S219025348002099E50900A0E1003098E5022064E0002089E5047C +S21902535D3083E0003088E5000052E3010000EAD0650300D424B4 +S2190253720300B5FFFFCAF0AF1BE90DC0A0E170D82DE904B04C50 +S219025387E268C09FE500108CE564109FE5000081E560009FE5B9 +S21902539C002080E55C209FE5000053E3003082E50C60A0E10AAC +S2190253B100000A4C409FE50050A0E3005084E5003094E593FFFF +S2190253C6FFEB002094E5003094E5050053E10200000A0500A0B5 +S2190253DBE170A81BE98CFFFFEB002096E50030A0E30030C2E51F +S2190253F0000096E570A81BE9D0650300CC650300C8650300D49A +S219025405650300E03603000DC0A0E1F0DF2DE924019FE52421E9 +S21902541A9FE504D04DE20070A0E3007082E504B04CE200309083 +S21902542FE50290A0E1070053E15A0000DA04319FE5002093E5A9 +S2190254440010D2E503A0A0E1070051E15400000AF0809FE5F0E6 +S219025459109FE5003091E5000053E31000000A003090E5030005 +S21902546E53E30300009A003098E5030013E30450A0030A0000A8 +S2190254830AB4209FE5003092E50150A0E3050053E10500009A58 +S219025498003098E5010013E30150A0130250A003000000EA0170 +S2190254AD50A0E30040A0E3050054E1170000AA84609FE50030BA +S2190254C296E50100D3E4003086E5ACFEFFEB0002A0E100309920 +S2190254D7E5FF7000E2000053E33000001A00309AE50100D3E49C +S2190254EC00308AE5A3FEFFEB000087E1003099E5FF7000E20013 +S2190255010053E32700001A2C304BE20370C4E7014084E20500C4 +S21902551654E1E8FFFFBA2C109FE5003091E5000053E3090000FF +S21902552B0A2C004BE2001098E50520A0E1470700EB060000EAA5 +S219025540C8650300E0360300CC650300D0650300D4650300005E +S2190255553098E50070C3E5003099E5000053E30F00001A303008 +S21902556A9FE5002093E50300A0E1003098E5022065E0002080D1 +S21902557FE5053083E0003088E5000052E3050000DA00309AE533 +S2190255940020D3E5000052E3000000EAC8650300ABFFFF1AF021 +S2190255A9AF1BE90DC0A0E170D82DE904B04CE25CC09FE5000005 +S2190255BE8CE558009FE5001080E554109FE5002081E550209F92 +S2190255D3E5000053E3003082E50060A0E10A00000A40409FE511 +S2190255E80050A0E3005084E5003094E584FFFFEB002094E5006C +S2190255FD3094E5050053E10200000A0500A0E170A81BE97DFF86 +S219025612FFEB000096E570A81BE9CC650300D0650300C865035F +S21902562700D4650300E03603000DC0A0E100D82DE904B04CE2F4 +S21902563CD80500EB08209FE50130A0E3003082E500A81BE9C423 +S2190256513603000DC0A0E170D82DE904B04CE20060A0E3015042 +S219025666A0E1006085E50040A0E1060000EA003095E50160869B +S21902567BE2002094E5033280E1003085E5012082E2002084E55A +S219025690002094E50030D2E5000053E30300000A0300A0E13681 +S2190256A5FEFFEB000050E3F0FFFFAA0600A0E170A81BE90DC0C6 +S2190256BAA0E170D82DE904B04CE202E0A0E10060A0E30040513C +S2190256CFE20400001A3030A0E30130C0E40030C0E50200A0E3AD +S2190256E470A81BE907308EE2000053E3073083B2C3E1B0E113FD +S2190256F900000A50509FE501104EE28131A0E134C3B0E100204B +S21902570EA0030120A01301005EE30030A0130130A0030320925A +S219025723E10600000AFFC00CE22C32D5E70130C0E40F200CE2C0 +S2190257380230D5E7026086E20130C0E400E051E2ECFFFF1A06AB +S21902574D00A0E170A81BE9D42403000DC0A0E100D82DE904B0B8 +S2190257624CE200A81BE90DC0A0E100D82DE904B04CE200A81B70 +S219025777E90DC0A0E170D82DE9F0209FE5003092E504B04CE264 +S21902578C000053E30200000A003092E50FE0A0E103F0A0E1DA5A +S2190257A12200EB000050E30A00000A752500EB000050E30700D9 +S2190257B6001ABC209FE5003092E5000053E32A00000A0030928A +S2190257CBE50FE0A0E103F0A0E170A81BE9A0209FE5003092E5F2 +S2190257E0000053E30300000A0030A0E3003082E50250A0E30249 +S2190257F50000EABC2200EBA92200EB0050A0E1D12400EB00007E +S21902580A50E30000000AD92400EBC92400EBD2FFFFEBAB2400FB +S21902581FEB0300A0E3220600EB0300A0E3F00500EB44609FE55B +S219025834000055E30600000A40409FE5003094E50500A0E10FCE +S219025849E0A0E103F0A0E1000050E3F9FFFF1AB42400EB003037 +S21902585E96E5000053E30200000A003096E50FE0A0E103F0A0C3 +S219025873E170A81BE9D8360300D436030078F70300C83603008B +S2190258880DC0A0E1F0DD2DE904B04CE224D04DE20050A0E100FD +S21902589D40A0E348604BE2F4A09FE500309AE50180A0E300008C +S2190258B253E30500000A0400A0E10610A0E10FE0A0E103F0A076 +S2190258C7E10080A0E1020000EA0400A0E1BB0300EB48000BE591 +S2190258DC0600A0E1103044E2070053E303E0A0E1017084E2113A +S2190258F100008A0840A0E30020A0E302C0A0E144004BE20010DF +S219025906A0E1043082E2012082E203C0C1E7040052E1FAFFFF4D +S21902591BBA0010A0E106C0A0E10320A0E30130DCE4012042E202 +S2190259300130C1E4010072E3FAFFFF1A000058E30700000A05CC +S21902594510A0E107005EE30C20A0930420A0830030A0E387FE8F +S21902595AFFEB0050A0E1100000EA0520A0E107005EE31730A0A7 +S21902596F930730A083010073E37810A0E30300000A013043E26A +S2190259840110C2E4010073E3FBFFFF1A07005EE30200009A08FA +S2190259995085E2010000EA98F60300185085E20740A0E119000F +S2190259AE54E3BCFFFFDAF0AD1BE90DC0A0E1F0D92DE904B04C44 +S2190259C3E20CD04DE20040A0E31A70A0E30130D0E40180A0E124 +S2190259D824000BE5500053E31700001A24004BE228104BE2181A +S2190259EDFFFFEB040050E10800000A24201BE50130D2E4FF3014 +S219025A0203E224200BE53D0053E30200001A28401BE501708483 +S219025A17E2090000EA74209FE50030D2E50810A0E1000053E3D0 +S219025A2C2900000A0130C1E40130F2E5000053E3FBFFFF1A24E0 +S219025A410000EA0450A0E1070055E1180000AA0060A0E32C106C +S219025A564BE2104045E2070054E32C600BE50C20A0930420A0B3 +S219025A6B8324001BE50630A0E1CCFEFFEB2C101BE50500A0E14B +S219025A80580300EB070054E30300009A24301BE5083083E202F6 +S219025A950000EAE824030024301BE5183083E2015085E22430EF +S219025AAA0BE5070055E1E7FFFFBA28209FE50030D2E50810A0A9 +S219025ABFE1000053E30300000A0130C1E40130F2E5000053E393 +S219025AD4FBFFFF1A0030A0E30030C1E5000000EAEC240300F02D +S219025AE9A91BE90DC0A0E1F0D82DE974239FE504B04CE2C0D03B +S219025AFE4DE20040A0E10060A0E30030D4E50270A0E10060C2BB +S219025B13E53F3043E2340053E303F19F97F60100EAF85B020033 +S219025B2800630200585C0200D0610200806002000063020000CC +S219025B3D63020000630200A85D0200106302000063020000633E +S219025B5202000063020000630200885E020000630200006302B9 +S219025B6700A85D0200405C0200006302008060020010630200C1 +S219025B7C006302000063020000630200845E0200006302000095 +S219025B916302000063020000630200006302000063020000639C +S219025BA6020000630200006302007862020080600200006302F4 +S219025BBB0000630200006302004C5C0200006302000063020090 +S219025BD000630200AC61020000630200B85D0200006302000064 +S219025BE563020000630200345C0200C861020080600200BC215E +S219025BFA00EBA92100EB5330A0E30030C7E50020A0E30320C780 +S219025C0FE55C129FE54032A0E10F3003E20320D1E70F0000E2BF +S219025C240030D1E70120C7E50230C7E5B60100EA010084E28049 +S219025C390200EBB30100EA010084E2D40200EBB00100EA0700FA +S219025C4EA0E10CFFFFEBAD0100EA0130D4E5000053E30A000002 +S219025C631AF30100EB08129FE50030D1E50720A0E1000053E3CA +S219025C788E01000A0130C2E40130F1E5000053E3FBFFFF1A89C7 +S219025C8D0100EAA4604BE2A0504BE2013084E2A0300BE5050066 +S219025CA2A0E10610A0E169FEFFEB000050E32400000AA0201B41 +S219025CB7E50130D2E4FF3003E2A0200BE52C0053E31E00001AA7 +S219025CCC0500A0E1A8104BE25EFEFFEB000050E31900000AA015 +S219025CE1201BE50130D2E4FF3003E2A0200BE52C0053E3130067 +S219025CF6001AA4101BE5000051E30B00000AA8001BE5E20100F0 +S219025D0BEB001050E20300000AA0001BE5A4201BE50030A0E32B +S219025D2021FEFFEBA4201BE5A0301BE5823083E0A0300BE5A055 +S219025D35201BE50030D2E52C0053E301308202D4FFFF0AA03088 +S219025D4A1BE50020D3E5000052E30900001A18119FE50030D15F +S219025D5FE50720A0E1000053E35201000A0130C2E40130F1E52A +S219025D74000053E3FBFFFF1A4D0100EAF4109FE50030D1E5071D +S219025D8920A0E1000053E34801000A0130C2E40130F1E50000F6 +S219025D9E53E3FBFFFF1A430100EA0400A0E10710A0E100FFFF57 +S219025DB3EB550100EAAC504BE20500A0E1013084E2AC300BE597 +S219025DC8B0104BE220FEFFEB000050E31B00000AAC201BE501A5 +S219025DDD30D2E4FF3003E2AC200BE52C0053E31500001A05005E +S219025DF2A0E1B4104BE215FEFFEB000050E31000000AB0001B0E +S219025E07E50710A0E1B4201BE50130A0E358FDFFEB000050E308 +S219025E1C3B01001A58109FE50030D1E50720A0E1000053E32044 +S219025E3101000A0130C2E40130F1E5000053E3FBFFFF1A1B0107 +S219025E4600EA2C109FE50030D1E50720A0E1000053E3160100BB +S219025E5B0A0130C2E40130F1E5000053E3FBFFFF1A110100EAFE +S219025E70C85D0300D4240300EC240300F0240300F424030001AD +S219025E8560A0E3B8504BE20500A0E1013084E2B8300BE5BC1028 +S219025E9A4BE2ECFDFFEB000050E36B00000AB8201BE50130D269 +S219025EAFE4FF3003E2B8200BE52C0053E36500001A0500A0E1B0 +S219025EC4C0104BE2E1FDFFEB000050E36000000AB8001BE501A7 +S219025ED930D0E4FF3003E2B8000BE53A0053E35A00001A000029 +S219025EEE56E33E00000AC0301BE5000053E32400000A9C504B8C +S219025F03E2C0301BE50040A0E3030054E11100002A0510A0E1E4 +S219025F18B8201BE50130D2E40430C1E7FF3003E2B8200BE57D79 +S219025F2D0053E30300001A0130D2E4203083E30430C5E7B820B0 +S219025F420BE5014084E27F0054E30200008AC0301BE503005423 +S219025F57E1EEFFFF3A0500A0E1BC101BE50420A0E1BB0400EB86 +S219025F6C040050E10700001AC0201BE5BC301BE5022064E0C0D1 +S219025F81200BE5043083E0BC300BE5000052E3DBFFFF1AC03069 +S219025F961BE5000053E30900001A30139FE50030D1E50720A022 +S219025FABE1000053E3C000000A0130C2E40130F1E5000053E3E5 +S219025FC0FBFFFF1ABB0000EA0C139FE50030D1E50720A0E100DC +S219025FD50053E3B600000A0130C2E40130F1E5000053E3FBFFAC +S219025FEAFF1AB10000EABC101BE5C0201BE50130A0E36AFDFF21 +S219025FFFEB000050E30900000AC8129FE50030D1E50720A0E169 +S219026014000053E3A600000A0130C2E40130F1E5000053E3FB7B +S219026029FFFF1AA10000EAA4129FE50030D1E50720A0E10000F0 +S21902603E53E39C00000A0130C2E40130F1E5000053E3FBFFFF5D +S2190260531A970000EA80129FE50030D1E50720A0E1000053E3BC +S2190260689200000A0130C2E40130F1E5000053E3FBFFFF1A8DCC +S21902607D0000EA013084E2C4300BE5C4504BE20020D4E5003058 +S219026092A0E3C8300BE5530052E3430052130700001A0500A091 +S2190260A7E1C8104BE268FDFFEBC4201BE50030D2E53B0053E36C +S2190260BC01308202C4300B050500A0E1CC104BE260FDFFEB0039 +S2190260D10050E30100000ACC001BE5962000EB0300A0E3F2038D +S2190260E600EB0300A0E3C00300EBC8001BE5000050E30800007C +S2190260FB0AE0219FE5003092E5000053E30400000A003092E568 +S2190261100FE0A0E103F0A0E1000050E3C8000B05C8501BE5006C +S2190261250055E30300000A0900A0E3C8000BE5AA0000EB7600CA +S21902613A00EA082300EB000050E30400000A6330A0E30030C4FE +S21902614FE590219FE5623043E2003082E50030D4E5530053E35A +S219026164730053130600001A0500A0E178FDFFEB70219FE570BC +S219026179319FE5003082E51C2200EB010000EA0100A0E371FDB8 +S21902618EFFEB0300A0E3C60300EB0300A0E3940300EBB1010017 +S2190261A3EB0000E0E35B0000EAAE0100EB3C319FE5002093E5CA +S2190261B80FE0A0E102F0A0E10100A0E3540000EA3F0300EB4FAA +S2190261CD0000EAD0004BE2013084E2D0300BE5D4104BE21BFD1F +S2190261E2FFEB000050E31800000AD0201BE50130D2E4FF300359 +S2190261F7E2D0200BE52C0053E31200001A0130D2E4D0200BE575 +S21902620C430053E30200001AD4001BE5750400EB010000EAD4EA +S219026221001BE56D0400EBA8109FE50030D1E50720A0E100003B +S21902623653E31E00000A0130C2E40130F1E5000053E3FBFFFFE1 +S21902624B1A190000EAA0109FE50030D1E50720A0E1000053E322 +S2190262601400000A0130C2E40130F1E5000053E3FBFFFF1A0FCE +S2190262750000EAD8004BE2013084E2D8300BE5DC104BE2F1FC89 +S21902628AFFEB000050E30B00001A60109FE50030D1E50720A015 +S21902629FE1000053E30300000A0130C2E40130F1E5000053E3AB +S2190262B4FBFFFF1A0030A0E30030C2E5120000EA0C009FE5B1F4 +S2190262C9FBFFEBDC001BE5710100EB0D0000EAEC240300F42479 +S2190262DE0300F8240300D036030050390300EC360300A0F6032F +S2190262F300CC360300F0240300FC2403000400A0E10710A0E133 +S2190263084B2FA0E3E70300EB0700A0E19EFBFFEB0000A0E3F029 +S21902631DA81BE90DC0A0E110D82DE914409FE504B04CE204109E +S219026332A0E1EF0200EB0400A0E194FBFFEB10A81BE9C85D0310 +S219026347000DC0A0E110D82DE938309FE5002093E504B04CE288 +S21902635C000052E3000000AAEDFFFFEB24409FE50400A0E11AE9 +S219026371FBFFEB0400A0E1DBFDFFEB000050E3F9FFFF0A0000B0 +S219026386A0B30100A0A310A81BE9DC360300C85503000DC0A006 +S21902639BE100D82DE904B04CE200A81BE90DC0A0E100D82DE94D +S2190263B004B04CE29DFCFFEB910200EB2B00A0E3100100EB0044 +S2190263C5A81BE90DC0A0E100D82DE908309FE504B04CE2000036 +S2190263DA83E500A81BE9DC3603000DC0A0E100D82DE93C109F57 +S2190263EFE55830A0E30030C1E50020A0E30320C1E504B04CE27E +S21902640428C09FE54032A0E10F3003E20320DCE70F0000E20022 +S21902641930DCE70120C1E50230C1E50100A0E159FBFFEB00A86D +S21902642E1BE9C85D0300D42403000DC0A0E100D82DE938209FF8 +S219026443E538109FE50030E0E3003082E530309FE50020A0E37B +S219026458002081E5002083E524109FE524309FE5003081E504F0 +S21902646DB04CE21C209FE50130A0E3003082E500A81BE92C66EC +S219026482030028660300D8650300B066030030660300E436035B +S219026497000DC0A0E130D82DE99C309FE504B04CE20040A0E18A +S2190264AC002093E50150A0E1000052E30000001ADDFFFFEB1243 +S2190264C10054E3070000CA78309FE578109FE5002093E503C024 +S2190264D6A0E1022061E0052082E0800052E30100009A0000A04F +S2190264EBE330A81BE958E09FE500309EE5030054E10B00000A1A +S2190265004C009FE5003090E548109FE5030054E1030000BA0138 +S2190265152084E20030A0E3023181E7002080E500408EE500302E +S21902652A9CE5043181E700309CE50300A0E1053083E000308CAE +S21902653FE530A81BE9E4360300B0660300306603002C6603001B +S21902655428660300D86503000DC0A0E1F0DD2DE904B04CE20443 +S219026569D04DE20060A0E174009FE50150A0E1001090E50240A5 +S21902657EA0E168A09FE5000051E31300001A0130A0E30030802F +S219026593E558709FE558809FE50130A0E1031CA0E10800A0E382 +S2190265A803E1A0E101C083E28120A0E1073022E0000051E303BA +S2190265BD20A0B10210A0E1010050E2F8FFFF1A0C30A0E10E2090 +S2190265D288E7FF0053E3F0FFFF9A14709FE50030A0E300308A0C +S2190265E7E5080000EAE8360300E0360300B71DC104B4660300D1 +S2190265FC25305BE5243C23E0032197E7016086E2044422E001D5 +S2190266115045E2010075E30600000A25004BE20610A0E1012083 +S219026626A0E3FD0200EB00309AE5000053E3F0FFFF0A0400A06A +S21902663BE1F0AD1BE90DC0A0E170D82DE928319FE504B04CE256 +S2190266500CD04DE21C000BE50020A0E30020C3E500C0A0E1006B +S21902666520DCE50350A0E1430052E33700001A0130DCE5520057 +S21902667A53E33400001A0260DCE5430056E33100001A0330DC87 +S21902668FE53A0053E32E00001A1C404BE20400A0E104308CE2A2 +S2190266A41C300BE520104BE2E8FBFFEB000050E33700000A1CE4 +S2190266B9201BE50130D2E4FF3003E21C200BE52C0053E33100EB +S2190266CE001A0400A0E124104BE2DDFBFFEB000050E32C00008F +S2190266E30A20001BE524101BE50020E0E399FFFFEB80309FE5A4 +S2190266F8004093E50010A0E1000054E30B00000A70209FE500DD +S21902670D30D2E50510A0E1000053E30300000A0130C1E40130A9 +S219026722F2E5000053E3FBFFFF1A0030A0E30030C1E51700009B +S219026737EA010085E22020A0E3DCFBFFEB0060C5E5010080E203 +S21902674C0040C5E7100000EA1C301BE50020D3E50300A0E14C57 +S2190267610052E30210A0E10A00000A040000CA430052E30300F7 +S21902677600EAC85D0300E0360300F0240300500051E30200003F +S21902678B0A0510A0E14B2FA0E3BB0200EB70A81BE90DC0A0E143 +S2190267A000D82DE90030D0E504B04CE2700053E30200000A086E +S2190267B5109FE54B2FA0E3B60200EB00A81BE9C85D03000DC0F3 +S2190267CAA0E100D82DE90C309FE5002093E504B04CE200019277 +S2190267DFE700A81BE9EC3603000DC0A0E100D82DE90C309FE5EA +S2190267F4002093E504B04CE2001182E700A81BE9EC3603000DB7 +S219026809C0A0E100D82DE920309FE5182093E50010A0E100002F +S21902681E92E5FF1001E20C3092E504B04CE20FE0A0E103F0A05D +S219026833E100A81BE9500000000DC0A0E100D82DE91C309FE560 +S219026848182093E5000092E5103092E504B04CE20FE0A0E10301 +S21902685DF0A0E1FF0000E200A81BE9500000000DC0A0E100D8AB +S2190268722DE91C309FE5182093E5000092E50810A0E31430928C +S219026887E504B04CE20FE0A0E103F0A0E100A81BE9500000004E +S21902689C0DC0A0E100D82DE924309FE504B04CE218C093E5009A +S2190268B1109CE50020A0E10100A0E114309CE50010A0E30FE0D0 +S2190268C6A0E103F0A0E100A81BE9500000000DC0A0E100D82D72 +S2190268DBE9000050E304B04CE20F00000A70209FE5003092E5CF +S2190268F0013043E2003082E5000053E3160000CA0030A0E300D6 +S2190269053082E554209FE5183092E5000093E5142093E50510EF +S21902691AA0E30FE0A0E102F0A0E100A81BE930209FE5003092B9 +S21902692FE5013083E2003082E5010053E30600001A1C309FE513 +S219026944182093E5000092E5143092E50410A0E30FE0A0E1034B +S219026959F0A0E100A81BE9F0360300500000000DC0A0E100D866 +S21902696E2DE91C309FE5182093E5000092E5103092E504B04C49 +S219026983E20FE0A0E103F0A0E1FF0000E200A81BE95000000055 +S2190269980DC0A0E1F0DF2DE9FF1001E20D0051E304B04CE20497 +S2190269ADD04DE27300000A70319FE570219FE5000093E5001090 +S2190269C2C2E7010080E2000083E50A0051E30100000A64005048 +S2190269D7E36900001A50519FE5186095E500900FE100400FE177 +S2190269ECC04084E304F029E13C019FE56E2000EB000096E50C69 +S219026A013096E52410A0E30FE0A0E103F0A0E1000096E54F80E9 +S219026A16A0E30C3096E50810A0E10FE0A0E103F0A0E1FC309FE2 +S219026A2BE5002093E50070A0E3020057E1180000AAF8A09FE5C7 +S219026A40E8209FE50730D2E72342DAE7000096E50F3003E203F6 +S219026A5550DAE70C3096E50410A0E10FE0A0E103F0A0E10000E4 +S219026A6A96E5017087E20C3096E50510A0E10FE0A0E103F0A06B +S219026A7FE1044088E0FF8004E29C209FE5055088E0003092E565 +S219026A94FF8005E2030057E1E7FFFFBA000096E50C3096E52351 +S219026AA910A0E30FE0A0E103F0A0E180309FE5000096E5281271 +S219026ABED3E70C2096E50FE0A0E102F0A0E168209FE5000096D6 +S219026AD3E50F3008E20310D2E70C3096E50FE0A0E103F0A0E132 +S219026AE8000096E5103096E50FE0A0E103F0A0E129004BE529F6 +S219026AFD305BE52B0053E31000000A29004BE20110A0E3650340 +S219026B1200EB000050E30800001A29305BE52D0053E3EFFFFF3E +S219026B271AB3FFFFEAF4360300B46A030050000000846B02000E +S219026B3C0025030030209FE50130A0E3443082E528209FE500E6 +S219026B5130A0E3003082E520009FE5362000EB00300FE1C040D9 +S219026B6609E2C030C3E3043083E103F029E1020000EA500000C1 +S219026B7B00F4360300846B0200F0AF1BE90DC0A0E170D82DE991 +S219026B9004B04CE20160A0E10240A0E10430A0E1014044E20046 +S219026BA50053E30050A0E10600000A0110D6E40500A0E176FFF7 +S219026BBAFFEB0430A0E1014044E2000053E3F8FFFF1A70A81B40 +S219026BCFE90DC0A0E170D82DE904B04CE20160A0E10240A0E18E +S219026BE40430A0E1014044E2000053E30050A0E10600000A055D +S219026BF900A0E159FFFFEB0430A0E1014044E20100C6E40000F6 +S219026C0E53E3F8FFFF1A70A81BE90DC0A0E10E002DE900D82D91 +S219026C23E90000A0E310B04CE200A81BE90DC0A0E170D82DE9A3 +S219026C380000A0E304B04CE223FFFFEBB4C09FE5B4509FE5B49B +S219026C4DE09FE5B4609FE50020A0E3B0109FE50C40A0E100007B +S219026C6291E5023190E702318CE7012082E20A0052E3FAFFFF94 +S219026C77DA001091E52C3091E52C308CE5402091E530208CE56B +S219026C8C303091E534308CE5342091E538208CE5383091E53C94 +S219026CA1308CE50000A0E33C3091E51C208CE20C10A0E16430F6 +S219026CB68CE5400082E5042042E2010052E1FBFFFFAA00309EBD +S219026CCBE5004085E5000053E30400000A0030A0E300308EE584 +S219026CE00F00A0E3B7FEFFEBD31F00EB0F00A0E3B4FEFFEBD08C +S219026CF51F00EB000086E570A81BE9A0F60300EC3603005039AB +S219026D0A030078F7030008F703000DC0A0E100D82DE904B04CBA +S219026D1FE260109FE50000A0E301E0A0E158C09FE500209EE55E +S219026D3400319CE7003182E7010080E20A0050E3F9FFFFDA0084 +S219026D491091E52C309CE52C3081E530209CE5402081E534300E +S219026D5E9CE5303081E538209CE5342081E53C309CE538308169 +S219026D73E564209CE53C2081E50100A0E3D3FEFFEB00A81BE96D +S219026D8808F70300A0F603000DC0A0E100D82DE90000A0E30491 +S219026D9DB04CE200A81BE90DC0A0E100D82DE930209FE53030E0 +S219026DB29FE530109FE5003082E52C309FE52C209FE500308185 +S219026DC7E528309FE528109FE5003082E524309FE504B04CE2E2 +S219026DDC003081E500A81BE9D0360300906D0200CC360300CC80 +S219026DF16E0200D8360300306C0200D4360300146D02000DC00A +S219026E06A0E170D82DE99C209FE5006092E504B04CE200005642 +S219026E1BE32200001A0130A0E3003082E584509FE5F62000EB98 +S219026E30343095E50000E0E30FE0A0E103F0A0E10040A0E134CC +S219026E453095E50200E0E30FE0A0E103F0A0E1141095E55830B8 +S219026E5A9FE558209FE5043081E554309FE5082081E50C3081AF +S219026E6FE54C209FE54C309FE5102081E5143081E5020074E399 +S219026E84000054130300000A343095E50400A0E10FE0A0E103A8 +S219026E99F0A0E1303095E50600A0E10FE0A0E103F0A0E170A80F +S219026EAE1BE9F836030050000000886B0200D06B02009869020E +S219026EC30068690200186C02000DC0A0E100D82DE918309FE552 +S219026ED8403093E504B04CE2000053E30100000A0FE0A0E10320 +S219026EEDF0A0E100A81BE9500000000DC0A0E1F0D92DE954306B +S219026F02A0E304B04CE208D04DE20160A0E10680A0E10050A02E +S219026F17E328500BE50040A0E10130C8E44402A0E100F8FFEBCC +S219026F2C0100C6E5018088E20400A0E1FCF7FFEB0100C8E4059E +S219026F4100A0E1F9F7FFEB0100C8E40F00A0E3F6F7FFEB0100C2 +S219026F56C8E43A70A0E30170C8E40F00A0E317FEFFEB0810A0E0 +S219026F6BE10420A0E30530A0E124000BE524604BE20600A0E180 +S219026F80FDF8FFEB0080A0E128004BE20810A0E10520A0E1057C +S219026F9530A0E1F7F8FFEB0080A0E13B40A0E30140C8E4050065 +S219026FAAA0E1DFF7FFEB0100C8E40D00A0E3DCF7FFEB0100C8C7 +S219026FBFE40170C8E40D00A0E3FEFDFFEB0810A0E10420A0E300 +S219026FD424000BE50530A0E10600A0E1E5F8FFEB0080A0E10187 +S219026FE940C8E40050C8E5F0A91BE90DC0A0E100D82DE904B016 +S219026FFE4CE2030050E300F19F97250000EAA47002001C700239 +S219027013003070020060700200101F11EE011A81E3031081E3C9 +S219027028101F01EE1C0000EA101F11EE011AC1E3101F01EE001D +S21902703D10A0E3151F07EE0000A0E10000A0E10000A0E10000F8 +S219027052A0E10000A0E10000A0E1100000EA0E02A0E3021A8076 +S219027067E2202090E4000031E1FCFFFF1A0000A0E3160F07EEB4 +S21902707C9A0F07EE0010A0E3151F07EE151F08EE0000A0E100F3 +S21902709100A0E10000A0E10000A0E10000A0E10000A0E1100F3F +S2190270A611EE2006A0E1010000E200A81BE90DC0A0E100D82D46 +S2190270BBE904B04CE2030050E300F19F97150000EA24710200FB +S2190270D0DC700200EC70020004710200101F11EE0F1081E310C0 +S2190270E51F01EE0D0000EA101F11EE0C10C1E3101F01EE00106E +S2190270FAA0E3161F07EE070000EA0E02A0E3021A80E2202090FB +S21902710FE4000031E1FCFFFF1A0000A0E3160F07EE9A0F07EE1F +S219027124100F11EE2001A0E1010000E200A81BE90DC0A0E17042 +S219027139D82DE9D0209FE5D0409FE504B04CE2CCC09FE5013021 +S21902714EA0E300308CE5C4309FE50260A0E1003082E50C50A013 +S219027163E1003094E504C0A0E1000053E32200000A04E0A0E17A +S21902717800309EE5030053E30900009A030011E30700001A0351 +S21902718D0010E30500001A043090E4043081E400209EE50420CC +S2190271A242E200208EE5110000EA00309CE5010053E30900002E +S2190271B79A010011E30700001A010010E30500001AB230D0E067 +S2190271CCB230C1E000309CE5023043E200308CE5040000EA018C +S2190271E120D0E40120C1E400309EE5013043E200308EE500301C +S2190271F694E5000053E3DDFFFF1A0030A0E3003085E50030A0BC +S21902720BE3003086E570A81BE9FC360300186B0300E0360300F9 +S219027220087202000DC0A0E130D82DE90030A0E10100A0E10334 +S21902723510A0E118409FE50250A0E1005084E504B04CE2B9FFAA +S21902724AFFEB000094E5050060E030A81BE9186B03000DC0A0B1 +S21902725FE130D82DE918409FE50250A0E1005084E504B04CE2CA +S219027274AEFFFFEB000094E5050060E030A81BE9186B03000D3A +S219027289C0A0E100D82DE90000A0E304B04CE200A81BE90DC0DC +S21902729EA0E100D82DE90000A0E304B04CE200A81BE90DC0A0E7 +S2190272B3E100D82DE90000A0E304B04CE200A81BE90DC0A0E191 +S2190272C830D82DE904B04CE268C09FE500309CE5000053E31601 +S2190272DD00000A0C50A0E100000FE100400FE1C04084E304F033 +S2190272F229E100C095E514309CE5003085E518109CE50020A074 +S219027307E318208CE500300FE1C04000E2C030C3E3043083E1AE +S21902731C03F029E100009CE510209CE50FE0A0E10CF09CE50039 +S2190273313095E5000053E3E9FFFF1A30A81BE91C6B03000DC02C +S219027346A0E100D82DE904B04CE20C209FE5003092E5013083CF +S21902735BE2003082E500A81BE97CF703000DC0A0E110D82DE92F +S21902737004B04CE234409FE5003094E5010053E30000001ACE5F +S219027385FFFFEB0030A0E3003084E51C309FE5002093E500004F +S21902739A52E30200000A0130A0E3003084E5F2FFFFEA10A81B9C +S2190273AFE97CF703001C6B03000DC0A0E100D82DE904B04CE2BB +S2190273C45EF5FFEB00A81BE90DC0A0E100D82DE904B04CE26640 +S2190273D9F5FFEB00A81BE90DC0A0E100D82DE90100A0E304B099 +S2190273EE4CE200A81BE90DC0A0E100D82DE90100A0E304B04CE9 +S219027403E200A81BE90DC0A0E100D82DE904B04CE2E5F4FFEBFE +S21902741800A81BE90DC0A0E110D82DE904B04CE200300FE1005E +S21902742D400FE1C04084E304F029E108209FE50130A0E300301E +S21902744282E5FEFFFFEA0000039010A81BE90DC0A0E100D82D3F +S219027457E904B04CE2EEFFFFEB0000A0E300A81BE90DC0A0E1FA +S21902746C00D82DE90000A0E304B04CE200A81BE90DC0A0E17047 +S219027481D82DE904B04CE20040A0E10000A0E30160A0E30010E7 +S219027496A0E1020074E30D00000A020000CA030074E30F0000B4 +S2190274AB0A100000EA010074E30E00001ABC309FE5003093E529 +S2190274C0000053E3016043E20B0000CA0360A0E10260E00308EE +S2190274D50000EAA0309FE598209FE5180083E5004082E50300F7 +S2190274EA00EA0040A0E1000000EA014084E20110A0E300005165 +S2190274FFE31B00000A74509FE5183095E5000053E30400000A1B +S219027514000093E5143093E50410A0E30FE0A0E103F0A0E15458 +S219027529309FE548209FE5843283E0183085E5004082E51830EC +S21902753E95E5000050E30500000A000093E5143093E50510A08C +S219027553E30FE0A0E103F0A0E1040000EA000093E5143093E533 +S2190275680410A0E30FE0A0E103F0A0E10600A0E170A81BE900E9 +S21902757D37030050000000206B03000DC0A0E100D82DE900108E +S219027592A0E304B04CE201C0A0E3020070E30D00000A020000C6 +S2190275A7CA030070E30F00000A100000EA010070E30E00001A19 +S2190275BC64309FE5003093E5000053E301C043E20B0000CA03FF +S2190275D1C0A0E102C0E003080000EA48309FE540209FE51410C2 +S2190275E683E5000082E5030000EA0100A0E1000000EA010080E0 +S2190275FBE20110A0E3000051E30500000A18309FE51C209FE52F +S219027610000083E510309FE5802282E0142083E50C00A0E10005 +S219027625A81BE90437030050000000206B03000DC0A0E100D85B +S21902763A2DE904B04CE200A81BE90DC0A0E100D82DE904B04C54 +S21902764FE200A81BE90DC0A0E100D82DE904B04CE2E91E00EB81 +S21902766400A81BE90DC0A0E110D82DE9FF1000E254309FE50415 +S219027679B04CE2142093E50340A0E1000052E30400000A000064 +S21902768E92E50C3092E50FE0A0E103F0A0E1040000EA18209418 +S2190276A3E5000092E50C3092E50FE0A0E103F0A0E1443094E5EB +S2190276B8000053E30200000A0000A0E3440084E5860000EB10C3 +S2190276CDA81BE9500000000DC0A0E100D82DE930209FE518106D +S2190276E292E5003092E504B04CE2130053E30600001A1430A03F +S2190276F7E3003082E5000091E5143091E50510A0E30FE0A0E1C5 +S21902770C03F0A0E100A81BE9500000000DC0A0E110D82DE900A5 +S21902772130A0E350209FE504B04CE204D04DE214300BE518E094 +S21902773692E500309EE50020A0E10300A0E10130A0E118C09EC0 +S21902774BE514104BE20FE0A0E10CF0A0E114301BE50040A0E1FA +S219027760000053E30200000A10309FE5000093E55C0000EB0444 +S21902777500A0E1010000EA5000000080F7030010A81BE90DC039 +S21902778AA0E1F0D82DE9E0009FE5E0609FE50020A0E3DC509FEE +S21902779FE504B04CE2D8709FE50510A0E10231A0E1012082E26C +S2190277B4030081E73F0052E3FAFFFFDAC0C09FE50030A0E3A8A9 +S2190277C9009FE5011083E28332A0E10720A0E303008CE7012033 +S2190277DE52E2043083E2FBFFFF5A0130A0E1020053E3F5FFFF92 +S2190277F3DA90209FE51330A0E3003085E5042085E584309FE546 +S21902780884209FE5083085E5402085E57C309FE57C209FE51070 +S21902781D3085E5482085E574309FE5306085E570209FE5347009 +S21902783285E5203085E50140E0E31C2085E50400A0E10FE0A058 +S219027847E106F0A0E10400A0E10FE0A0E107F0A0E10030A0E3AD +S21902785C243085E540209FE5283085E54C3085E5443085E58C5C +S2190278712085E5F0A81BE9687402007C740200500000008875B8 +S2190278860200206B030004330300200000001C740200507402A4 +S21902789B00087402003476020044760200C0EC02000DC0A0E1EF +S2190278B000D82DE9000051E304B04CE20700000A011041E20172 +S2190278C530D0E7030053E30100001A0100A0E300A81BE900003C +S2190278DA51E3F7FFFF1A0000A0E300A81BE90DC0A0E100D82DCD +S2190278EFE9000050E31C109FE504B04CE23810901514309FE51A +S2190279048C2093E50100A0E10FE0A0E102F0A0E100A81BE9141E +S219027919790200500000000DC0A0E130D82DE90020E0E304B084 +S21902792E4CE258C09FE50040A0E100309CE50150A0E1140053C8 +S219027943E30600001A18309CE5000093E5142093E50610A0E39F +S2190279580FE0A0E102F0A0E10020A0E1020054E10400001A0436 +S21902796D00A0E10510A0E167FFFFEB000050E30200001A040044 +S219027982A0E10510A0E152F3FFEB30A81BE9500000000DC0A00A +S219027997E110D82DE9FF0000E204B04CE20040A0E10A0054E330 +S2190279AC0100001A0D00A0E32BFFFFEB0400A0E129FFFFEB1059 +S2190279C1A81BE90DC0A0E110D82DE90040A0E10030D4E504B054 +S2190279D64CE2000053E30400000A0000D4E5EAFFFFEB0130F472 +S2190279EBE5000053E3FAFFFF1A10A81BE90DC0A0E100D82DE95B +S219027A000030A0E31010A0E32B20A0E304D04DE200308DE5049D +S219027A15B04CE2440000EB00A81BE90DC0A0E1F0DF2DE904B0B5 +S219027A2A4CE224D04DE20150A0E10040A0E129104BE24C300B6F +S219027A3FE548A04BE204309BE50A00A0E1000053E32090A00369 +S219027A543090A013019041E4000051E1FCFFFFAA0080A0E3050F +S219027A693094E10300001A3030A0E348304BE5018088E21500B4 +S219027A7E00EA053094E11300000A0260A0E10070A0E30510A0B0 +S219027A93E10400A0E10730A0E10620A0E1502400EB68309FE597 +S219027AA80010D3E70810CAE70730A0E10620A0E10510A0E10436 +S219027ABD00A0E1018088E2E42200EB0150A0E10040A0E1053088 +S219027AD294E1EDFFFF1A08309BE5080053E10380A0A14C301BCF +S219027AE7E52D0053E30600001A013048E20320DAE7090052E1A0 +S219027AFC0380A0014C301BE50830CAE7050000EA018048E20348 +S219027B110000EA142503000800DAE7018048E29BFFFFEB00003A +S219027B2658E3FAFFFFAAF0AF1BE90DC0A0E100D82DE908D04D62 +S219027B3BE200308DE504B04CE204309BE501C0A0E104308DE52C +S219027B500010A0E30230A0E10C20A0E1AFFFFFEB00A81BE90DD5 +S219027B65C0A0E100D82DE9000050E304B04CE201C0A0E3150067 +S219027B7A000A0010A0E10030D1E5000053E31000000A44E09F5B +S219027B8FE5013060E00E0053E10020D1E500C0A0A30D0052E327 +S219027BA40A0052130200000A203042E25E0053E300C0A083015E +S219027BB91081E200005CE30200000A0030D1E5000053E3EFFFE8 +S219027BCEFF1A0C00A0E100A81BE9010100000DC0A0E1F0DF2DFD +S219027BE3E904B04CE20CD04DE20060A0E12C100BE5DAFFFFEBE0 +S219027BF8004050E21701001AA4039FE56EFFFFEB0600A0E1794B +S219027C0DFFFFEB98039FE56AFFFFEB2000A0E35CFFFFEB2C30BC +S219027C221BE5040193E772FFFFEB014084E2070054E3F7FFFF92 +S219027C37DA74039FE560FFFFEB090100EA0040D6E5250054E3C8 +S219027C4C0200000A0400A0E14EFFFFEBFF0000EA0070A0E32B4D +S219027C61C0A0E30140F6E50710A0E1300054E30090A0130190D5 +S219027C76A003303044E2090053E30600008A073187E083308424 +S219027C8BE00140F6E5307043E2302044E2090052E3F8FFFF9AD8 +S219027CA06C0054E30300001A0140F6E56C0054E30110A0030194 +S219027CB540F605253044E2530053E303F19F97E00000EA4080C0 +S219027CCA02004C8002004C8002004C8002004C8002004C800296 +S219027CDF004C8002004C8002004C8002004C8002004C80020083 +S219027CF44C8002004C8002004C8002004C8002004C8002004C22 +S219027D098002004C8002004C8002004C8002004C8002004C80D8 +S219027D1E02004C8002004C8002004C8002004C8002004C800241 +S219027D33004C8002004C80020010800200CC7E0200187E020022 +S219027D484C8002004C8002004C8002004C8002004C8002004CCD +S219027D5D8002004C8002004C8002004C8002004C8002004C8084 +S219027D7202004C8002004C8002004C800200E87E02004C800253 +S219027D87004C8002004C8002004C800200747E02004C800200B4 +S219027D9C4C8002004C8002004C8002004C8002004C8002004C79 +S219027DB18002004C8002004C80020010800200CC7E0200187E24 +S219027DC602004C8002004C8002004C8002004C8002004C800299 +S219027DDB004C8002004C8002004C8002004C8002004C80020086 +S219027DF04C8002004C8002004C8002004C800200E87E02004C8B +S219027E058002004C8002004C8002004C800200747E0200000081 +S219027E1A51E30B00000A2C301BE50300B3E82C300BE50000516C +S219027E2FE3020000AA000070E20010E1E22DC0A0E30A20A0E366 +S219027E4400908DE50C30A0E1100000EA2C301BE5040093E42C66 +S219027E59300BE5000050E3000060B22DC0A0B30A10A0E30C209F +S219027E6EA0E1100000EA000051E30900000A00908DE50C30A058 +S219027E83E12CC01BE50300BCE82CC00BE51020A0E304708DE5FA +S219027E98016086E2DFFEFFEB6E0000EA0C20A0E12CC01BE50449 +S219027EAD009CE41010A0E32CC00BE50930A0E100708DE50160BD +S219027EC286E219FFFFEB640000EA2C301BE50000D3E504308321 +S219027ED7E22C300BE5016086E2ABFEFFEB5D0000EA0050A0E3EB +S219027EEC2CC01BE50580A0E104409CE405A0A0E12CC00BE505BD +S219027F010054E1AC409F050C00000A0400A0E113FFFFEB000008 +S219027F1650E30800001A98009FE50A90A0E1A6FEFFEB0400A091 +S219027F2BE1B1FEFFEB193047E2190057E30370A0C17C409FE5E7 +S219027F400530D4E7016086E2000053E30300000A015085E2056C +S219027F5530D4E7000053E3FBFFFF1A000057E3070055110750DE +S219027F6AA0C1000059E30780651007A065000830A0E1018048D4 +S219027F7FE2000053E301704AE2050000DA2000A0E37FFEFFEB48 +S219027F940830A0E1018048E2000053E3F9FFFFCA0030D4E50885 +S219027FA90000EA282503004025030044250300482503005025C9 +S219027FBE0300642503000000D4E571FEFFEB0130F4E5000053A9 +S219027FD3E30200000A015045E2010075E3F7FFFF1A0A30A0E108 +S219027FE807A0A0E1000053E31A0000DA2000A0E365FEFFEB0A31 +S219027FFD30A0E101A04AE2000053E3F9FFFFCA130000EA0000F6 +S21902801257E32C301BE5014047121F40A003005093E55534A02F +S219028027E1010013E32E00A0033100A01356FEFFEB014044E20B +S21902803CF8FFFFEA2500A0E352FEFFEB030000EA2500A0E34F82 +S219028051FEFFEB0400A0E14DFEFFEB016086E20030D6E50000BD +S21902806653E3F5FEFF1AF0AF1BE90DC0A0E10F002DE900D82DA1 +S21902807BE914B04CE220D04DE208309BE50C209BE504009BE507 +S2190280902C300BE528200BE510309BE514209BE524300BE52078 +S2190280A5200BE518309BE51C209BE51C300BE518200BE5203077 +S2190280BA9BE524209BE514300BE510200BE52C104BE2C2FEFFEA +S2190280CFEB00A81BE90DC0A0E1F0DF2DE904B04CE20060A0E108 +S2190280E4060051E1067041800170A091000057E30290A0E13BE7 +S2190280F90000DA000059E30300000AE4009FE5061069E0D7FFAB +S21902810EFFEB020000EAD4009FE50610A0E1D3FFFFEB0050A0E4 +S219028123E3108047E210A086E2070055E1030000AAB8009FE566 +S2190281380510D6E7CBFFFFEB010000EAAC009FE5C8FFFFEBC514 +S21902814D4FA0E1053064E00130C3E3053063E0010053E3010046 +S219028162001A90009FE5C0FFFFEBA43EA0E1033085E00730C335 +S219028177E3053063E0070053E30100001A70009FE5B8FFFFEBA4 +S21902818C015085E20F0055E3E4FFFFDA60009FE5B3FFFFEB009C +S2190281A150A0E3070055E1040000AA0510D6E7203041E25E0061 +S2190281B653E32E10A083000000EA2010A0E338009FE5A8FFFF17 +S2190281CBEB015085E20F0055E3F2FFFFDA28009FE5A3FFFFEBAC +S2190281E00A60A0E1007058E2C3FFFFCAF0AF1BE96825030070C0 +S2190281F5250300782503007C2503008025030084250300882501 +S21902820A03000DC0A0E100D82DE90020A0E304B04CE2ACFFFFEA +S21902821FEB00A81BE90DC0A0E100D82DE904B04CE207FDFFEBA0 +S21902823400A81BE90DC0A0E100D82DE904B04CE202C0A0E10021 +S219028249E0A0E103005CE30200009A003081E1030013E30A0045 +S21902825E000A0C30A0E101C04CE2000053E30500000A0C20A03D +S219028273E10130D1E401C04CE20130CEE4000052E3F9FFFF1A10 +S21902828800A81BE900E0A0E10F005CE30E00009A043091E4042A +S21902829D308EE4042091E404208EE4043091E404308EE4042081 +S2190282B291E410C04CE204208EE40F005CE3F4FFFF8A020000DB +S2190282C7EA043091E404C04CE204308EE403005CE3FAFFFF8AAC +S2190282DC0C30A0E101C04CE2000053E30500000A0C20A0E101E7 +S2190282F130D1E401C04CE20130CEE4000052E3F9FFFF1A00A8CC +S2190283061BE90DC0A0E100D82DE9030052E304B04CE200C0A0A1 +S21902831BE10100009A030010E30900000A0230A0E1012042E2C9 +S219028330000053E30400000A0230A0E1012042E20110CCE40034 +S2190283450053E3FAFFFF1A00A81BE900C0A0E1FF1001E20134C0 +S21902835A81E1033883E10F0052E30900009A04308CE404308CBB +S21902836FE404308CE4102042E204308CE40F0052E3F8FFFF8AAE +S219028384010000EA042042E204308CE4030052E3FBFFFF8A0C3F +S21902839930A0E1000052E30200000A0110C3E4012052E2FCFFCE +S2190283AEFF1A00A81BE90DC0A0E1F0DF2DE904B04CE250D04D6C +S2190283C3E20170A0E178404BE200A0A0E3005050E20260A0E15D +S2190283D80380A0E10490A0E10300001A3030A0E378304BE57721 +S2190283ED404BE2090000EA0500A0E10610A0E12F2300EB00308A +S219028402D8E70610A0E10130C4E40500A0E1CE2100EB0050502F +S219028417E2F5FFFF1A090054E10500000A0920A0E1013074E5D9 +S21902842C01A08AE20130C7E4020054E1FAFFFF1A0A00A0E10077 +S21902844130A0E30030C7E5F0AF1BE90DC0A0E1F0DF2DE904B006 +S2190284564CE234D04DE24C200BE50180A0E148204BE250200B3B +S21902846BE50060A0E30140D8E40070A0E158600BE5060054E15C +S219028480FE00000A250054E3ED00001A0030A0E354300BE5014D +S21902849540D8E40350A0E12D0054E30200001A0120A0E3542063 +S2190284AA0BE50140D8E4300054E30200001A0140D8E40190A018 +S2190284BFE3060000EA0390A0E1040000EA053185E08330A0E1FD +S2190284D4303043E2045083E00140D8E4303044E2090053E3F797 +S2190284E9FFFF9A2E0054E30600001A0140D8E4019089E2000061 +S2190284FE00EA0140D8E4303044E2090053E3FBFFFF9A00A0A0E3 +S219028513E36C0054E30140D804584044E2200054E304F19F9769 +S219028528720000EAD0850200F8860200F8860200F8860200F80C +S21902853D860200F8860200F8860200F8860200F8860200F8861C +S2190285520200F8860200D4860200D0850200F8860200F88602D8 +S21902856700F8860200F8860200F8860200F8860200F886020078 +S21902857CF8860200F8860200F8860200F8860200B0850200F8B4 +S219028591860200F8860200B4860200F8860200F8860200F8860C +S2190285A60200F8860200D08502003000A0E30FE0A0E107F0A026 +S2190285BBE17800A0E30FE0A0E107F0A0E10190A0E30850A0E3F1 +S2190285D04C301BE5040093E44C300BE5200054E304F19F972F7B +S2190285E50000EA94860200A8860200A8860200A8860200A886B6 +S2190285FA0200A8860200A8860200A8860200A8860200A8860273 +S21902860F00A8860200A88602006C860200A8860200A88602009B +S219028624A8860200A8860200A8860200A8860200A8860200A8A2 +S219028639860200A8860200A8860200A886020088860200A886CF +S21902864E0200A8860200A8860200A8860200A8860200A886021E +S21902866300A886020088860200000050E32DA0A0B3000060B256 +S21902867848104BE2B4319FE50A20A0E3050000EA48104BE2A82F +S21902868D319FE5010000EA48104BE2A0319FE51020A0E343FF62 +S2190286A2FFEB58000BE548204BE250200BE5140000EA4C301B00 +S2190286B7E5042093E450200BE54C300BE50200A0E19C0000EB51 +S2190286CC58000BE50C0000EA4C301BE5043083E24C300BE501D2 +S2190286E16086E2040053E5019088E20FE0A0E107F0A0E15D0039 +S2190286F600EA3F00A0E30FE0A0E107F0A0E1016086E258201B78 +S21902870BE5055062E000005AE301504512000059E30800000AA3 +S2190287203040A0E300005AE30600000A0A00A0E10FE0A0E107FB +S219028735F0A0E1016086E200A0A0E3000000EA2040A0E3582086 +S21902874A1BE5019088E254301BE5012042E25C200BE500005390 +S21902875FE30800001A030000EA0400A0E10FE0A0E107F0A0E19F +S219028774016086E20530A0E1015045E2000053E3F7FFFFCA00FD +S219028789005AE30300000A0A00A0E10FE0A0E107F0A0E10160B6 +S21902879E86E25C201BE558301BE50F0000EA50301BE50140D3C6 +S2190287B3E4016086E250300BE50400A0E10FE0A0E107F0A0E120 +S2190287C80A0054E30300001A0D00A0E30FE0A0E107F0A0E101BE +S2190287DD6086E258301BE50320A0E1012042E258200BE50000DF +S2190287F253E3ECFFFFCA54301BE5000053E31A00000A0530A0CE +S219028807E1015045E2000053E3160000DA2000A0E30FE0A0E1C3 +S21902881C07F0A0E1016086E20530A0E1015045E2000053E3F7A4 +S219028831FFFFCA0D0000EA8C25030098250300AC250300040020 +S219028846A0E10FE0A0E107F0A0E1016086E20A0054E30190888A +S21902885BE20300001A0D00A0E30FE0A0E107F0A0E1016086E2C1 +S2190288700040D8E50980A0E1000054E300FFFF1A0600A0E1F01F +S219028885AF1BE90DC0A0E100D82DE918309FE5002093E5010083 +S21902889AC2E40010A0E3002083E504B04CE20010C2E500A81BA5 +S2190288AFE9806B03000DC0A0E10E002DE900D82DE918309FE5AA +S2190288C4000083E510B04CE204109BE50C009FE508208BE2DBAE +S2190288D9FEFFEB010000EA806B03008888020000A81BE90DC037 +S2190288EEA0E10F002DE900D82DE910009FE514B04CE204109BA5 +S219028903E508208BE2CFFEFFEB000000EA748B020000A81BE990 +S2190289180DC0A0E100D82DE90030A0E10120A0E10310A0E10818 +S21902892D009FE504B04CE2C4FEFFEB00A81BE9748B02000DC0A2 +S219028942A0E100D82DE90020A0E3000050E304B04CE2060000EC +S2190289570A0130D0E4020053E10300000A0130D0E4012082E268 +S21902896C000053E3FBFFFF1A0200A0E100A81BE90DC0A0E10029 +S219028981D82DE90130D1E40020A0E10100D2E404B04CE20300C9 +S21902899650E10500001A000050E30400000A0100D2E40130D17B +S2190289ABE4030050E1F9FFFF0A000063E000A81BE90DC0A0E15A +S2190289C000D82DE90130D1E40020A0E1000053E304B04CE2030B +S2190289D500000A0130C0E40130D1E4000053E3FBFFFF1A003048 +S2190289EAA0E30030C0E50200A0E100A81BE90DC0A0E100D82D97 +S2190289FFE900E0A0E10120DEE404B04CE2020000EA000050E32E +S219028A140F00000A0120DEE401C0D1E4200082E2FF0000E2412E +S219028A293042E2190053E30200A08120308CE2FF2003E2413038 +S219028A3E4CE2190053E30C30A0810230A091030050E1EEFFFFBF +S219028A530A000063E000A81BE90DC0A0E100D82DE9000052E39D +S219028A6804B04CE200C0A0E10300001A0200A0E100A81BE90083 +S219028A7D0063E000A81BE90100DCE40130D1E4030050E1F9FF1B +S219028A92FF1A000050E30100000A012052E2F7FFFF1A0000A06D +S219028AA7E300A81BE90DC0A0E110D82DE9000052E304B04CE2C1 +S219028ABC0040A0E10500001A0200A0E110A81BE9000063E0102C +S219028AD1A81BE9012052E21000000A01C0D4E401E0D1E420003F +S219028AE68CE2FF0000E241304CE2190053E30C00A08120308E2C +S219028AFBE2FFC003E241304EE2190053E30E30A0810C30A0911D +S219028B10030050E1ECFFFF1A000050E3ECFFFF1A0000A0E31047 +S219028B25A81BE90DC0A0E100D82DE904B04CE202C0A0E1070020 +S219028B3A00EA0120D0E40130D1E4030052E10300000A013050B6 +S219028B4FE5010051E5030060E000A81BE90C30A0E101C04CE253 +S219028B64000053E3F3FFFF1A0000A0E300A81BE90DC0A0E1F047 +S219028B79D92DE9BC309FE504B04CE2004093E5FF6000E20000A6 +S219028B8E54E31900001AA8309FE50000E0E30380A0E134209357 +S219028BA3E50850A0E10FE0A0E102F0A0E10070A0E1343095E546 +S219028BB80400A0E10FE0A0E103F0A0E1143095E5000093E50101 +S219028BCD4084E20C3093E50610A0E10FE0A0E103F0A0E10000B7 +S219028BE254E3F2FFFFDA343098E50700A0E10FE0A0E103F0A00A +S219028BF7E1F0A91BE940209FE5143092E5000053E30500000A00 +S219028C0C000093E50C3093E50610A0E10FE0A0E103F0A0E1F0B5 +S219028C21A91BE9183092E5000093E50C3093E50610A0E10FE019 +S219028C36A0E103F0A0E1F0A91BE9C0F70300500000000DC0A019 +S219028C4BE110D82DE930209FE504B04CE2143092E50040A0E1FC +S219028C60000053E30500000A000093E5103093E50FE0A0E10310 +S219028C75F0A0E10000C4E510A81BE9183092E5F7FFFFEA50001F +S219028C8A00000DC0A0E1F0DF2DE9E8309FE504B04CE20060A01D +S219028C9FE1004093E50390A0E1000054E31E00001AD0309FE519 +S219028CB40000E0E30370A0E1342093E507A0A0E10FE0A0E10287 +S219028CC9F0A0E10080A0E1343097E50400A0E10FE0A0E103F055 +S219028CDEA0E1143097E5000093E51C3093E50610A0E10FE0A0D7 +S219028CF3E103F0A0E1005050E20200000A0030D6E5000053E361 +S219028D080C00001A014084E2000054E3EDFFFFDA34309AE5089B +S219028D1D00A0E10FE0A0E103F0A0E1130000EA54209FE514309C +S219028D3292E5000053E30800000A080000EA0130A0E300308907 +S219028D47E5302097E50400A0E10FE0A0E102F0A0E10500A0E171 +S219028D5CF0AF1BE9183092E5000093E51C3093E50610A0E10FB7 +S219028D71E0A0E103F0A0E10050A0E10500A0E1F0AF1BE9C0F760 +S219028D860300500000000DC0A0E1F0D92DE9D8309FE504B04CC5 +S219028D9BE2004093E50060A0E1000054E31C00001AC4309FE55C +S219028DB00000E0E30380A0E1342093E50850A0E10FE0A0E102C9 +S219028DC5F0A0E10070A0E1343095E50400A0E10FE0A0E103F06A +S219028DDAA0E114C095E500005CE30500000A00009CE50710A028 +S219028DEFE314309CE50620A0E10FE0A0E103F0A0E1014084E28E +S219028E04000054E3EFFFFFDA343098E50700A0E10FE0A0E10378 +S219028E19F0A0E10A0000EA50309FE514C093E50380A0E1000084 +S219028E2E5CE30500000A00009CE50710A0E314309CE50620A034 +S219028E43E10FE0A0E103F0A0E118C098E500005CE30500000AAB +S219028E5800009CE50710A0E314309CE50620A0E10FE0A0E10304 +S219028E6DF0A0E1F0A91BE9C0F70300500000000DC0A0E1F0DDB6 +S219028E822DE904B04CE204D04DE20250A0E10060A0E10640A03F +S219028E97E10070A0E3F0819FE5002098E5000052E30600000A14 +S219028EAC0030D2E5000053E30300000A0130D2E425304BE50014 +S219028EC12088E5160000EA060054E10030A0130130A003000016 +S219028ED655E30030A0D3000053E30D00000A0500A0E1A7FFFF2D +S219028EEBEB000000EA325045E2000055E3030000DA25004BE286 +S219028F0061FFFFEB007050E2F8FFFF0A000057E30300001A0012 +S219028F1500E0E3610000EA25004BE248FFFFEB25205BE50030FA +S219028F2AA0E30D0052E30030C4E50200A0E11B00000A080000DD +S219028F3FCA080050E33300000A020000CA030050E30C00000ABC +S219028F54430000EA0A0050E31200000A400000EA2B0050E339BA +S219028F6900000A020000CA240050E33600000A3A0000EA7F00DC +S219028F7E50E32400000A370000EA060054E10300001A00019F5D +S219028F93E554FEFFEB0100E0E3400000EA0100C4E4F0A09FE5F6 +S219028FA8360000EA25205BE5E4A09FE50A0052E30200001A00A5 +S219028FBD30DAE50D0053E30400000A0D0052E30500001A0030C7 +S219028FD2DAE50A0053E30200001A0030A0E325304BE527000009 +S219028FE7EAB0309FE5002093E5000052E30300000A0D00A0E3B6 +S219028FFCDCFEFFEB0A00A0E3DAFEFFEB25305BE50030CAE501D1 +S21902901100A0E3220000EA7CA09FE5060054E11800000A743013 +S2190290269FE5002093E5000052E30500000A0800A0E3CDFEFF79 +S21902903BEB2000A0E3CBFEFFEB0800A0E3C9FEFFEB014044E235 +S2190290500C0000EA060054E10200001AD9F4FFEB0000A0E30E6F +S2190290650000EA30309FE5002093E5000052E30000000ABDFE8F +S21902907AFFEB25305BE514A09FE50130C4E425305BE50030CABB +S21902908FE582FFFFEA64F80300C0250300083703005CF8030096 +S2190290A4F0AD1BE90DC0A0E1F0DF2DE904B04CE204D04DE201F6 +S2190290B970A0E1070052E1078042800280A091000058E32C30DD +S2190290CE0BE50060A0E14D0000DA2C301BE5000053E3040000F8 +S2190290E30AD0009FE5071063E00FE0A0E106F0A0E1030000EAE5 +S2190290F8BC009FE50710A0E10FE0A0E106F0A0E10050A0E310BA +S21902910DA048E2109087E2080055E1040000AA9C009FE5051052 +S219029122D7E70FE0A0E106F0A0E1020000EA8C009FE50FE0A001 +S219029137E106F0A0E1C54FA0E1053064E00130C3E3053063E067 +S21902914C010053E30200001A6C009FE50FE0A0E106F0A0E1A439 +S2190291613EA0E1033085E00730C3E3053063E0070053E3020007 +S219029176001A48009FE50FE0A0E106F0A0E1015085E20F0055F4 +S21902918BE3E0FFFFDA34009FE50FE0A0E106F0A0E10050A0E3BB +S2190291A0080055E1090000AA0510D7E7203041E25E0053E32EBA +S2190291B510A083050000EAC4250300D0250300D8250300DC2597 +S2190291CA0300E02503002010A0E328009FE50FE0A0E106F0A019 +S2190291DFE1015085E20F0055E3ECFFFFDA14009FE50FE0A0E1C8 +S2190291F406F0A0E10970A0E100805AE2010000EAE4250300E853 +S219029209250300B1FFFFCAF0AF1BE90DC0A0E100D82DE9023097 +S21902921EA0E104B04CE201C0A0E10010A0E108009FE50C20A0A6 +S219029233E19BFFFFEB00A81BE9EC8802000DC0A0E100D82DE95C +S2190292480020A0E304B04CE2EFFFFFEB00A81BE90DC0A0E10FA4 +S21902925D002DE930D82DE914B04CE208D04DE248409FE50400B8 +S2190292729BE5005094E508108BE2A5FDFFEB38009FE598FDFF36 +S219029287EB1C004BE20020A0E3002084E50810A0E3F7FEFFEBF1 +S21902929C1C305BE5590053E30000A0130100A003790053E30194 +S2190292B100A003005084E5010000EA64F80300EC25030030A80F +S2190292C61BE90DC0A0E1F0DD2DE904B04CE20040A0E10050A0C4 +S2190292DBE30170A0E10260A0E1FC809FE5FCA09FE52C0000EA89 +S2190292F0054186E70030D4E5015085E2220000EA0030D4E522F7 +S2190293050053E31D00001A052186E0043012E5040053E10140AF +S21902931A8402044002050030D4E50400A0E1000053E32200534D +S21902932F130900000A0430A0E10110D3E45C0051E30340A0010B +S2190293440020D4E50120C0E40130F4E5000053E322005313F5B2 +S219029359FFFF1A0030D4E5000053E30200001A80009FE55EFD46 +S21902936EFFEB040000EA040050E10030A0130030C015050000E9 +S219029383EA014084E20030D4E5000053E30300000A200053E3BB +S219029398D8FFFF1A0030A0E30130C4E40030D4E5000053E30717 +S2190293AD00000A200053E30200001A0130F4E5200053E3FCFFCD +S2190293C2FF0A0030D4E5000053E3C7FFFF1A005087E50800A024 +S2190293D7E1002096E50A10A0E1030000EBF0AD1BE9743A030023 +S2190293EC243B0300042603000DC0A0E1F0DF2DE904B04CE200C1 +S21902940140A0E10280A0E10800A0E101A0A0E14AFDFFEB04505B +S219029416A0E10A0055E10090A0E12C00000A0800A0E100109504 +S21902942BE50920A0E19DFDFFEB000050E32300001A000095E528 +S2190294403EFDFFEB090050E11D0000DA0170A0E30A0054E11473 +S21902945500000A040055E10F00000A0800A0E1001094E5092063 +S21902946AA0E18EFDFFEB006050E20900001A000057E3040000FD +S21902947F0A58009FE50810A0E1002095E50670A0E115FDFFEBC5 +S21902949448009FE5001094E512FDFFEB104084E20A0054E1EA8F +S2190294A9FFFF1A000057E30300001A2C009FE50BFDFFEB07008F +S2190294BEA0E1F0AF1BE90500A0E1F0AF1BE9105085E20A00551F +S2190294D3E1D2FFFF1A0000A0E3F0AF1BE91826030040260300E2 +S2190294E8442603000DC0A0E170D82DE904B04CE20040A0E101AB +S2190294FD50A0E130009FE50260A0E1F7FCFFEB050054E10700CD +S219029512000A20009FE5002094E5083094E50610A0E1F0FCFFC3 +S219029527EB104084E2050054E1F7FFFF1A70A81BE948260300B1 +S21902953C502603000DC0A0E100D82DE90010C0E50C0080E90430 +S219029551B04CE204309BE50C3080E508209BE5102080E50C3052 +S2190295669BE5143080E500A81BE90DC0A0E1F0DF2DE904B04CE1 +S21902957BE20CD04DE200C0A0E334C00BE50CE09BE501A0A0E330 +S2190295902C000BE50A005EE100C0A01301C0A00308E09BE5011A +S2190295A580A0E130300BE500005EE300C0A00300005CE3341032 +S2190295BA1B1500108E1534301BE504C09BE530401BE50C00533B +S2190295CFE1110000AA03C0A0E104009BE5103094E5000053E32D +S2190295E400C08315041094E5000051E30600001A083094E50081 +S2190295F90053E30100000A020053E30100001A0C3094E50010FD +S21902960E83E5184084E2010050E2EFFFFF1A2CE01BE50270A0C2 +S219029623E10E0057E1860000AA071198E70030D1E52D0053E3F4 +S2190296385300001A0050A0E330401BE50500A0E104209BE5013B +S21902964D6087E20190D1E5020055E1440000AA0030D4E50300DF +S21902966259E13C00001A103094E5000053E30600000A0030939A +S219029677E5000053E30300000A94019FE5141094E500A0A0E3D6 +S21902968C96FCFFEB043094E5000053E32000000A070198E702B0 +S2190296A130D0E53D0053E3035080020200000A073188E0017063 +S2190296B687E2045093E5082094E5000052E30200000A0100522E +S2190296CBE30C00000A0D0000EA0500A0E10C1094E50230A0E1C5 +S2190296E05C0000EB006050E20700001A2C019FE50510A0E11419 +S2190296F52094E506A0A0E17AFCFFEB010000EA0C3094E5005049 +S21902970A83E5102094E50130A0E3003082E5036087E00C000011 +S21902971FEA083094E5000053E30200000A020053E30400000A0B +S219029734060000EA0C2094E5003092E5013083E2010000EA0C50 +S2190297492094E50130A0E3003082E50150A0E3040000EA01005D +S21902975E80E204309BE5184084E2030050E1BAFFFFBA00005520 +S219029773E32F00001A0910A0E1A0009FE505A0A0E158FCFFEB8C +S2190297882A0000EA08C09BE500005CE32300000A34E01BE500E9 +S21902979D005EE30300000A10109BE56C009FE500A0A0E34DFC66 +S2190297B2FFEB0C109BE5000051E30200000A010051E30D000093 +S2190297C70A0F0000EA08109BE50C209BE5070198E70230A0E105 +S2190297DC1D0000EB004050E20800001A30009FE510209BE5076A +S2190297F11198E704A0A0E13BFCFFEB020000EA073198E70820BB +S2190298069BE5003082E50130A0E334300BE5036087E006000057 +S21902981BEA5C2603007C260300A426030020009FE5016087E2E2 +S2190298302DFCFFEB08A09BE52CC01BE50670A0E10C0057E17842 +S219029845FFFFBA0A00A0E1000000EAC4260300F0AF1BE90DC07D +S21902985AA0E1F0D92DE904B04CE200C0A0E10140A0E30A50A0B1 +S21902986FE30060A0E30180A0E10270A0E10000DCE503E0A0E1FD +S219029884200050E30200001A0130FCE5200053E3FCFFFF0A00ED +S21902989930DCE5000053E33F00000A000054E30B00000AFF30C8 +S2190298AE03E2300053E30800001A0130DCE5411043E220208306 +S2190298C3E2FF2002E2190051E30230A091780053E31050A00343 +S2190298D802C08C020040A0E30110DCE40400A0E1302041E24157 +S2190298ED3041E2050053E3090052830200009A613041E205009E +S21902990253E30000008A0100A0E3000050E31300000A0000A015 +S219029917E3302041E2FF3002E2090053E30200A0910600009AB9 +S21902992C613041E2050053E3570041920200009A413041E205D1 +S2190299410053E337004192050050E1040000AA0030DCE595065A +S21902995626E0000053E3D0FFFF1A0F0000EA00005EE30B00008C +S21902996B0A0E20A0E10030D2E5010000EA0130F2E5FF3003E239 +S219029980000053E30100000A030051E1F9FFFF1A0030D2E5005D +S2190299950053E30100001A0000A0E3F0A91BE9006088E5000078 +S2190299AA57E300C087150100A0E3F0A91BE90DC0A0E100D82D97 +S2190299BFE90030D0E504B04CE2200053E30200001A0130F0E564 +S2190299D4200053E3FCFFFF0A0000D0E5540050E30030A01301FD +S2190299E930A003740050E30130A003000053E30400001A46007A +S2190299FE50E3660050130200000A0300A0E100A81BE90130A044 +S219029A13E3003081E50100A0E300A81BE90DC0A0E100D82DE952 +S219029A2828309FE5FA0FA0E3482093E504B04CE20FE0A0E10286 +S219029A3DF0A0E114109FE5003091E5013083E20300A0E1003004 +S219029A5281E500A81BE9500000000C3703000DC0A0E110D82DED +S219029A67E904B04CE204D04DE21C409FE5003094E5000093E514 +S219029A7C1C2093E511104BE20FE0A0E102F0A0E1000050E300B6 +S219029A910000EA846B0300F5FFFF1A10A81BE90DC0A0E1F0D8FE +S219029AA62DE904B04CE204D04DE20060A0E398529FE51D704B80 +S219029ABBE20540A0E1003095E5000093E51C2093E50710A0E179 +S219029AD00FE0A0E102F0A0E1000050E39A00000A1D305BE50132 +S219029AE53043E2170053E303F19F97290000EA549B0200609B9A +S219029AFA02009C9B0200949B02009C9B02009C9B02009C9B0239 +S219029B0F009C9B02009C9B02009C9B02009C9B02009C9B02001D +S219029B249C9B02009C9B02009C9B02009C9B02009C9B02009C6C +S219029B399B02009C9B02009C9B02009C9B02009C9B02009C9B58 +S219029B4E0200809B02001C3494E5013083E21C3484E51D305B1C +S219029B63E5020053E30200001A203494E5013083E2203484E58D +S219029B780160A0E3060000EA243494E5013083E2243484E504D1 +S219029B8D00E0E38C0000EA0300E0E38A0000EA000056E3C6FF4B +S219029BA2FF0A003095E5000093E5011B85E21C2093E5081081AC +S219029BB7E20FE0A0E102F0A0E1000050E36000000A003095E586 +S219029BCC000093E5011B85E21C2093E5091081E20FE0A0E102E0 +S219029BE1F0A0E1000050E35700000A0040A0E31D305BE50420EF +S219029BF685E2010053E3042485E5013BA0138030A00310348518 +S219029C0BE5030054E10E0000AA0260A0E1003095E5000093E563 +S219029C201C2093E50710A0E10FE0A0E102F0A0E1000050E34482 +S219029C3500000A1D305BE50430C6E7102495E5014084E2020044 +S219029C4A54E1F1FFFFBA003095E5000093E5011B85E21C2093AC +S219029C5FE50A1081E20FE0A0E102F0A0E1000050E33500000A32 +S219029C74283495E5000053E30800000A003095E5000093E50193 +S219029C891B85E21C2093E50B1081E20FE0A0E102F0A0E1000028 +S219029C9E50E32900000AAC209FE5AC109FE50200D5E70130D5F0 +S219029CB3E7003023E0FF0053E30200000A66FFFFEB0500E0E323 +S219029CC83E0000EA282495E5000052E32400000A00C0A0E310DC +S219029CDD3495E50C40A0E103005CE10D0000AA046085E203002B +S219029CF2A0E164E09FE50430D6E70C18A0E1014084E2213C2350 +S219029D07E08330A0E1B3209EE1000054E1212422E00228A0E1B3 +S219029D1C42C8A0E1F4FFFFBA38209FE538109FE50200D5E7018D +S219029D3130D5E70C28A0E1003483E1220853E11F00000A060050 +S219029D46E0E31E0000EA0200E0E31C0000EA846B03000804006D +S219029D5B0009040000103703000A0400000B04000002C0A0E135 +S219029D70103495E50C40A0E103005CE1090000AA040085E203EB +S219029D8510A0E10430D0E70C28A0E1223883E00338A0E143C80D +S219029D9AA0E1014084E2010054E1F7FFFFBA0600E0E318309FF0 +S219029DAFE50C20A0E10310D5E7FF2002E2020051E10000001AE6 +S219029DC40000A0E3000000EA0A040000F0A81BE90DC0A0E1F02E +S219029DD9DF2DE904B04CE20A80A0E30170A0E1030057E30290C9 +S219029DEEA0E10300001A0130E0E3003089E50000E0E3F0AF1BAC +S219029E03E954519FE5343095E50000E0E30FE0A0E103F0A0E1AC +S219029E180060A0E1342095E53C419FE50FE0A0E102F0A0E11487 +S219029E2D3095E5003084E5342095E50600A0E10FE0A0E102F01F +S219029E42A0E100C094E500009CE50710A0E314309CE57D2EA01F +S219029E57E30FE0A0E103F0A0E10020A0E3102484E50130A0E334 +S219029E6C283484E52C2484E5147484E5182484E505A0A0E11C84 +S219029E812484E50460A0E1202484E50650A0E1242484E513709B +S219029E96A0E300FFFFEB004050E20F00001ABC309FE50320D541 +S219029EABE7000052E30500001A003095E5000093E50C2093E59A +S219029EC00610A0E30FE0A0E102F0A0E1104485E594209FE50113 +S219029ED530A0E30230C5E70400A0E1F0AF1BE9030074E313004B +S219029EEA001A018048E2000058E30030A0D3283485D56C009FF8 +S219029EFFE548309AE50FE0A0E103F0A0E100C096E5281496E595 +S219029F1400009CE5000051E30C209CE51510A0034310A0130FF2 +S219029F29E0A0E102F0A0E1183496E5013083E2183486E505002F +S219029F3E74E30300000A0730A0E1017047E2000053E3D0FFFF4D +S219029F53CA0000E0E3004089E5F0AF1BE950000000846B0300D2 +S219029F68080400000C04000020A107000DC0A0E1F0DF2DE904C2 +S219029F7DB04CE20CD04DE22C000BE50030A0E334300BE501902B +S219029F92A0E1A4019FE5030059E10030A0D30130A0C32C1490C5 +S219029FA7E50060A0E1000051E30030A01330200BE5000053E34B +S219029FBC7F00000A00A0A0E1103490E5000053E35E00001A1365 +S219029FD180A0E364719FE5B0FEFFEB005050E21100001A58116A +S219029FE69FE558419FE50120D6E70430D6E7030052E146000073 +S219029FFB0A013043E2FF3003E2030052E10600001A003096E5D5 +S21902A010000093E50C2093E50610A0E30FE0A0E102F0A0E1306C +S21902A0250000EA0750E0E3050075E33100000A040075E31F0008 +S21902A03A001A003096E5000093E50C2093E50610A0E30FE0A001 +S21902A04FE102F0A0E1143496E5020053E31300001A003096E5CE +S21902A064281496E5000093E5000051E30C2093E51510A00343CE +S21902A07910A0130FE0A0E102F0A0E1183496E5013083E218347C +S21902A08E86E582FEFFEB003096E50050A0E1000093E50C20932E +S21902A0A3E50610A0E30FE0A0E102F0A0E10130A0E32C3486E5C1 +S21902A0B80F0000EA003097E5281497E5000093E5000051E30C77 +S21902A0CD2093E51510A0034310A0130FE0A0E102F0A0E11834E2 +S21902A0E297E5013083E2183487E50830A0E1018048E2000053E1 +S21902A0F7E3B6FFFFCA000055E3110000AA30201BE5005082E5F2 +S21902A10C0030E0E3103486E5290000EA003096E5000093E50C53 +S21902A1212093E50610A0E30FE0A0E102F0A0E10430D6E70130EC +S21902A13683E20430C6E7EEFFFFEA846B0300080400000C0400E3 +S21902A14B0010449AE52C001BE504149AE5040059E10940A0B18A +S21902A1600420A0E133F8FFEB2C301BE534201BE5043083E02CB6 +S21902A175300BE510349AE5042082E034200BE5099064E004241C +S21902A18A9AE5033064E010348AE5042082E004248AE50A00A049 +S21902A19FE12C249AE5000059E30030A0D30130A0C3000052E34C +S21902A1B40030A013000053E380FFFF1A34001BE5F0AF1BE90DFA +S21902A1C9C0A0E100D82DE93C009FE53C109FE504B04CE238E0C1 +S21902A1DE9FE508D04DE234C09FE524349CE500308DE518249C0F +S21902A1F3E504208DE528349CE51C249CE5000053E320349CE52C +S21902A2080E10A001B6F9FFEB030000EAF82603003C270300402E +S21902A21D270300846B030000A81BE90DC0A0E100D82DE9080019 +S21902A23280E204B04CE2070050E300F19F97170000EA9CA2022A +S21902A2470094A202008CA2020084A202007CA2020074A2020033 +S21902A25C6CA2020064A2020040009FE500A81BE93C009FE5009E +S21902A271A81BE938009FE500A81BE934009FE500A81BE9300029 +S21902A2869FE500A81BE92C009FE500A81BE928009FE500A81BC1 +S21902A29BE924009FE500A81BE920009FE500A81BE948270300A8 +S21902A2B05C2703007C2703008827030094270300A0270300B07C +S21902A2C5270300C4270300DC2703000DC0A0E110D82DE90030E3 +S21902A2DAD0E504B04CE2FF0053E30A00001A0130D0E5FF005340 +S21902A2EFE30700001A0230D0E5FF0053E30400001A0330D0E52D +S21902A304FF0053E30100001A0100A0E310A81BE94C409FE50499 +S21902A31920A0E30410A0E100FAFFEB000050E3F7FFFF0A0030AA +S21902A32ED4E5000053E30900001A0130D4E5000053E3060000DB +S21902A3431A0230D4E5000053E30300001A0330D4E50100A0E336 +S21902A358000053E30000000A0000A0E310A81BE9103903000D11 +S21902A36DC0A0E1F0D82DE904B04CE20CD04DE20050A0E10440B3 +S21902A38295E50160A0E1100084E2CFFFFFEB000050E3070000FB +S21902A3970A0400A0E10010D4E50020A0E30F1001E20111A0E11A +S21902A3ACE60000EB0008B0E10200000A0500A0E1D40000EB2DAD +S21902A3C10000EA28704BE20700A0E10C1084E20420A0E397F792 +S21902A3D6FFEB24004BE20610A0E10620A0E393F7FFEB0030D478 +S21902A3EBE5B200D4E10F3003E20361A0E1700100EB000066E05F +S21902A400BC00C5E10930D4E5060053E30C00000A020000CA01CD +S21902A4150053E30300000A140000EA110053E30C00000A11007C +S21902A42A00EA0500A0E1063084E0083085E50710A0E17C010055 +S21902A43FEB0D0000EA0500A0E1063084E0083085E50710A0E1C5 +S21902A454FD0200EB070000EA0500A0E1063084E0083085E50748 +S21902A46910A0E14E1400EB010000EA0500A0E1A50000EBF0A860 +S21902A47E1BE90DC0A0E1F0DF2DE90060A0E1083086E2080113EE +S21902A493E8038048E004B04CE2045096E54801A0E1BC30D6E1FC +S21902A4A80F0000E2083083E0BC30C6E1400080E30000C5E5002C +S21902A4BD70A0E30170C5E501A0A0E1BC00D6E10290A0E13A0192 +S21902A4D200EB80409FE5B200C5E1B000D4E1360100EBB400C5E7 +S21902A4E7E1B030D4E16C109FE5013083E2B030C4E1B670C5E1FC +S21902A4FC4030A0E30830C5E509A0C5E50420A0E3BA70C5E10C99 +S21902A5110085E247F7FFEB100085E20910A0E10420A0E343F7AD +S21902A526FFEB0500A0E10810A0E10720A0E1840000EB0008A051 +S21902A53BE12008A0E11E0100EB041089E2BA00C5E1022BA0E3E1 +S21902A5500600A0E1F00000EBF0AF1BE9B46F0300103903000D6B +S21902A565C0A0E1F0D82DE97C209FE5003092E504B04CE2000012 +S21902A57A53E31A00001A03E0A0E10130A0E3003082E50E40A0BE +S21902A58FE15C709FE504C0A0E158509FE503E0A0E354609FE570 +S21902A5A40500A0E1001096E507208CE0023002E2022083E05EFE +S21902A5B9CE8CE2103085E2042083E70CC08CE2001080E501E085 +S21902A5CE5EE228309FE50010A0E1BE30C0E1144084E2140081E6 +S21902A5E3E2F0FFFF5A001086E5F0A81BE9203903000870030044 +S21902A5F8B86F0300B8870300EA0500000DC0A0E1F0DD2DE904B7 +S21902A60DB04CE20CD04DE20060A0E360509FE50670A0E15CA03E +S21902A6229FE50580A0E1BE30D5E10A00A0E1BCE0D5E10610A05B +S21902A637E1004095E5016086E200308DE510C088E207309CE70D +S21902A64C0520A0E104E08DE5145085E208408DE5147087E2A1E3 +S21902A661F8FFEB030056E3EEFFFFDA14309FE514009FE5001089 +S21902A67693E59BF8FFEB030000EAB86F0300EC270300B8870364 +S21902A68B0018280300F0AD1BE90DC0A0E100D82DE960309FE57F +S21902A6A004B04CE200C093E500005CE31200000A00209CE50088 +S21902A6B52083E510309CE504308CE540109FE5143083E20830E6 +S21902A6CA8CE538E09FE50030A0E3BC30CCE1003091E52C209F8A +S21902A6DFE5013083E2003081E5001092E500009EE5033061E0D0 +S21902A6F4000053E100308EC50C00A0E100A81BE9B88703001800 +S21902A709390300143903001C3903000DC0A0E100D82DE92020D4 +S21902A71E9FE5003092E51C109FE5013043E2003082E500309196 +S21902A733E5003080E504B04CE2000081E500A81BE91839030048 +S21902A748B88703000DC0A0E100D82DE9021051E204B04CE2024E +S21902A75DC0A0E10300004AB230D0E0021051E203C08CE0FBFF52 +S21902A772FF5A010071E30500001A0030D0E5FF20CEE302E083E4 +S21902A787E1FFECCEE30E38A0E123C88CE00C08A0E12C28A0E1B1 +S21902A79C30109FE520C882E00C3061E001005CE103C0A0C10CA8 +S21902A7B100E0E10008A0E12E0880E160E8A0E1200CA0E100082D +S21902A7C6A0E10E0C80E12008A0E100A81BE9FFFF00000DC0A0BB +S21902A7DBE100D82DE90020A0E304D04DE2BC30D0E104B04CE26E +S21902A7F010204BE50910D0E50F104BE5BE20D0E1B011D0E1B21D +S21902A805C1D0E1023083E0013083E0B0215BE10C3083E0B2003E +S21902A81AD0E1023083E0000083E000A81BE90DC0A0E110D82D6A +S21902A82FE904B04CE210D04DE2B8009FE594FFFFEB004050E208 +S21902A8440300001AAC009FE526F8FFEB6BFFFFEBFEFFFFEA1059 +S21902A8591094E594209FE520004BE24C0A00EBBC00C4E100082B +S21902A86EB0E12600000A84209FE5003092E5B4015BE101308399 +S21902A883E2003082E54C0000EB020B50E30500000A68309FE59E +S21902A898030050E10C00000A0400A0E19AFFFFEBE2FFFFEA5434 +S21902A8AD309FE5002093E5101094E5012082E2002083E5041089 +S21902A8C284E50400A0E11A104BE2A6FEFFEBD8FFFFEA30309FE8 +S21902A8D7E5002093E5101094E5012082E2002083E5041084E5C5 +S21902A8EC0400A0E1E60300EBCFFFFFEAEA050000282803002CD2 +S21902A9013903000608000024390300283903000400A0E17EFF2A +S21902A916FFEB10A81BE90DC0A0E170D82DE904B04CE210D04DC4 +S21902A92BE20050A0E128604BE20600A0E10240A0E10620A0E3B5 +S21902A9403CF6FFEB22004BE238109FE50620A0E338F6FFEB04FF +S21902A95548A0E12408A0E1170000EBBC014BE1101095E5BC200F +S21902A96AD5E10600A0E18C0900EB10209FE5003092E501308305 +S21902A97FE2003082E5010000EAB0F703003039030070A81BE926 +S21902A9940DC0A0E1203CA0E1003C83E1FF2800E200D82DE9FFE6 +S21902A9A90C00E20004A0E1220480E1000083E104B04CE200A8AA +S21902A9BE1BE90DC0A0E100D82DE90008A0E1FF3800E2200CA0CF +S21902A9D3E1230480E104B04CE200A81BE90DC0A0E100D82DE935 +S21902A9E820209FE5003092E504B04CE2000053E30200001A00B4 +S21902A9FD0082E50300A0E100A81BE90000E0E300A81BE9BC87F5 +S21902AA1203000DC0A0E100D82DE90030A0E308209FE504B04C8A +S21902AA27E2003082E500A81BE9BC8703000DC0A0E130D82DE93C +S21902AA3C0040A0E1080094E504B04CE2B030D0E10150A0E1086F +S21902AA510053E31700001ABC10D4E10020A0E339FFFFEB000834 +S21902AA66A0E120C8B0E11100001A083094E500C0C3E5082094DA +S21902AA7BE5B2C0C2E1080094E5BC10D4E10C20A0E12EFFFFEBFF +S21902AA900008A0E12008A0E1C8FFFFEB083094E50110A0E3B2D0 +S21902AAA500C3E10520A0E10400A0E172FEFFEB070000EA243027 +S21902AABA9FE5003093E5000053E30300000A0400A0E10510A0D7 +S21902AACFE10FE0A0E103F0A0E10400A0E10CFFFFEB30A81BE950 +S21902AAE4BC8703000DC0A0E1F0DF2DE904B04CE204D04DE200F8 +S21902AAF960A0E10140A0E1307086E2048097E5020014E3085045 +S21902AB0E97E50290A0E10F00000A1830A0E3BC30C7E10C30D513 +S21902AB23E550019FE59030C3E3603083E30C30C5E596FFFFEB9B +S21902AB382C104BE22C000BE50420A0E3140085E2BAF5FFEB00C1 +S21902AB4D30A0E3B831C6E1060000EAB831D6E1143083E2BC3084 +S21902AB62C7E10C20D5E5A020C2E3502082E30C20C5E50C30D528 +S21902AB77E50F30C3E30C30C5E5580096E582FFFFEB040085E566 +S21902AB8C540096E57FFFFFEB0030A0E3B031C5E1000059E308F8 +S21902ABA10085E508A086E21800001AB401D6E182FFFFEBB00065 +S21902ABB6C5E1B601D6E17FFFFFEBB200C5E10D40C5E5B831D6F9 +S21902ABCBE1000053E3083084130D30C515A0009FE577FFFFEBED +S21902ABE0BE00C5E1B291C5E10420A0E390109FE50C0088E28F3C +S21902ABF5F5FFEB100088E20A10A0E10420A0E38BF5FFEB063009 +S21902AC0AA0E30930C8E5BC00D7E169FFFFEBB200C8E1BC40D7D1 +S21902AC1FE10800A0E1EBFEFFEB0020A0E10500A0E10410A0E120 +S21902AC34C4FEFFEB0008A0E12008A0E15EFFFFEB0610A0E3B096 +S21902AC4901C5E10A20A0E10700A0E109FEFFEB043096E50A006B +S21902AC5E53E30A00001A1C109FE51C0086E218209FE50630A0BA +S21902AC73E1B20200EB110000EAB2050402B2050000103903008A +S21902AC88C0D4010090AE02000D30D5E5030013E30200001AB817 +S21902AC9D31D6E1000053E30600000A1C0086E2FA1FA0E3082025 +S21902ACB29FE50630A0E1A10200EB000000EA74AE0200F0AF1BF5 +S21902ACC7E90DC0A0E1F0DF2DE904B04CE208D04DE22C000BE550 +S21902ACDC2C301BE5089090E5046093E5080099E530100BE5273A +S21902ACF1FFFFEB00A0A0E1040099E524FFFFEB0080A0E1B200FB +S21902AD06D9E12CFFFFEB0058A0E1B000D9E14558A0E128FFFFDB +S21902AD1BEB149086E20048A0E12C301BE51470A0E3BC70C3E129 +S21902AD300A00A0E15030A0E30C30C9E54448A0E113FFFFEB0482 +S21902AD450089E50800A0E110FFFFEB080089E5010BA0E318FFE6 +S21902AD5AFFEBBE00C9E10030A0E3B231C9E10558A0E1B031C9C3 +S21902AD6FE12508A0E111FFFFEBB401C6E10448A0E12408A0E169 +S21902AD840DFFFFEBB200C9E10D70C9E50420A0E370109FE50C7F +S21902AD990086E225F5FFEB100086E230101BE50420A0E321F5BD +S21902ADAEFFEB0650A0E30950C6E52C301BE5BC00D3E1FEFEFFFB +S21902ADC3EBB200C6E12C301BE5BC40D3E10600A0E17FFEFFEB36 +S21902ADD80020A0E10900A0E10410A0E158FEFFEB0008A0E120B6 +S21902ADED08A0E1F2FEFFEBB001C9E130201BE52C001BE50510FB +S21902AE02A0E19DFDFFEB000000EA10390300F0AF1BE90DC0A0E9 +S21902AE17E100D82DE94C309FE50010A0E3002093E504B04CE243 +S21902AE2C010052E10D00000A03C0A0E1000052E10600001A0028 +S21902AE410051E30200000A003092E5003081E5010000EA00305D +S21902AE5692E500308CE50210A0E1002092E5000052E3F2FFFF79 +S21902AE6B1A00A81BE9C08703000DC0A0E100D82DE90010A0E3EC +S21902AE800120A0E304B04CE216FFFFEB00A81BE90DC0A0E10037 +S21902AE95D82DE90030A0E3043080E504B04CE2DAFFFFEB00A81A +S21902AEAA1BE90DC0A0E110D82DE90040A0E1440094E504B04CBE +S21902AEBFE2000050E30500000A003090E5443084E50FFEFFEBDA +S21902AED4440094E5000050E3F9FFFF1A10A81BE90DC0A0E11047 +S21902AEE9D82DE90030A0E304B04CE20040A0E1043084E51C0050 +S21902AEFE84E2290200EB0400A0E1E7FFFFEB0400A0E1BFFFFF25 +S21902AF13EB10A81BE90DC0A0E1F0D82DE90170A0E1082097E5B9 +S21902AF28BC10D7E104B04CE20C30D2E50050A0E1040092E52345 +S21902AF3D32A0E10331A0E1014063E0036082E090FEFFEB54205B +S21902AF5295E5003062E0000053E3170000CA023060E0044063C7 +S21902AF67E0036086E0000054E3120000DA043082E0543085E57E +S21902AF7C442095E50030A0E3003087E5030052E10600000A0046 +S21902AF910000EA002092E5003092E5000053E3FBFFFF1A0070C3 +S21902AFA682E5020000EA447085E54C4085E5486085E50100A075 +S21902AFBBE3F0A81BE90000A0E3F0A81BE90DC0A0E130D82DE970 +S21902AFD0083091E50040A0E1080093E504B04CE26BFEFFEB58E9 +S21902AFE53094E50050A0E1053063E0000053E3140000DA1C001E +S21902AFFA84E2EA0100EB582094E5B831D4E1051062E0030051C5 +S21902B00FE10310A0A1000051E30B0000DAB831D4E1033061E0C5 +S21902B024B831C4E1012082E0582084E50338B0E10400000A380C +S21902B0390094E5B821D4E1140080E2011080E07AF4FFEB30A8DD +S21902B04E1BE90DC0A0E1F0DD2DE90080A0E1BC00D8E10860983B +S21902B063E504B04CE2044098E50170A0E152FEFFEBB200C4E1C6 +S21902B07800A0A0E3BC50D8E10400A0E1D3FDFFEB0020A0E106EE +S21902B08D00A0E10510A0E1ACFDFFEB0008B0E1F600001AC4335D +S21902B0A29FE5005093E5000000EA005095E5000055E312000048 +S21902B0B70AB200D6E1B441D5E13EFEFFEB000054E1F7FFFF1AF5 +S21902B0CCB631D5E1000053E30A00000AB000D6E10340A0E13620 +S21902B0E1FEFFEB000054E1EFFFFF1A0700A0E1081085E2042004 +S21902B0F6A0E38AF6FFEB000050E3E9FFFF1A000055E3D800000D +S21902B10B0A0C0085E2041087E20620A0E346F4FFEB043095E5B3 +S21902B120020053E30700000A0D30D6E5040013E30400000A05C5 +S21902B13500A0E169FFFFEB0800A0E173FDFFEBF0AD1BE9043073 +S21902B14A95E5013043E2090053E303F19F97C20000EA84B102CD +S21902B15F00E4B102007CB402004CB202004CB20200F8B202005F +S21902B1743CB30200D0B3020014B4020058B402000D30D6E50277 +S21902B1890013E31000000A0230A0E3043085E5040096E5FCFDCF +S21902B19EFFEB013080E2B000D6E1543085E503FEFFEBB601C55C +S21902B1B3E1002097E51210A0E3082085E50030A0E3B831C5E18A +S21902B1C80500A0E1B035C5E18C0000EA0800A0E10710A0E1B90A +S21902B1DDFEFFEBA50000EA1C0085E26F0100EB0D30D6E50410F5 +S21902B1F213E20200000A0130A0E3043085E59D0000EA02001352 +S21902B207E30300000A0500A0E10120A0E333FEFFEB970000EA75 +S21902B21C100013E39500000A080096E5D9FDFFEB583095E5012B +S21902B2313083E2030050E18F00001A0430A0E3043085E55800E2 +S21902B24685E58B0000EA0D30D6E5544095E5100013E3020000FF +S21902B25B0A0500A0E10810A0E157FFFFEB0500A0E10810A0E14F +S21902B27028FFFFEB0D30D6E500A0A0E1010013E30800000A048B +S21902B2850096E5C1FDFFEB543095E5030050E10300001A01300A +S21902B29A80E2543085E50520A0E3042085E5543095E5040053BD +S21902B2AFE10200001AB035D5E1000053E36E00000AB841D5E18E +S21902B2C4000054E30700001A1C0085E2350100EB0500A0E110DC +S21902B2D910A0E30420A0E100FEFFEBB045C5E1630000EA013020 +S21902B2EEA0E3B035C5E1600000EA0D30D6E5100013E35D000091 +S21902B3030A0500A0E10810A0E12DFFFFEB080096E59EFDFFEBE7 +S21902B318583095E5013083E2030050E15400001A0030A0E30428 +S21902B32D3085E50500A0E1B6FEFFEB4F0000EA0D30D6E5100005 +S21902B34213E31700000A0500A0E10810A0E11CFFFFEB08009616 +S21902B357E58DFDFFEB583095E5013083E2030050E10E00001A8D +S21902B36C0D30D6E5010013E30900000A0500A0E11010A0E35446 +S21902B3813095E50A20A0E3042085E5013083E2543085E50A201D +S21902B39642E2D2FDFFEB010000EA0830A0E3043085E50D30D667 +S21902B3ABE5010013E33100000A1C0085E2FB0000EB0500A0E180 +S21902B3C01110A0E3543095E50920A0E30A0000EA0500A0E108A1 +S21902B3D510A0E1CEFEFFEB0D30D6E500A0A0E1010013E32300E2 +S21902B3EA000A0500A0E11010A0E3543095E50A20A0E3042085C0 +S21902B3FFE5013083E2543085E50020A0E3B5FDFFEB190000EA87 +S21902B4140D30D6E5100013E31600000A0500A0E10810A0E1E6F9 +S21902B429FEFFEB080096E557FDFFEB583095E5013083E20300C3 +S21902B43E50E10D00001A1C0085E2D70000EB0A30A0E3043085DF +S21902B453E5080000EA0500A0E10010A0E30120A0E39FFDFFEBC3 +S21902B468030000EAC08703000800A0E10710A0E112FEFFEB0076 +S21902B47D005AE30100001A0800A0E1A1FCFFEBF0AD1BE90DC0DD +S21902B492A0E100D82DE904B04CE2E1FCFFEBD90000EB00A81BFF +S21902B4A7E90DC0A0E130D82DE954209FE504B04CE20040A0E199 +S21902B4BC0158A0E14558A0E10010A0E38EF3FFEB0130A0E304C6 +S21902B4D13084E5B451C4E15C2084E2402084E5342084E5241080 +S21902B4E69FE524209FE5703084E2383084E5BE23C4E1003091E0 +S21902B4FBE5003084E50000A0E3004081E530A81BE94806000064 +S21902B510C0870300EA0500000DC0A0E110D82DE90040A0E104D5 +S21902B5253094E504B04CE2010000EAD6FFFFEB043094E5000028 +S21902B53A53E30200000AB831D4E1000053E3F8FFFF1A10A81BFC +S21902B54FE90DC0A0E110D82DE904B04CE20040A0E1ECFFFFEB33 +S21902B564041094E5020051E30030A0130130A003040051E30316 +S21902B57920A0110120A003000052E30600000A0400A0E1111036 +S21902B58EA0E30730A0E3043084E50020A0E351FDFFEB060000E6 +S21902B5A3EA050051E30400001A0400A0E10630A0E3043084E570 +S21902B5B81110A0E349FDFFEB0400A0E138FEFFEB10A81BE90D35 +S21902B5CDC0A0E1F0D82DE904B04CE20160A0E1005052E20040BB +S21902B5E2A0E1020000DA4C3094E5000053E30300001A0000A008 +S21902B5F7E3F0A81BE94C0084E52B0000EA043094E5040053E308 +S21902B60C0070A0E3170000EA481094E50600A0E105F3FFEB4CA8 +S21902B6213094E5440094E5037087E0002090E5036086E044200B +S21902B63684E5055063E034FCFFEB440094E5000050E3EBFFFF04 +S21902B64B0A081090E50C30D1E5BC20D0E12332A0E1032142E0B1 +S21902B6604C2084E50C30D1E52332A0E1031181E0481084E500FB +S21902B6750055E30D00000A4C2094E5020055E1E2FFFFAA0600BD +S21902B68AA0E1481094E50520A0E1E7F2FFEB483094E5057087FC +S21902B69FE04C2094E5053083E0483084E5022065E04C2084E515 +S21902B6B40700A0E1F0A81BE90DC0A0E170D82DE904B04CE200C8 +S21902B6C940A0E1380094E5005052E2010000CA0000A0E370A809 +S21902B6DE1BE9043094E5043043E2010053E30100009A0000E094 +S21902B6F3E370A81BE9B861D4E1000056E30C00001A34309FE527 +S21902B708140080E2030055E10350A0210520A0E1C6F2FFEB0416 +S21902B71D00A0E11010A0E3B851C4E10620A0E1EDFCFFEB0500BF +S21902B732A0E170A81BE90000A0E370A81BE9B20500000DC0A09B +S21902B747E170D82DE904B04CE20060A0E10240A0E1041086E5A2 +S21902B75C0350A0E1AEF8FFEB080086E50C4086E534309FE5005B +S21902B7712093E50310A0E1105086E5000052E30400000A06007C +S21902B78652E10500000A002092E5000052E3FAFFFF1A003091C6 +S21902B79BE5003086E5006081E570A81BE9C48703000DC0A0E194 +S21902B7B000D82DE94C109FE50020A0E3003091E504B04CE20282 +S21902B7C50053E10D00000A000053E10700001A000052E3020091 +S21902B7DA000A003093E5003082E500A81BE9003093E500308105 +S21902B7EFE500A81BE90320A0E1003093E5000053E3F1FFFF1A22 +S21902B80400A81BE9C48703000DC0A0E170D82DE970309FE5045A +S21902B819B04CE20050A0E3004093E50360A0E1050054E1150077 +S21902B82E000A7AF8FFEB0C0094E9000063E0020050E10C00008D +S21902B8433A000055E30200000A003094E5003085E5010000EA3D +S21902B858003094E5003086E5100094E50FE0A0E10CF094E50022 +S21902B86D4096E50050A0E3010000EA0450A0E1004094E50000B8 +S21902B88254E3E9FFFF1A70A81BE9C48703000DC0A0E1F0D92DC4 +S21902B897E90070A0E1045097E5B200D5E104B04CE244FCFFEB77 +S21902B8AC0040A0E1B000D5E141FCFFEB010050E3020B54033B5F +S21902B8C100001A186085E20600A0E1EC809FE50420A0E308103C +S21902B8D6A0E192F4FFEB000050E33300001AB600D5E134FCFF4A +S21902B8EBEB010050E31C00001A0200A0E330FCFFEB0E4085E29C +S21902B9000410A0E1B600C5E10420A0E30600A0E148F2FFEB12D6 +S21902B9156085E20600A0E1085085E20510A0E10620A0E342F296 +S21902B92AFFEB0400A0E10810A0E10420A0E33EF2FFEB0500A093 +S21902B93FE17C109FE50620A0E33AF2FFEB1C30A0E3BC30C7E1D9 +S21902B9540700A0E168209FE50610A0E1EDFBFFEB120000EAB628 +S21902B96900D5E113FCFFEB020050E30E00001A4C409FE5003076 +S21902B97E94E5000053E30A00000A0E1085E2080094E50420A020 +S21902B993E363F4FFEB006050E20400001A081085E2040094E5C8 +S21902B9A80620A0E321F2FFEB006084E50700A0E155FBFFEBF062 +S21902B9BDA91BE910390300B0F7030006080000C88703000DC09E +S21902B9D2A0E1F0DF2DE90420A0E304B04CE208D04DE200A0A023 +S21902B9E7E114519FE50180A0E10510A0E14BF4FFEB004050E247 +S21902B9FC0500001A0800A0E1FC109FE50620A0E309F2FFEB0465 +S21902BA1100A0E14D0000EA2C00A0E31CFBFFEB007050E204000B +S21902BA26001A470000EA0700A0E137FBFFEB0400A0E14400004C +S21902BA3BEA044097E50100A0E3DDFBFFEBB600C4E10100A0E320 +S21902BA50DAFBFFEBB000C4E1020BA0E3D7FBFFEB0510A0E106DE +S21902BA6560A0E3B200C4E10450A0E30460C4E50520A0E10550AC +S21902BA7AC4E50E0084E2ECF1FFEB080084E278109FE50620A08C +S21902BA8FE1E8F1FFEB180084E20A10A0E10520A0E1E4F1FFEB79 +S21902BAA4FF30A0E330304BE52F304BE52E304BE52D304BE52C6E +S21902BAB9304BE52B304BE544209FE5016086E2048082E530902A +S21902BACE4BE208A082E5FE3043E2003082E50280A0E11C30A047 +S21902BAE3E3BC30C7E10700A0E11C209FE50910A0E188FBFFEB81 +S21902BAF8C8F7FFEB0050A0E1070000EA10390300B0F70300C809 +S21902BB0D8703000608000043FBFFEB004098E5000054E3C1FFA8 +S21902BB22FF0ABDF7FFEB000065E0F90050E3F7FFFF9A0630A08A +S21902BB37E1016046E2000053E3E6FFFFCA0700A0E1F1FAFFEB47 +S21902BB4C0000E0E3F0AF1BE90DC0A0E1F0DD2DE904B04CE20064 +S21902BB6180A0E10150A0E1A0A09FE50070A0E30A60A0E108004B +S21902BB76A0E10640A0E10410A0E10420A0E3E7F3FFEB003050EB +S21902BB8BE20E00000A0C6084E2017087E20F0057E3F4FFFFDAE3 +S21902BBA00500A0E10810A0E10420A0E3A1F1FFEB0800A0E104BA +S21902BBB51085E284FFFFEB000050E3050000AA0000E0E3F0AD4E +S21902BBCA1BE9070096E8070085E80300A0E1F0AD1BE930E09F8E +S21902BBDFE500C09EE5070095E88C308CE003318AE0070083E866 +S21902BBF401C08CE200C08EE510005CE30030A00300308E0500EE +S21902BC0900A0E3F0AD1BE9D4870300343903000DC0A0E1F0DF10 +S21902BC1E2DE904B04CE204D04DE20050A0E10180A0E164419FF8 +S21902BC33E50260A0E12CC014E50390A0E100005CE30A30A01308 +S21902BC483F00001A0100A0E35AFBFFEB0000C4E52004A0E10175 +S21902BC5D00C4E50500A0E10030D0E5022084E2000053E30300F6 +S21902BC72000A0130C2E40130F0E5000053E3FBFFFF1A0030A0B6 +S21902BC87E30130C2E4030056E108019F050300000A010056E3B9 +S21902BC9C0A30A0132900001AF8009FE50030D0E5F4709FE50013 +S21902BCB10053E30300000A0130C2E40130F0E5000053E3FBFF27 +S21902BCC6FF1A0050A0E3D8609FE50510A0E10050C2E50600A087 +S21902BCDBE10C20A0E388F1FFEB144046E201A0A0E3BAA1C4E1BA +S21902BCF00500A0E126FBFFEB140084E5003097E5B000D7E10A0C +S21902BD053083E0003087E52BFBFFEBB801C4E1B430D8E10500E3 +S21902BD1A53E10200001A4500A0E325FBFFEBB400C8E1180086F0 +S21902BD2FE20820A0E174109FE50630A0E19B0E00EB000050E3E7 +S21902BD44030000AA0930A0E3003089E50000E0E31D0000EA4CC6 +S21902BD59309FE514A003E50C5084E50060E0E3106084E5290094 +S21902BD6E4BE2085084E50A10A0E1045084E50920A0E11B0000AE +S21902BD83EB010050E30900000A18309FE5145003E50000E0E397 +S21902BD980C0000EAC088030048280300542803003C390300A83C +S21902BDAD88030005020000343294E50500A0E10C2094E50130AD +S21902BDC243E2343284E5012082E20C2084E5F0AF1BE90DC0A047 +S21902BDD7E100D82DE90000A0E308309FE504B04CE2000083E5F8 +S21902BDEC00A81BE9948803000DC0A0E1F0DF2DE904B04CE21843 +S21902BE01D04DE234000BE50030A0E33C300BE538100BE5028039 +S21902BE16A0E10C629FE5010053E1870000AA2C5046E20C3095C2 +S21902BE2BE5000053E3150000DA34001BE538C01BE53C201BE569 +S21902BE40341295E50C4062E0040053E10340A0B10420A0E1F730 +S21902BE55F0FFEB34C01BE5343295E504C08CE034C00BE50C20E3 +S21902BE6A95E5043083E0343285E5022064E00C2085E53C101B78 +S21902BE7FE5041081E03C100BE5690000EA103095E5020C53E3C0 +S21902BE946A00003A0130A0E388019FE50020A0E330300BE5201A +S21902BEA99085E22C200BE514A085E274119FE530304BE2003069 +S21902BEBE8DE50920A0E10A30A0E17F0E00EB004050E20470A093 +S21902BED3E31C0000AA043095E5013083E2043085E50F0053E383 +S21902BEE8020000CA083095E5000053E30100001A0830A0E3476D +S21902BEFD0000EA0700A0E1ADFAFFEB0000C6E52004A0E10100D5 +S21902BF12C6E5B800D5E1A8FAFFEB0200C6E50710A0E12004A065 +S21902BF27E10300C6E50920A0E1F4009FE50A30A0E11C0E00EB7D +S21902BF3C000050E33B0000AA0930A0E3340000EA0030D6E5010B +S21902BF5100D6E5000483E198FAFFEB030050E32000001A023093 +S21902BF66D6E50300D6E5000483E192FAFFEB083095E501308302 +S21902BF7BE2030050E10500001A044044E2104085E50C4085E59B +S21902BF90043086E2343285E5080085E50700A0E186FAFFEB00C5 +S21902BFA500C6E52004A0E10100C6E5B800D5E181FAFFEB0200AF +S21902BFBAC6E50710A0E12004A0E10300C6E50920A0E158009F34 +S21902BFCFE50A30A0E1F50D00EB000050E3140000AA0930A0E31C +S21902BFE40D0000EA0030D6E50100D6E5000483E171FAFFEB05E1 +S21902BFF90050E30600001A0230D6E50300D6E5000483E16BFA61 +S21902C00EFFEB000088E50000E0E30A0000EA0B30A0E300308892 +S21902C023E50000E0E3060000EAC0880300050200003C201BE5BB +S21902C03838301BE5030052E178FFFFBA3C001BE5F0AF1BE90D32 +S21902C04DC0A0E100D82DE9010040E204B04CE20B0050E300F174 +S21902C0629F97230000EA98C00200A0C00200A8C00200B0C002E7 +S21902C07700B8C00200C0C00200C8C00200D0C00200D8C00200FB +S21902C08CE0C00200E8C00200F0C0020060009FE500A81BE95CAE +S21902C0A1009FE500A81BE958009FE500A81BE954009FE500A84B +S21902C0B61BE950009FE500A81BE94C009FE500A81BE948009F87 +S21902C0CBE500A81BE944009FE500A81BE940009FE500A81BE9E4 +S21902C0E03C009FE500A81BE938009FE500A81BE934009FE500B8 +S21902C0F5A81BE930009FE500A81BE96C2803007C28030090282D +S21902C10A0300B4280300CC280300E0280300F4280300042903E6 +S21902C11F001829030034290300482903005C2903005C280300DD +S21902C1340DC0A0E1F0DF2DE904B04CE20040A0E10190A0E10007 +S21902C149A0A0E30A80A0E10160A0E30070A0E301C0D4E40A5002 +S21902C15EA0E307005CE13500000A30005CE30030A0130130A09C +S21902C17303030016E10A00000A0030D4E5411043E2202083E29B +S21902C188FF2002E2190051E30230A091780053E30200001A100E +S21902C19D50A0E3014084E201C0D4E400E0A0E30E60A0E1301001 +S21902C1B24CE2FF0001E241204CE2FF3002E2050053E30900502B +S21902C1C7830200009A61304CE2050053E30000008A01E0A0E355 +S21902C1DC00005EE31200000A0000A0E3FF3001E2090053E30115 +S21902C1F100A0910600009A61304CE2050053E357004C92020030 +S21902C206009AFF3002E2050053E337004C92050050E1040000E5 +S21902C21BAA01C0D4E4950727E000005CE3CEFFFF1A030000EA2F +S21902C2302E005CE30100000A0000A0E3F0AF1BE9033068E28354 +S21902C24531A0E117A38AE1018088E2030058E3BDFFFFDA0A003E +S21902C25AA0E1CCF9FFEB000089E50100A0E3F0AF1BE90DC0A096 +S21902C26FE110D82DE90010A0E108D04DE20230D1E528409FE568 +S21902C28400308DE50320D1E504208DE50020D1E50130D1E504CC +S21902C299B04CE210109FE50400A0E182F1FFEB0400A0E101009F +S21902C2AE00EACC8A03007829030010A81BE90DC0A0E1F0D82D8E +S21902C2C3E904B04CE200E0A0E108C09EE5FF1001E204609BE512 +S21902C2D80250A0E1000096E50370A0E108208EE2140092E804DE +S21902C2ED4082E000C08CE0140000EA010052E10E00001A0230DB +S21902C302DCE508009EE502E093E20500000A0E10A0E10030DCC2 +S21902C317E5011051E20130C5E402C08CE2FAFFFF1A00E087E579 +S21902C32C0C3060E0003086E50100A0E3F0A81BE90230DCE58348 +S21902C34130A0E1043083E203C08CE004005CE10300002A0020D9 +S21902C356DCE5FF3002E2FF0053E3E4FFFF1A0000A0E3F0A81B90 +S21902C36BE90DC0A0E100D82DE9083090E5FF2002E20120C3E716 +S21902C38004B04CE200A81BE90DC0A0E100D82DE90610A0E3003E +S21902C3952090E504B04CE201C0D2E45C31A0E1010013E3010098 +S21902C3AA000A0130D2E4A32382E0011051E2F8FFFF5A0020802A +S21902C3BFE500A81BE90DC0A0E100D82DE9002090E50130D2E419 +S21902C3D404B04CE21C1003E21C0051E301208212033003E2033A +S21902C3E90053E301208212002080E500A81BE90DC0A0E1F0DFFF +S21902C3FE2DE904B04CE20040A0E30090A0E100C099E50460A015 +S21902C413E10120DCE401E0A0E1603002E2A332A0E14430CEE5F8 +S21902C428800012E34100000A0120DCE40470A0E10F3002E2013E +S21902C43D3083E240308EE5030057E13A0000AA303002E223A243 +S21902C452A0E12283A0E10750A0E103005AE30AF19F97130000CB +S21902C467EAB8C4020078C4020080C4020094C402000160DCE452 +S21902C47C0D0000EA0120DCE50030DCE5026483E102C08CE208D8 +S21902C4910000EA0300DCE50020DCE50230DCE50110DCE5002C0F +S21902C4A682E10338A0E1013483E1036082E104C08CE20E6085D7 +S21902C4BBE7030058E308F19F97130000EA18C50200D8C4020097 +S21902C4D0E0C40200F4C402000140DCE40D0000EA0120DCE50016 +S21902C4E530DCE5024483E102C08CE2080000EA0300DCE500209A +S21902C4FADCE50230DCE50110DCE5002C82E10338A0E10134839D +S21902C50FE1034082E104C08CE2014084E220308EE2054083E741 +S21902C524017087E240309EE5045085E2030057E1C8FFFFBA00B8 +S21902C539C089E5F0AF1BE90DC0A0E130D82DE904B04CE204D0F3 +S21902C54E4DE200C0A0E118000BE50C10A0E10130D1E40250A0E4 +S21902C563E1FF3003E218100BE51B0053E30800000A18C00BE584 +S21902C57810009FE510109FE50020DCE5B9EEFFEB0000A0E32456 +S21902C58D0000EA84290300A8290300010081E218000BE5012097 +S21902C5A2D1E5011080E218100BE53F3002E20030C5E58000127D +S21902C5B7E30300000A0130D0E50130C5E5012081E218200BE50B +S21902C5CC18301BE50140D3E40240C5E518300BE5010014E301F6 +S21902C5E100000A18004BE266FFFFEB020014E30100000A180084 +S21902C5F64BE262FFFFEB040014E30100000A18004BE26DFFFFFB +S21902C60BEB080014E30200000A18004BE2041085E275FFFFEBFF +S21902C6200100A0E330A81BE90DC0A0E100D82DE904B04CE20080 +S21902C635C0A0E10130DCE402E0A0E11A0053E30500000A900065 +S21902C64A9FE590109FE501205CE585EEFFEB0000A0E300A81B27 +S21902C65FE901C08CE20100DCE40030A0E301C08CE200308EE561 +S21902C674031010E20500004A0320A0E10130DCE7022483E10133 +S21902C6891051E2FBFFFF5A00208EE5033000E2013083E203C0FE +S21902C69E8CE00010A0E33C3000E22331A0E1013083E204308E06 +S21902C6B3E5030051E1060000AA08008EE20130DCE40130C0E760 +S21902C6C804209EE5011081E2020051E1F9FFFFBA0100A0E300D2 +S21902C6DDA81BE984290300BC2903000DC0A0E100D82DE90010B1 +S21902C6F250E204B04CE20300000A10009FE55AEEFFEB0000A0A5 +S21902C707E300A81BE904009FE500A81BE9CC290300EC8A0300E2 +S21902C71C0DC0A0E130D82DE904B04CE20050A0E31C409FE50000 +S21902C7315084E50400A0E1F4E0FFEB2C4084E2015085E2000066 +S21902C74655E3F8FFFFDA30A81BE9EC8A03000DC0A0E100D82D27 +S21902C75BE904B04CE235E1FFEB00A81BE90DC0A0E100D82DE90F +S21902C77004B04CE262E1FFEB00A81BE90DC0A0E110D82DE94066 +S21902C785409FE51C3094E504B04CE2000053E30100000A0000EC +S21902C79AA0E310A81BE9030084E85CE1FFEB000050E305000076 +S21902C7AF1A083094E50120A0E31C2084E5003063E2103084E53C +S21902C7C410A81BE910A81BE990F703000DC0A0E100D82DE93CDF +S21902C7D9209FE50010A0E11C3092E504B04CE2000053E3010033 +S21902C7EE001A0700A0E300A81BE9143092E5030051E1030000EC +S21902C8033A183092E50000A0E3030051E10000003A0100A0E3AA +S21902C81800A81BE990F703000DC0A0E100D82DE930009FE504DA +S21902C82DB04CE21C3090E502C0A0E1000053E30500000A143084 +S21902C84290E5003081E5182090E500208CE50000A0E300A81B4B +S21902C857E90700A0E300A81BE990F703000DC0A0E100D82DE9E0 +S21902C86C2C209FE51C3092E504B04CE2000053E30500000A08EE +S21902C8813092E5003080E50C2092E5002081E50000A0E300A80B +S21902C8961BE90700A0E300A81BE990F703000DC0A0E1F0DF2D78 +S21902C8ABE904B04CE200A0A0E30050A0E10180A0E1F8C09FE574 +S21902C8C00290A0E11C309CE50C70A0E10A0053E10100001A071F +S21902C8D500A0E3F0AF1BE9006097E5D8109FE5D8209FE5060057 +S21902C8EAA0E1022061E050EEFFEB0E02A0E3021A80E220209045 +S21902C8FFE4000031E1FCFFFF1A0000A0E3160F07EE9A0F07EED8 +S21902C914101F11EE011AC1E3101F01EE0010A0E3151F07EE0040 +S21902C92900A0E10000A0E10000A0E10000A0E10000A0E100006D +S21902C93EA0E1103097E5034005E00410A0E1085085E070009F17 +S21902C953E50520A0E1E3EFFFEB68809FE5040000EA083097E573 +S21902C96860009FE50130C3E3034084E0DCEFFFEB050054E1065C +S21902C97D00002A0400A0E10FE0A0E106F0A0E137E1FFEB00A066 +S21902C99250E2F2FFFF0A004089E5101F11EE011A81E30310816E +S21902C9A7E3101F01EE0800A0E1CDEFFFEB0A00A0E1F0AF1BE916 +S21902C9BC90F7030008DD020024DE0200E8290300042A030000A5 +S21902C9D12A03000DC0A0E1F0DF2DE904B04CE204D04DE2027093 +S21902C9E6A0E10090A0E30050A0E194C09FE50160A0E11C209C3E +S21902C9FBE50CA0A0E12C300BE5090052E10700A0033F00000A93 +S21902CA1000809AE574109FE574209FE50800A0E1022061E003FC +S21902CA25EEFFEB0E02A0E3021A80E2202090E4000031E1FCFF4B +S21902CA3AFF1A0000A0E3160F07EE9A0F07EE101F11EE011AC182 +S21902CA4FE3101F01EE0010A0E3151F07EE0000A0E10000A0E10C +S21902CA640000A0E10000A0E10000A0E10000A0E11C009FE5060C +S21902CA7910A0E1072086E00530A0E198EFFFEB090000EA90F7E2 +S21902CA8E030024DE020064DF0200082A030070009FE50770643C +S21902CAA3E090EFFFEB0130C4E3035085E0036086E0000057E39B +S21902CAB80D0000DA0500A0E108309AE50610A0E1030057E10765 +S21902CACD40A0B10340A0A10420A0E10FE0A0E108F0A0E1E2E0E8 +S21902CAE2FFEB009050E2EBFFFF0A2C301BE5005083E5101F1145 +S21902CAF7EE011A81E3031081E3101F01EE0C009FE577EFFFEB41 +S21902CB0C0900A0E1010000EA002A0300042A0300F0AF1BE90D8A +S21902CB21C0A0E1F0DF2DE904B04CE200A0A0E30050A0E101807B +S21902CB36A0E1F8C09FE50290A0E11C309CE50C70A0E10A0053EC +S21902CB4BE10100001A0700A0E3F0AF1BE9006097E5D8109FE55D +S21902CB60D8209FE50600A0E1022061E0B1EDFFEB0E02A0E30236 +S21902CB751A80E2202090E4000031E1FCFFFF1A0000A0E3160FA6 +S21902CB8A07EE9A0F07EE101F11EE011AC1E3101F01EE0010A041 +S21902CB9FE3151F07EE0000A0E10000A0E10000A0E10000A0E16A +S21902CBB40000A0E10000A0E1103097E5034005E00410A0E108E2 +S21902CBC95085E070009FE50520A0E144EFFFEB68809FE5040074 +S21902CBDE00EA083097E560009FE50130C3E3034084E03DEFFF10 +S21902CBF3EB050054E10600002A0400A0E10FE0A0E106F0A0E165 +S21902CC0898E0FFEB00A050E2F2FFFF0A004089E5101F11EE0105 +S21902CC1D1A81E3031081E3101F01EE0800A0E12EEFFFEB0A004E +S21902CC32A0E1F0AF1BE990F703002CE0020004E10200282A03EE +S21902CC4700042A0300002A03000DC0A0E1F0DF2DE904B04CE25E +S21902CC5C00A0A0E30050A0E10180A0E100C19FE50290A0E11C52 +S21902CC71309CE50C60A0E10A0053E10100001A0700A0E3F0AF87 +S21902CC861BE9007096E5E0109FE5E0209FE50700A0E1022061A0 +S21902CC9BE065EDFFEB0E02A0E3021A80E2202090E4000031E18A +S21902CCB0FCFFFF1A0000A0E3160F07EE9A0F07EE101F11EE01EA +S21902CCC51AC1E3101F01EE0010A0E3151F07EE0000A0E100003A +S21902CCDAA0E10000A0E10000A0E10000A0E10000A0E1103096E3 +S21902CCEFE5034005E00410A0E1085085E078009FE50520A0E128 +S21902CD04F8EEFFEB70809FE5040000EA083096E568009FE50141 +S21902CD1930C3E3034084E0F1EEFFEB050054E10800002A081034 +S21902CD2E96E50C2096E50400A0E10FE0A0E107F0A0E14AE0FF31 +S21902CD43EB00A050E2F0FFFF0A004089E5101F11EE011A81E3C4 +S21902CD58031081E3101F01EE0800A0E1E0EEFFEB0A00A0E1F06E +S21902CD6DAF1BE990F7030004E10200A8E20200402A0300042A5F +S21902CD820300002A03000DC0A0E100D82DE904B04CE20B0050EC +S21902CD97E300F19F97210000EAD0CD0200E8CD0200F0CD020056 +S21902CDACF8CD020000CE020008CE020010CE020018CE0200280C +S21902CDC1CE0200D8CD0200E0CD020020CE020058009FE500A8BC +S21902CDD61BE954009FE500A81BE950009FE500A81BE94C009F4E +S21902CDEBE500A81BE948009FE500A81BE944009FE500A81BE9AF +S21902CE0040009FE500A81BE93C009FE500A81BE938009FE5007E +S21902CE15A81BE934009FE500A81BE930009FE500A81BE92C0065 +S21902CE2A9FE500A81BE9582A0300782A03009C2A0300C02A03DC +S21902CE3F00D82A0300F02A03000C2B0300242B0300342B0300C7 +S21902CE54582B03007C2B0300A02B03000DC0A0E100D82DE90088 +S21902CE693090E5000053E104B04CE20500000A043090E500102A +S21902CE7E83E5043090E5090081E8041080E500A81BE904108359 +S21902CE93E5001083E5043081E5003081E500A81BE90DC0A0E1FC +S21902CEA800D82DE90010A0E1000091E504B04CE2010050E10461 +S21902CEBD00000A003090E5003081E5002090E5041082E500A85C +S21902CED21BE90000A0E300A81BE90DC0A0E170D82DE93C309F5A +S21902CEE7E53C209FE53C509FE5043083E504B04CE2003083E544 +S21902CEFC0F40A0E3042082E50260A0E1002082E50600A0E105C7 +S21902CF1110A0E1D1FFFFEB615E85E2014054E2F9FFFF5A70A8B3 +S21902CF261BE9208B0300188B0300288B03000DC0A0E130D82D5E +S21902CF3BE90620A0E304B04CE20050A0E1100085E20140A0E15C +S21902CF50B8ECFFEB0410A0E118009FE50620A0E3B4ECFFEB10C3 +S21902CF65309FE5005083E50500A0E1020000EB30A81BE9B0F74E +S21902CF7A0300BCF703000DC0A0E100D82DE90030A0E110108055 +S21902CF8FE204B04CE200C093E50020A0E30FE0A0E100F09CE506 +S21902CFA400A81BE90DC0A0E1F0DF2DE944319FE504B04CE2882F +S21902CFB9D04DE23CC19FE50540A0E34C8093E50090A0E100506F +S21902CFCE9CE50270A0E1AC100BE5000058E31000000A0850A0DA +S21902CFE3E100C095E514219FE524309CE528308CE50C3095E50A +S21902CFF824208CE5000053E30700001A0500A0E1F8109FE503FC +S21902D00D20A0E10FE0A0E100F09CE50C3095E5013083E30C30FC +S21902D02285E5D0609FE50A0000EA003095E50500A0E10FE0A021 +S21902D037E11CF093E5C8009FE5483096E5014044E20FE0A0E162 +S21902D04C03F0A0E1000054E3370000DA003095E50500A0E10FCD +S21902D061E0A0E10CF093E5000050E3EEFFFF0AA8900BE50EA0DF +S21902D076A0E3A4A00BE5AC301BE59C700BE584209FE584009FC4 +S21902D08BE5A0300BE50060A0E1001092E50030A0E3003080E534 +S21902D0A0030051E10B00000AA60B00EB0040A0E160009FE50CDD +S21902D0B5EEFFEB0900A0E10A10A0E15EF0FFEBAC001BE5071067 +S21902D0CAA0E15BF0FFEB0400A0E1AB0B00EB0500A0E1A8104BE5 +S21902D0DFE200C095E50220A0E300608DE50E3087E20FE0A0E18B +S21902D0F410F09CE50B0000EA50000000BCF7030040390300B078 +S21902D109F70300400D0300B8F7030028EC0300B02B03000020F9 +S21902D11E95E50500A0E10FE0A0E11CF092E5003096E500005304 +S21902D133E3F8FFFF0A000058E30400000A003095E5282093E54A +S21902D148242083E50010A0E3281083E5F0AF1BE90DC0A0E100FB +S21902D15DD82DE930309FE5030051E104B04CE200C0A0E102008A +S21902D172001A0130A0E3003081E500A81BE900309CE50C00A034 +S21902D187E128C093E50FE0A0E108F09CE500A81BE928EC03009F +S21902D19C0DC0A0E1F0D92DE9DC309FE5DC209FE504B04CE20058 +S21902D1B170A0E14C6093E50180A0E1005092E5000056E310003B +S21902D1C6000A0650A0E100C095E5B8209FE524309CE528308C1D +S21902D1DBE50C3095E524208CE5000053E30700001A0500A0E10B +S21902D1F09C109FE50320A0E10FE0A0E100F09CE50C3095E501B7 +S21902D2053083E30C3085E5003095E50500A0E10FE0A0E11CF025 +S21902D21A93E574009FE51FFFFFEB004050E20D00000A0700A050 +S21902D22FE10C1084E20E20A0E3FEEBFFEB0800A0E1082094E5D2 +S21902D2441A1084E20E2042E2F9EBFFEB44009FE50410A0E100C1 +S21902D259FFFFEB080094E5000000EA0400A0E1000056E30400A3 +S21902D26E000A003095E5282093E5242083E50010A0E328108336 +S21902D283E5F0A91BE950000000BCF7030040390300B0F70300E1 +S21902D298208B0300188B03000DC0A0E1F0D92DE904B04CE20017 +S21902D2AD50A0E30280A0E1080055E10160A0E10D0000AA347014 +S21902D2C29FE58541A0E1060094E7001097E5064084E004209416 +S21902D2D7E5D6EBFFEB003097E5042094E5015085E2023083E015 +S21902D2EC003087E5080055E1F2FFFFBAF0A91BE92CEC03000DDD +S21902D301C0A0E1F0D92DE904B04CE280D04DE20060A0E1E800C6 +S21902D3169FE50170A0E1E0FEFFEB008050E20C5088120050A025 +S21902D32B03A0500BE50600A0E19C700BE5A0104BE2003096E5F8 +S21902D3400120A0E30FE0A0E114F093E5B4209FE5003092E50042 +S21902D3550053E30B00000AF90A00EB0040A0E1A0009FE55FED52 +S21902D36AFFEB0500A0E10E10A0E3B1EFFFEB0E0085E20E104732 +S21902D37FE2AEEFFFEB0400A0E1FE0A00EB003096E5282093E546 +S21902D394000052E31200000A1E1085E268009FE50420A0E3DE26 +S21902D3A9EDFFEB000050E30C00000A58309FE5002096E5005051 +S21902D3BE83E5144092E528C092E548309FE50600A0E114308278 +S21902D3D3E50710A0E10FE0A0E104F09CE5003096E5144083E575 +S21902D3E8000058E30B00000A087088E520009FE50810A0E19720 +S21902D3FDFEFFEB060000EA188B0300B8F70300C02B03001039AD +S21902D41203002CEC0300A0D20200208B0300F0A91BE90DC0A0B4 +S21902D427E100D82DE914309FE5000093E5002090E504B04CE263 +S21902D43C0FE0A0E120F092E500A81BE9BCF703000DC0A0E1002D +S21902D451D82DE93C009FE504B04CE222EDFFEB34009FE534103A +S21902D4669FE534209FE534309FE51DEDFFEB30009FE51BEDFFB7 +S21902D47BEB2C009FE52C309FE52CC09FE5001093E500209CE581 +S21902D49015EDFFEB00A81BE9D43503002C2D0300442D030060AC +S21902D4A52D0300082C0300702D03009C2D030058F80300C4F78A +S21902D4BA03000DC0A0E1F0DF2DE90000E0E304D04DE244429F35 +S21902D4CFE5343094E504B04CE20FE0A0E103F0A0E12C000BE59D +S21902D4E40060A0E3343094E50600A0E10FE0A0E103F0A0E11CE5 +S21902D4F9029FE51C329FE51C229FE5006083E50180A0E30080B1 +S21902D50E82E5483094E50FE0A0E103F0A0E104229FE504129F66 +S21902D523E5006082E50234A0E3003081E5F8519FE5EF0100EB49 +S21902D5380600A0E10610A0E1C1FFFFEBE8319FE5E8A19FE5E87D +S21902D54D719FE5030055E10340A0E10300000A0FE0A0E104F05F +S21902D56295E4040055E1FBFFFF1A00E09AE500005EE335000012 +S21902D5770AC0219FE5C0419FE5C0119FE50E90A0E1003092E589 +S21902D58C0400A0E1832263E0023183E08351A0E19125CCE0C504 +S21902D5A12FA0E14C2362E00210A0E1823262E0032182E082215B +S21902D5B645E0CBECFFEB0030A0E300308AE5090055E31A0000E6 +S21902D5CBDA0700A0E1011CA0E30A20A0E327EEFFEB0060A0E1B5 +S21902D5E0010056E30A00001A58319FE50400A0E19325C1E0C521 +S21902D5F52FA0E1412362E00210A0E1823262E0032182E0822112 +S21902D60A45E0B6ECFFEBEBFFFFEA010076E30600001A28319F0E +S21902D61FE5002093E5000052E30000000AD80A00EB0A5045E2E5 +S21902D634E2FFFFEA020076E30200001A0030A0E300308AE50047 +S21902D6490000EA00908AE5000058E30200000AF0009FE50080A1 +S21902D65EA0E3A1ECFFEB0700A0E1011CA0E3FA20A0E301EEFF03 +S21902D673EB0060A0E1010076E30500001AC4309FE5002093E546 +S21902D688000052E3EFFFFF0ABF0A00EBEDFFFFEA000056E30791 +S21902D69D00001A70209FE52C001BE5343092E50FE0A0E103F0D9 +S21902D6B2A0E198009FE50ADDFFEBE3FFFFEA0700A0E19DECFF13 +S21902D6C7EB000050E30F0000DA80509FE50700A0E17C409FE524 +S21902D6DC0510A0E10420A0E1F7EEFFEB003050E20400000A00B8 +S21902D6F10095E50410A0E10FE0A0E10CF093E5020000EA5400EA +S21902D7069FE5001094E576ECFFEB0180A0E3CDFFFFEA500000A5 +S21902D71B00400D0300C0F703005CF8030058F80300C4F7030080 +S21902D730E43B0300EC3B030064F8030030EC0300C8F70300A8A9 +S21902D7452D0300D34D62109CF90300EC2D03000447020054F8B9 +S21902D75A0300D0F70300F82D0300F0AF1BE90DC0A0E110D82DB8 +S21902D76FE9020050E304B04CE20140A0E15400001A040094E5F1 +S21902D78454119FE59AECFFEB000050E31000001A00C00FE10023 +S21902D799400FE1C04084E304F029E1101F11EE011A81E303101F +S21902D7AE81E3101F01EE101F11EE0F1081E3101F01EE00300FCF +S21902D7C3E1C0400CE2C030C3E3043083E103F029E110A81BE994 +S21902D7D8040094E500119FE584ECFFEB000050E33500001A0047 +S21902D7EDC00FE100400FE1C04084E304F029E10E02A0E3021A2C +S21902D80280E2202090E4000031E1FCFFFF1A0000A0E3160F071F +S21902D817EE9A0F07EE101F11EE011AC1E3101F01EE0010A0E3CB +S21902D82C151F07EE0000A0E10000A0E10000A0E10000A0E100B3 +S21902D84100A0E10000A0E1101F11EE0C10C1E3101F01EE0010AD +S21902D856A0E3161F07EE0E02A0E3021A80E2202090E400003113 +S21902D86BE1FCFFFF1A0000A0E3160F07EE9A0F07EE0010A0E3DE +S21902D880151F07EE151F08EE0000A0E10000A0E10000A0E100B6 +S21902D89500A0E10000A0E10000A0E10010A0E3161F07EE171F01 +S21902D8AA08EE00300FE1C0400CE2C030C3E3043083E103F02914 +S21902D8BFE110A81BE91C009FE5041094E506ECFFEB10A81BE9EB +S21902D8D410009FE503ECFFEB10A81BE91C2E0300202E0300244D +S21902D8E92E03003C2E03000DC0A0E170D82DE90030A0E304B072 +S21902D8FE4CE214D04DE21C300BE50350A0E11C304BE204308D83 +S21902D913E500508DE524309FE50C308DE50120A0E308208DE58D +S21902D9280530A0E10FEFFFEB000050E30400001A08009FE5EA7E +S21902D93DEBFFEB230000EA482E0300502E03001C001BE50000D6 +S21902D95250E30100000AF8EBFFEB0050A0E15C409FE55C309F92 +S21902D967E5030054E10360A0E11700000A1C001BE50130A0E3B2 +S21902D97C000050E30500000A001094E50520A0E146ECFFEB0002 +S21902D9910050E30030A0130130A003000053E30400000A20002C +S21902D9A69FE5041094E5002094E5083094E5CCEBFFEB10408495 +S21902D9BBE2060054E1020000EA743A0300243B0300642E03009F +S21902D9D0E7FFFF1A70A81BE90DC0A0E170D82DE904B04CE25042 +S21902D9E5D04DE20060A0E148404BE20400A0E14C304BE2003033 +S21902D9FA8DE550204BE204208DE50150A0E18C309FE56210A048 +S21902DA0FE308308DE50120A0E30030A0E3C7EEFFEB54304BE2C7 +S21902DA2400308DE558204BE204208DE530004BE264309FE56C28 +S21902DA3910A0E308308DE50120A0E30030A0E3BCEEFFEB023077 +S21902DA4EA0E300308DE50020A0E304208DE508208DE50600A01E +S21902DA63E138309FE50510A0E10C308DE5012082E20430A0E15C +S21902DA78BCEEFFEB000050E31000000A50301BE5000053E306F5 +S21902DA8D00001A10009FE594EBFFEB0A0000EA742E0300842E1B +S21902DAA20300082C03008C2E030058301BE5000053E32030A0C3 +S21902DAB70354300B054C001BE554101BE5DDEDFFEB70A81BE93C +S21902DACC0DC0A0E170D82DE904B04CE23CD04DE23C304BE2409C +S21902DAE1204BE200308DE50040A0E104208DE530604BE26C3189 +S21902DAF69FE50600A0E108308DE50150A0E160319FE57710A051 +S21902DB0BE300C093E50120A0E344C00BE50030A0E387EEFFEB39 +S21902DB200120A0E300208DE544304BE204308DE50010A0E308D1 +S21902DB35108DE530319FE50400A0E10C308DE50510A0E106306E +S21902DB4AA0E187EEFFEB000050E34700000A40301BE500005398 +S21902DB5FE30C00000A08019FE544101BE53C201BE55DEBFFEB42 +S21902DB7438004BE23C201BE50810A0E3823262E0032182E0823B +S21902DB8921A0E1BAECFFEB020070E33700000A44301BE500C084 +S21902DB9E0FE100400FE1C04084E304F029E10E02A0E3021A80B7 +S21902DBB3E2202090E4000031E1FCFFFF1A0000A0E3160F07EEFD +S21902DBC89A0F07EE101F11EE011AC1E3101F01EE0010A0E315F0 +S21902DBDD1F07EE0000A0E10000A0E10000A0E10000A0E1000014 +S21902DBF2A0E10000A0E1101F11EE0C10C1E3101F01EE0010A059 +S21902DC07E3161F07EE0E02A0E3021A80E2202090E4000031E11D +S21902DC1CFCFFFF1A0000A0E3160F07EE9A0F07EE0010A0E315F5 +S21902DC311F07EE151F08EE0000A0E10000A0E10000A0E1000016 +S21902DC46A0E10000A0E10000A0E10010A0E3161F07EE171F0844 +S21902DC5BEE0300A0E1A0DBFFEB030000EAA42E030060F80300B9 +S21902DC70B42E0300C82E030070A81BE90DC0A0E110D82DE95002 +S21902DC85009FE504B04CE216EBFFEB48409FE548009FE54830E2 +S21902DC9A94E50FE0A0E103F0A0E13C009FE50FEBFFEB38009F96 +S21902DCAFE5482094E50FE0A0E102F0A0E100300FE100400FE160 +S21902DCC4C04084E304F029E11C209FE50130A0E3003082E5FED6 +S21902DCD9FFFFEA0C2F030050000000400D03001C2F030050C308 +S21902DCEE00000000039010A81BE90DC0A0E100D82DE904B04C8F +S21902DD03E200A81BE90DC0A0E130D82DE904B04CE20040A0E167 +S21902DD18103F11EE2351A0E1015015E21000000A0E02A0E302B5 +S21902DD2D1A80E2202090E4000031E1FCFFFF1A160F07EE9A0FC1 +S21902DD4207EE0000A0E10000A0E10000A0E10000A0E10000A02C +S21902DD57E10000A0E1101F11EE0C10C1E3101F01EE161F07EE18 +S21902DD6C94C09FE594E09FE594309FE594209FE5FE1404E20053 +S21902DD813081E58C309FE5002081E5003084E5000091E50E30DD +S21902DD9600E00E0053E10100000A01C05CE2F9FFFF1A6C309FF9 +S21902DDABE56C209FE5033000E0002081E5000053E30B00000A83 +S21902DDC0043094E40128A0E3010073E30500001A042042E20031 +S21902DDD50052E3020000DA043094E4010073E3F9FFFF0A00001D +S21902DDEA52E30000A003000055E30200000A101F11EE0F108133 +S21902DDFFE3101F01EE30A81BE9404B4C008000800050005000B4 +S21902DE1420002000D000D0007E007E00FF00FF000DC0A0E1F0DA +S21902DE29D92DE904B04CE20060A0E10150A0E10240A0E100C0D6 +S21902DE3EA0E3103F11EE2371A0E1017017E21000000A0E02A0AE +S21902DE53E3021A80E2202090E4000031E1FCFFFF1A160F07EE5E +S21902DE689A0F07EE0000A0E10000A0E10000A0E10000A0E100FC +S21902DE7D00A0E10000A0E1101F11EE0C10C1E3101F01EE161F46 +S21902DE9207EEAC309FE5AC809FE5FE0406E2003080E5070000E9 +S21902DEA7EAA0309FE5003080E5042096E4045085E20E0052E1F2 +S21902DEBC90C09F151700001A044044E2000054E3140000DA8006 +S21902DED1309FE580109FE5003080E5002095E5002086E500C0F3 +S21902DEE690E502E0A0E108300CE0080053E10600000A4C209FCD +S21902DEFBE5011051E20700000A00C090E502300CE0020053E148 +S21902DF10F9FFFF1A44309FE503300CE0000053E3E0FFFF0A248B +S21902DF25309FE5003080E5000057E30200000A101F11EE0F1004 +S21902DF3A81E3101F01EE0C00A0E1F0A91BE9500050008000807F +S21902DF4F00FF00FF001099109910001000404B4C007E007E0073 +S21902DF640DC0A0E100D82DE904B04CE200E0A0E1103F11EE23B1 +S21902DF79C1A0E101C01CE21000000A0E02A0E3021A80E2202020 +S21902DF8E90E4000031E1FCFFFF1A160F07EE9A0F07EE0000A085 +S21902DFA3E10000A0E10000A0E10000A0E10000A0E10000A0E1FC +S21902DFB8101F11EE0C10C1E3101F01EE161F07EE50209FE550D3 +S21902DFCD309FE50512A0E3003081E5012042E2000052E3FCFFDF +S21902DFE2FFCA0020A0E3043091E4012082E20130CEE433005221 +S21902DFF7E3FAFFFF9A24309FE5003081E500005CE30200000AE0 +S21902E00C101F11EE0F1081E3101F01EE0000A0E300A81BE940BA +S21902E0210D030098009800FF00FF000DC0A0E130D82DE904B085 +S21902E0364CE200E0A0E1FE440EE2A4509FE5103F11EE23C1A0C3 +S21902E04BE101C01CE21000000A0E02A0E3021A80E2202090E43A +S21902E060000031E1FCFFFF1A160F07EE9A0F07EE0000A0E10045 +S21902E07500A0E10000A0E10000A0E10000A0E10000A0E1101FDB +S21902E08A11EE0C10C1E3101F01EE161F07EE50109FE550309F70 +S21902E09FE550209FE5003084E54C309FE500208EE500308EE5BD +S21902E0B4000094E5013000E0010053E10100000A015055E2F905 +S21902E0C9FFFF1A2C309FE5003084E500005CE30200000A101F30 +S21902E0DE11EE0F1081E3101F01EE30A81BE9404B4C00800080D3 +S21902E0F300500050006000600001000100FF00FF000DC0A0E163 +S21902E108F0DF2DE904B04CE280D04DE200E0A0E101A0A0E10230 +S21902E11D60A0E1103F11EE2371A0E1017017E21000000A0E020E +S21902E132A0E3021A80E2202090E4000031E1FCFFFF1A160F07CA +S21902E147EE9A0F07EE0000A0E10000A0E10000A0E10000A0E12C +S21902E15C0000A0E10000A0E1101F11EE0C10C1E3101F01EE1683 +S21902E1711F07EEFE540EE20520A0E130309FE50010A0E30030EF +S21902E18685E5060051E1100000AAA8004BE20180A0E103C0CABD +S21902E19BE314409FE5004082E50E0052E10300001A0180C0E780 +S21902E1B0030000EA5000500098009800083092E50130C0E70C03 +S21902E1C52082E0011081E2060051E1F2FFFFBAB0109FE5B0C0B2 +S21902E1DA9FE5B0309FE5B0209FE500308EE500208EE500009522 +S21902E1EFE50C3000E00C0053E10100000A011051E2F9FFFF1A73 +S21902E2040520A0E10010A0E3060051E1150000AAA8804BE27405 +S21902E219909FE52AE1A0E10130D8E7014081E2000053E30A0075 +S21902E22E000A009082E550109FE55C309FE54CC09FE50030829D +S21902E243E5000095E50C3000E00C0053E10100000A011051E2B5 +S21902E258F9FFFF1A0E2182E00410A0E1060051E1EBFFFFBA2C6C +S21902E26D309FE5003085E5000057E30200000A101F11EE0F10B4 +S21902E28281E3101F01EE050000EA404B4C008000800060006078 +S21902E29700D000D00001000100FF00FF00F0AF1BE90DC0A0E1DA +S21902E2AC00D82DE9030040E204B04CE2040050E300F19F9708FB +S21902E2C10000EAD8E20200D8E20200D8E20200E0E20200E0E29D +S21902E2D602000A00A0E300A81BE90200A0E300A81BE90500A01B +S21902E2EBE300A81BE90DC0A0E100D82DE90C309FE5002093E5F4 +S21902E30004B04CE2440092E500A81BE908F703000DC0A0E10068 +S21902E315D82DE918309FE5002093E5440092E504B04CE20200FB +S21902E32A50E30000A0130100A00300A81BE908F703000DC0A032 +S21902E33FE100D82DE90010A0E10F00A0E304B04CE224E1FFEBFF +S21902E35400A81BE90DC0A0E110D82DE904B04CE20040A0E119F9 +S21902E36900A0E315E1FFEB0020A0E3244EA0E10F0054E304F164 +S21902E37E9F97560000EAC4E30200D0E30200D8E30200E4E30229 +S21902E39300ECE30200F4E3020000E402000CE402001CE40200EA +S21902E3A830E4020040E4020060E4020080E40200ACE40200D40B +S21902E3BDE40200DCE40200202FA0E1012002E2430000EA202F4B +S21902E3D2A0E10D0000EAA02EA0E1012002E23E0000EAA02EA0CD +S21902E3E7E1080000EAA02FA0E13A0000EA0020E0E1A22FA0E1A0 +S21902E3FC370000EA202EA0E1012002E2340000EA202EA0E10122 +S21902E4112022E2012002E2300000EA062200E2020252E3002049 +S21902E426A0130120A0032B0000EA062200E2022252E20120A02B +S21902E43B13270000EA092200E2000052E30030A0130130A003A8 +S21902E450090252E30320A0110120A0031F0000EA092200E201C1 +S21902E4650252E30030A0130130A003020152E30320A011012080 +S21902E47AA003170000EA093200E2000053E309025313202FA02F +S21902E48FE1012022E20030A0130130A003000053E30120021249 +S21902E4A40020A0030C0000EA093200E2010253E30201531320C4 +S21902E4B92FA0E10030A0130130A003000053E301200202012064 +S21902E4CEA013020000EA0120A0E3000000EA0020A0E30200A0C0 +S21902E4E3E110A81BE90DC0A0E130D82DE904B04CE20050A0E161 +S21902E4F80F0005E2B1E0FFEB0040A0E1100015E30200001A3E74 +S21902E50D3D05E2C303A0E1020000EA0F0C05E22004A0E1A8E06C +S21902E522FFEB603005E2C332A0E1030053E303F19F9713000090 +S21902E537EA48E5020050E5020058E5020060E502001440A0E11D +S21902E54C0D0000EA3440A0E10B0000EA5440A0E1090000EA00CA +S21902E5610050E30600001AA440A0E11900A0E394E0FFEB0202E8 +S21902E57610E3023184E30340A011000000EA7440A0E10400A045 +S21902E58BE130A81BE90DC0A0E1F0D82DE904B04CE20040A0E1E8 +S21902E5A00150A0E1033305E2233DA0E1030053E303F19F97B973 +S21902E5B50000EAC8E5020048E70200FCE7020058E70200D82260 +S21902E5CA9FE5FF32C5E3020053E10200001A0F0005E279E0FF38 +S21902E5DFEBF0A81BE9047084E20F3A05E20F0A53E35200001AD4 +S21902E5F4B0329FE5B0229FE5033005E0020053E14D00000A0F9B +S21902E6090805E22008A0E16CE0FFEB0060A0E1020415E3040044 +S21902E61E001A050AA0E1200AA0E1AEFFFFEB0040A0E103000030 +S21902E633EAFF4005E20F3C05E2A333A0E17443A0E11E3605E2BF +S21902E648A33AA0E10F0053E303F19F97390000EA98E60200A0A6 +S21902E65DE60200A8E60200B0E60200B8E60200C0E60200DCE687 +S21902E672020000E7020040E7020040E7020040E7020040E702FD +S21902E6870024E702002CE7020034E702003CE70200047006E0B9 +S21902E69C270000EA047026E0250000EA067064E0230000EA04FD +S21902E6B17066E0210000EA047086E01F0000EA1900A0E33FE0EE +S21902E6C6FFEBA00EA0E1010000E2043086E0007083E0180000B7 +S21902E6DBEA1900A0E338E0FFEBA00EA0E1010000E2063064E00F +S21902E6F0000050E30370A011017043020F0000EA1900A0E32F3D +S21902E705E0FFEBA00EA0E1010000E2043066E0000050E30370FC +S21902E71AA01101704302060000EA047086E1040000EA0470A0AF +S21902E72FE1020000EA0470C6E1000000EA0470E0E10700A0E13F +S21902E744F0A81BE964219FE5023005E0020053E10100001A04A8 +S21902E7590084E2F0A81BE9010615E3FBFFFF0A0F3A05E20F0A57 +S21902E76E53E3F8FFFF1A0F4805E22408A0E111E0FFEB083080CB +S21902E783E20F0854E30060A0110360A001010415E31600000A18 +S21902E798020415E30900001A020515E30300000A053AA0E12355 +S21902E7AD3AA0E1036086E00E0000EA053AA0E1233AA0E10660D0 +S21902E7C263E00A0000EA020515E30400000A050AA0E1200AA09D +S21902E7D7E142FFFFEB006086E0030000EA050AA0E1200AA0E12C +S21902E7EC3DFFFFEB066060E0000096E5F0A81BE9027415E21AA7 +S21902E80100001A010615E3D2FFFF0A020915E3D0FFFF0A0F48D6 +S21902E81605E22408A0E1E9DFFFEB083080E20F0854E30060A0B8 +S21902E82B110360A00107C0A0E10C20A0E178309FE5020505E2AD +S21902E840031005E05132A0E1010013E301C08C12012082E20ED7 +S21902E8550052E3F9FFFFDA000050E30C618610E2FFFF1A04600D +S21902E86A46E2E0FFFFEA0500A0E1B7FEFFEB000050E3B5FFFF97 +S21902E87F0AFF34C5E30311A0E1020515E33F0381E308008012C4 +S21902E89408008102000084E0F0A81BE90000A0E3F0A81BE910AE +S21902E8A9FF2F010000BF0F00000F0110000002FFFF00000DC069 +S21902E8BEA0E170D82DE90118A0E14128A0E1211EA0E1041041C6 +S21902E8D3E204B04CE20060A0E1023086E2015083E30B0051E3F4 +S21902E8E801F19F973E0000EA20E90200ECE90200ECE90200EC1F +S21902E8FDE90200ECE90200ECE90200ECE90200ECE90200ECE9E3 +S21902E91202004CE9020080E90200B8E902000228A0E1C8309F60 +S21902E927E52208A0E1033002E0470453E32C00001A780000E20E +S21902E93CA001A0E1A0DFFFEB0050A0E1270000EA0238A0E10F88 +S21902E9510403E20002A0E12348A0E17DFEFFEB000050E320009A +S21902E966000AFF3004E28300A0E1800014E3800BE011A00BE0F4 +S21902E97B11090000EA0238A0E1020313E32318A0E11600001ADA +S21902E990813AA0E1A33AA0E18300A0E1010B11E3800AE011A0B2 +S21902E9A50AE011043080E2033086E0015083E30C0000EA3E1B26 +S21902E9BAE0E30228A0E1013802E02302A0E1010312E38004E0B5 +S21902E9CF11A004E011B230D6E1013003E0830080E1042080E26F +S21902E9E4022086E0015082E30500A0E170A81BE9000087FF0DA4 +S21902E9F9C0A0E130D82DE90F00A0E304B04CE26EDFFFEB0040B8 +S21902EA0EA0E11900A0E36BDFFFEB200010E30600000A0400A0D4 +S21902EA23E1B010D0E1A3FFFFEB88309FE5000083E580109FE541 +S21902EA380F0000EA005094E50500A0E143FEFFEB000050E30616 +S21902EA4D00000A0400A0E10510A0E15C409FE5CBFEFFEB0000B5 +S21902EA6284E550109FE5030000EA48209FE5043084E20210A026 +S21902EA77E1003082E5004091E5010014E30600000A30309FE569 +S21902EA8C0120C4E3B000D2E128109FE5B000C3E1B010C2E130A0 +S21902EAA1A81BE91C309FE5002094E518109FE5002083E5001000 +S21902EAB684E530A81BE94C39030034ED0300BEBEFFFF30ED03B9 +S21902EACB00FEDEFFE70DC0A0E100D82DE944309FE50300A0E1B5 +S21902EAE0001093E504B04CE2000051E30B00000A010011E3046E +S21902EAF500000A28209FE5B020D2E10130C1E3B020C3E1020061 +S21902EB0A00EA18309FE5002093E5002081E50030A0E3003080B8 +S21902EB1FE500A81BE94C39030034ED030030ED03000DC0A0E12F +S21902EB3400D82DE904B04CE200A81BE90DC0A0E100D82DE90409 +S21902EB49B04CE200A81BE90DC0A0E100D82DE90F00A0E304B0A4 +S21902EB5E4CE218DFFFEB0C309FE5030050E10000A0130100A044 +S21902EB730300A81BE9104702000DC0A0E110D82DE90F00A0E3A0 +S21902EB8804B04CE20DDFFFEB0040A0E11900A0E30ADFFFEB2069 +S21902EB9D0010E302408412044084020F00A0E30410A0E10CDFB5 +S21902EBB2FFEB10A81BE90DC0A0E100D82DE964109FE504B04C6D +S21902EBC7E260C09FE500209CE50030A0E3003081E5030052E18C +S21902EBDC1100001A010010E30600000A00008CE540309FE50188 +S21902EBF100C0E3B020D0E1B420CCE1B030C0E1040000EA0000F4 +S21902EC068CE528209FE5003090E504308CE5002080E50300A043 +S21902EC1BE324E1FFEB0300A0E3F2E0FFEB00A81BE95039030091 +S21902EC3038ED0300BEBEFFFFFEDEFFE70DC0A0E100D82DE96CBC +S21902EC45309FE504B04CE200C093E500005CE30100000A00009B +S21902EC5AA0E300A81BE954209FE5001092E50130C1E3030050C8 +S21902EC6FE10E00001A010011E30200000AB430D2E1B030C0E167 +S21902EC84010000EA043092E5003080E50030A0E3003082E503FC +S21902EC9900A0E304E1FFEB0300A0E3D2E0FFEB0100A0E300A8BF +S21902ECAE1BE90C00A0E100A81BE95039030038ED03000DC0A0EC +S21902ECC3E130D82DE984209FE50030A0E380509FE504B04CE225 +S21902ECD8001095E50040A0E1003082E5030051E10100000A01FD +S21902ECED00A0E1D1FFFFEB003095E5000053E31300001A1900AA +S21902ED02A0E3AFDEFFEB200010E30600000A013084E30030858B +S21902ED17E53C209FE5B030D4E1B430C5E1B020C4E1040000EA99 +S21902ED2C004085E528209FE5003094E5043085E5002084E50382 +S21902ED4100A0E3DAE0FFEB0300A0E3A8E0FFEB30A81BE9503932 +S21902ED56030038ED0300BEBEFFFFFEDEFFE70DC0A0E100D82DE7 +S21902ED6BE910309FE5000093E504B04CE2000050E20100A0139F +S21902ED8000A81BE938ED03000DC0A0E1F0D92DE90000A0E304EF +S21902ED95B04CE20CD04DE289DEFFEB0040A0E10100A0E386DE7F +S21902EDAAFFEB0070A0E10200A0E383DEFFEB0080A0E10300A0FE +S21902EDBFE380DEFFEB0060A0E10D00A0E37DDEFFEB045090E58E +S21902EDD41900A0E37ADEFFEB1F0000E2130050E30500001A0CD3 +S21902EDE900A0E375DEFFEB0010A0E10F00A0E37ADEFFEB0400E5 +S21902EDFE00EA0E00A0E36FDEFFEB0010A0E10F00A0E374DEFFD3 +S21902EE13EB010054E30C00000AFA0F54E30200A0E30F00000ACC +S21902EE280400A0E10710A0E124304BE204308DE50820A0E100E1 +S21902EE3D508DE50630A0E1610100EB000050E30100001A0500A0 +S21902EE52A0E3030000EA24101BE50000A0E360DEFFEB0000A0B5 +S21902EE67E3F0A91BE90DC0A0E100D82DE9001090E50000A0E3CB +S21902EE7C0C0081E51C30A0E31C3081E50820A0E3002081E50452 +S21902EE91B04CE2040081E5173043E2083081E5052042E20C209E +S21902EEA681E500A81BE90DC0A0E100D82DE9000090E5FF10017D +S21902EEBBE2203090E504B04CE2040013E30200001A203090E5D7 +S21902EED0040013E3FCFFFF0A141080E500A81BE90DC0A0E100A5 +S21902EEE5D82DE9000090E5203090E504B04CE2023013E20500DB +S21902EEFA000A143090E50030C1E50420A0E31C2080E50100A07A +S21902EF0FE300A81BE90300A0E100A81BE90DC0A0E130D82DE9BB +S21902EF2404B04CE204D04DE20050A0E115404BE20500A0E1040F +S21902EF3910A0E1E7FFFFEB000050E3FAFFFF0A15005BE530A8F9 +S21902EF4E1BE90DC0A0E170D82DE904B04CE20160A0E10240A051 +S21902EF63E10430A0E1014044E2000053E30050A0E10600000A7E +S21902EF780110D6E40500A0E1C9FFFFEB0430A0E1014044E2005E +S21902EF8D0053E3F8FFFF1A70A81BE90DC0A0E170D82DE904B0A6 +S21902EFA24CE20160A0E10240A0E10430A0E1014044E200005311 +S21902EFB7E30050A0E10600000A0500A0E1D4FFFFEB0430A0E182 +S21902EFCC014044E20100C6E4000053E3F8FFFF1A70A81BE90DA8 +S21902EFE1C0A0E1F0D82DE904B04CE20050A0E1043095E5016033 +S21902EFF6A0E13C709FE5033183E08340A0E1030000EA48309777 +S21902F00BE56400A0E30FE0A0E103F0A0E10500A0E10610A0E11C +S21902F020AEFFFFEB000050E30200001A014044E2010074E3F33C +S21902F035FFFF1AF0A81BE9500000000DC0A0E10E002DE910D861 +S21902F04A2DE910B04CE204309BE50040A0E3043043E203005380 +S21902F05FE303F19F971E0000EAA0F0020078F00200CCF00200C6 +S21902F074D8F0020054209FE50130A0E3003082E5001090E50CE2 +S21902F0893091E5083083E30C3081E5080090E51DD6FFEB10001B +S21902F09E00EA2C209FE5004092E50030A0E3003082E5001090FB +S21902F0B3E50C3091E50830C3E30C3081E5080090E506D6FFEBE7 +S21902F0C8050000EA084090E5030000EA6C39030008309BE5042F +S21902F0DD4090E5043080E50400A0E110A81BE90DC0A0E170D8F2 +S21902F0F22DE904B04CE204D04DE200C090E520409CE514309C11 +S21902F107E519304BE50420A0E31C208CE50050A0E3080090E5EA +S21902F11C0160A0E1A4E0FFEB005086E5020014E30600000A19AA +S21902F131004BE20110A0E3DBE1FFEB050050E10130A013003011 +S21902F14686150150A0E30500A0E170A81BE90DC0A0E170D82DD9 +S21902F15BE984509FE50000E0E3343095E504B04CE20FE0A0E164 +S21902F17003F0A0E170409FE50060A0E10400A0E139FFFFEB341F +S21902F1853095E50000A0E30FE0A0E103F0A0E1141095E550303F +S21902F19A9FE550209FE5004081E5043081E548309FE5082081FC +S21902F1AFE50C3081E540209FE540309FE5102081E5143081E5A5 +S21902F1C438209FE538309FE5182081E51C3081E5342095E50643 +S21902F1D900A0E10FE0A0E102F0A0E170A81BE9500000005439BD +S21902F1EE030050EF020098EF0200ACEE02001CEF020040F0025D +S21902F20300ECF00200E0EF02000DC0A0E100D82DE91C209FE544 +S21902F218003092E504B04CE2000053E30200001A0130A0E3004B +S21902F22D3082E5C7FFFFEB00A81BE9703903000DC0A0E1F0D810 +S21902F2422DE904B04CE20040A0E30260A0E1060054E10150A0E6 +S21902F257E1140000AA54709FE5143097E5000053E318309705DA +S21902F26C000093E5103093E50FE0A0E103F0A0E1FF0000E2048D +S21902F28100C5E70430D5E70D0053E30A0053130300001A0420E1 +S21902F29685E00030A0E30130C2E5020000EA014084E20600547F +S21902F2ABE1EBFFFFBA0400A0E1F0A81BE9500000000DC0A0E104 +S21902F2C0F0D82DE904B04CE20160A0E10270A0E1005057E223F1 +S21902F2D50000DA0030D6E58C409FE50A0053E30E00001A14305C +S21902F2EA94E5000053E30500000A000093E50C3093E50D10A061 +S21902F2FFE30FE0A0E103F0A0E1050000EA183094E5000093E504 +S21902F3140C3093E50D10A0E30FE0A0E103F0A0E1143094E501E7 +S21902F32910D6E4000053E30400000A000093E50C3093E50FE09F +S21902F33EA0E103F0A0E1040000EA183094E5000093E50C3093C8 +S21902F353E50FE0A0E103F0A0E1015045E2000055E3DBFFFFCA82 +S21902F3680700A0E1F0A81BE9500000000DC0A0E100D82DE904D5 +S21902F37D00E0E304B04CE200A81BE90DC0A0E100D82DE90000E7 +S21902F392A0E304B04CE200A81BE90DC0A0E100D82DE90400E02E +S21902F3A7E304B04CE200A81BE90DC0A0E100D82DE9000050E36A +S21902F3BC04B04CE20030A013003080150000A0E300A81BE90D6F +S21902F3D1C0A0E100D82DE904B04CE200E0A0E300C0A0E1050066 +S21902F3E65CE30100A0E10210A0E10320A0E11300000A050000F1 +S21902F3FBCA03005CE31600000A0C0000CA02005CE31000000A99 +S21902F4101E0000EA11005CE31600000A020000CA06005CE31047 +S21902F42500000A180000EA74309FE503005CE11200000A140027 +S21902F43A00EA7EFFFFEB00E0A0E1130000EA9BFFFFEB00E0A003 +S21902F44FE1100000EAC6FFFFEB00E0A0E10D0000EAC8FFFFEB0E +S21902F46400E0A0E10A0000EACAFFFFEB00E0A0E1070000EACC66 +S21902F479FFFFEB00E0A0E1040000EA20309FE5003080E50100D5 +S21902F48E00EA0000A0E300A81BE908309BE50100A0E300E083AA +S21902F4A3E500A81BE9ADBA0000743903000DC0A0E170D82DE9F9 +S21902F4B80118A0E16C309FE504B04CE20040A0E10250A0E141C7 +S21902F4CD08A0E100C093E50360A0E100005CE30900000A0038F4 +S21902F4E2A0E12328A0E1B430DCE1020053E10100001A0000E0EF +S21902F4F7E370A81BE900C09CE500005CE3F7FFFF1A0008A0E1E2 +S21902F50C2008A0E12AEDFFEBB400C4E1085084E5003096E50074 +S21902F5213084E50000A0E3004086E570A81BE940ED03000DC0EE +S21902F536A0E1F0D92DE90008A0E14008A0E15C309FE504B04CF7 +S21902F54BE20060A0E3005093E50380A0E1060055E11000000ABD +S21902F5600078A0E1B440D5E12708A0E113EDFFEB000054E10617 +S21902F57500001A000056E30200000A003095E5003086E50100D5 +S21902F58A00EA003095E5003088E50560A0E1005095E50000552F +S21902F59FE3EFFFFF1AF0A91BE940ED03000DC0A0E1F0D92DE96C +S21902F5B4BC309FE504D04DE20070A0E1086097E504B04CE2B65B +S21902F5C920D6E10180A0E1045097E5030052E10030A003B6308E +S21902F5DEC601B430D6E1B230C5E1B400D6E1F3ECFFEB0040A013 +S21902F5F3E10500A0E176ECFFEB0020A0E10600A0E10410A0E18C +S21902F6084FECFFEB0008B0E11D00001A60309FE5005093E50015 +S21902F61D0055E31900000AB420D5E1B230D6E1030052E112000B +S21902F632001AB400D6E1E0ECFFEB084040E2B000D6E1DDECFFE8 +S21902F647EB0038A0E10500A0E1081086E22338A0E100308DE57F +S21902F65C0420A0E10830A0E10FE0A0E108F095E50700A0E127A3 +S21902F671ECFFEB060000EAFFFF000040ED0300005095E50000BF +S21902F68655E3E5FFFF1A0700A0E11FECFFEBF0A91BE90DC0A0AC +S21902F69BE1F0DF2DE90338A0E104B04CE20160A0E100A0A0E1EC +S21902F6B00290A0E1E8C09FE54378A0E1F450DBE10C0056E1354B +S21902F6C500008AD8009FE5F0EBFFEB008050E23100000A083059 +S21902F6DA86E2BC30C8E1084098E50508A0E1045098E52008A02B +S21902F6EFE1B2ECFFEBB000C4E10708A0E12008A0E1AEECFFEB84 +S21902F704B200C4E1BC00D8E1ABECFFEB0030A0E30A10A0E1B49A +S21902F71900C4E10620A0E1B630C4E1080084E2C2E2FFEB0C00F5 +S21902F72E85E274109FE50420A0E3BEE2FFEB100085E20910A0EF +S21902F743E10420A0E3BAE2FFEB1170A0E30970C5E5B430D4E1DC +S21902F758B230C5E1BC60D8E10500A0E11BECFFEB0020A0E1041C +S21902F76D00A0E10610A0E1F4EBFFEB0008A0E12008A0E18EECF3 +S21902F782FFEB0710A0E1B600C4E10920A0E10800A0E139EBFF38 +S21902F797EB0800A0E1DCEBFFEBF0AF1BE9BE050000EA050000DC +S21902F7AC103903000DC0A0E1F0D92DE904B04CE210D04DE200D7 +S21902F7C180A0E10240A0E10400A0E10170A0E12C604BE2061022 +S21902F7D6A0E10350A0E1DCF0FFEB000050E30F0000BAB400D488 +S21902F7EBE173ECFFEB0048A0E1B400D5E12448A0E16FECFFEB73 +S21902F8000038A0E10800A0E10710A0E12338A0E100308DE5068E +S21902F81520A0E10430A0E19DFFFFEB0000A0E3030000EA0C007F +S21902F82A9FE50C109FE52DE4FFEB0000E0E3010000EA502F0373 +S21902F83F00742F0300F0A91BE90DC0A0E1F0D92DE964009FE555 +S21902F8540240A0E1004080E55C809FE504B04CE2000098E5036E +S21902F86970A0E1F450DBE14C609FE56FE2FFEB003096E500007C +S21902F87E53E30900000A0508A0E12008A0E14BECFFEB00109627 +S21902F893E5B400C1E1003097E5003081E50020A0E3002088E5AC +S21902F8A8F0A91BE914009FE50410A0E10CE4FFEBF0A91BE948BB +S21902F8BDED030044ED03004CED0300842F03000DC0A0E1F0DFFC +S21902F8D22DE904B04CE20CD04DE20050A0E1B400D3E10160A0DD +S21902F8E7E104909BE50270A0E132ECFFEB0048A0E134004BE2EB +S21902F8FC14209FE52418A0E1E9FEFFEB000050E3020000AA00CB +S21902F91100E0E31F0000EA48F8020078109FE578009FE578301C +S21902F9269FE5041099E8005081E50480A0E1006080E501A0A0EB +S21902F93BE1007083E50060E0E30070A0E1821262E054009FE535 +S21902F950012182E0901C83E02333A0E1825183E02EE8FFEB00FB +S21902F96540A0E12CE8FFEB000064E0050050E10400002AAAEB8A +S21902F97AFFEB00309AE5000053E3F7FFFF1A006097E52808A0E7 +S21902F98FE1E7FEFFEB0600A0E1030000EA44ED030048ED0300CC +S21902F9A44CED0300D34D6210F0AF1BE90DC0A0E170D82DE9AC7E +S21902F9B9309FE504B04CE20160A0E1004093E50350A0E100002E +S21902F9CE54E31800001AADEEFFEB90009FE5043090E50500531A +S21902F9E3E30500001AB831D0E1000053E30000001AD5EEFFEB6F +S21902F9F80400A0E170A81BE9000053E30400001A670100EB0AA1 +S21902FA0D30A0E30030C6E50100A0E370A81BE950409FE58020FB +S21902FA22A0E30410A0E1E7EEFFEB44309FE5000085E5004083CC +S21902FA37E5000095E5000050E30800000A2CC09FE500109CE50E +S21902FA4C0130D1E40030C6E5002095E50100A0E300108CE5013D +S21902FA612042E2002085E570A81BE9C03903005CED0300B0F3B4 +S21902FA76030030F403000DC0A0E170D82DE904B04CE204D04D9B +S21902FA8BE20040A0E10150A0E1C5FFFFEB000050E32A00000AD5 +S21902FAA00030D5E5FF0053E32700001A19604BE20400A0E119A6 +S21902FAB5104BE2BCFFFFEB000050E3FAFFFF0A19305BE5F400A1 +S21902FACA53E30D00001A0400A0E10330A0E30030C5E5FF10A0FF +S21902FADFE3670000EB0400A0E1FC10A0E3640000EB0400A0E1EE +S21902FAF40610A0E3610000EB2E0000EB0100A0E3100000EAFD7D +S21902FB090053E30E00001A0400A0E10610A0E1A4FFFFEB0000D9 +S21902FB1E50E3FAFFFF0A0400A0E1FF10A0E3540000EB0400A09C +S21902FB33E1FC10A0E3510000EB19105BE50400A0E14E0000EBE3 +S21902FB480000A0E370A81BE90DC0A0E170D82DE904B04CE20470 +S21902FB5DD04DE26440A0E30060A0E119504BE2090000EA0140BB +S21902FB7254E20200001A0F0000EB6440A0E3040000EA28309F1F +S21902FB87E5482093E56400A0E30FE0A0E102F0A0E10600A0E14C +S21902FB9C0510A0E1B5FFFFEB000050E3F0FFFF0A19005BE50095 +S21902FBB10000EA5000000070A81BE90DC0A0E1F0DD2DE9A4709D +S21902FBC69FE504B04CE20760A0E19C509FE59C409FE59CA09F2A +S21902FBDBE59C809FE50A0000EA0400A0E1002095E50610A0E1DF +S21902FBF0B1EEFFEB000050E3030000DA003095E5006086E003ED +S21902FC053060E0003085E51FEEFFEB003095E5000053E30800FA +S21902FC1A000A043094E5050053E30100001A0400A0E147EEFF08 +S21902FC2FEB043094E5000053E3E9FFFF1ADA0000EB00708AE546 +S21902FC440060A0E3006085E50400A0E130EEFFEB443098E50673 +S21902FC590053E10200000A446088E50600A0E11EDFFFEBF0AD33 +S21902FC6E1BE934F40300C43903005CED030034F5030050000083 +S21902FC83000DC0A0E110D82DE9A8209FE5A8409FE5003092E5BA +S21902FC98FF1001E20110C3E4240051E3003082E504B04CE201D4 +S21902FCAD30A00300308405002094E5230051E30030A0130130AB +S21902FCC2A003000052E30030A003000053E30500000A68209F0F +S21902FCD7E50130A0E3003082E560109FE5013043E2003081E501 +S21902FCEC58209FE5003092E5013083E2003082E5010C53E309E0 +S21902FD0100000A38309FE5002093E5000052E30800000A2C20C5 +S21902FD169FE5003092E5013083E2003082E5030053E30200003E +S21902FD2B1AA2FFFFEB0030A0E3003084E510A81BE934F50300E3 +S21902FD4050ED030054ED030058ED0300C43903000DC0A0E1107D +S21902FD55D82DE904B04CE2790000EB0040A0E114009FE51410E1 +S21902FD6A9FE5472FA0E3DDE2FFEB0400A0E1820000EB10A81B92 +S21902FD7FE970300300783003000DC0A0E110D82DE904B04CE203 +S21902FD946B0000EB0040A0E114009FE514109FE514209FE5CF75 +S21902FDA9E2FFEB0400A0E1740000EB10A81BE970300300883077 +S21902FDBE03002E0100000DC0A0E1F0D82DE904B04CE20060A0E9 +S21902FDD3E10150A0E177FFFFEB44209FE5003092E540709FE53E +S21902FDE8033183E08340A0E1030000EA483097E56400A0E30F4D +S21902FDFDE0A0E103F0A0E10600A0E10510A0E11AFFFFEB0000F5 +S21902FE1250E30200001A014044E2010074E3F3FFFF1AF0A81B08 +S21902FE27E9BC390300500000000DC0A0E10E002DE930D82DE9FE +S21902FE3C10B04CE204309BE50050A0E3043043E2040053E3039F +S21902FE51F19F97240000EA9CFE02006CFE0200BCFE0200C8FED6 +S21902FE660200E8FE020068409FE568309FE5001094E50120A004 +S21902FE7BE3002083E5000051E30100001A65F5FFEB000084E504 +S21902FE90000094E59ED2FFEB130000EA3C309FE534209FE500BE +S21902FEA55093E5000092E50010A0E3001083E58AD2FFEB0B00A6 +S21902FEBA00EA18309FE5005093E5080000EA14209FE508309B31 +S21902FECFE5005092E5003082E5030000EAC8390300CC390300DB +S21902FEE4BC39030033FFFFEB0500A0E130A81BE90DC0A0E1300E +S21902FEF9D82DE904B04CE204D04DE20040A0E10200A0E1015085 +S21902FF0EA0E128DDFFEB0400A0E10030A0E3003085E515104B25 +S21902FF23E2D4FEFFEB000050E30300000A15305BE5030053E326 +S21902FF380130A003003085050100A0E330A81BE90DC0A0E13041 +S21902FF4DD82DE92C409FE50000E0E3343094E504B04CE20FE049 +S21902FF62A0E103F0A0E10050A0E1343094E50000A0E30FE0A0CE +S21902FF77E103F0A0E10500A0E130A81BE9500000000DC0A0E119 +S21902FF8C00D82DE910309FE5342093E504B04CE20FE0A0E10287 +S21902FFA1F0A0E100A81BE9500000000DC0A0E110D82DE9441037 +S21902FFB69FE544209FE50030A0E3003081E53C409FE5000092E8 +S21902FFCBE5343094E504B04CE20FE0A0E103F0A0E128209FE5C6 +S21902FFE0303094E5000092E50FE0A0E103F0A0E118209FE50114 +S21902FFF530A0E3003082E510A81BE9C0F70300A8F30300500042 +S21903000A0000ACF303005CF803000DC0A0E170D82DE970309FF5 +S21903001FE570209FE50150A0E3005083E504B04CE264409FE535 +S2190300340030A0E3003082E50060E0E3342094E50600A0E10FDF +S219030049E0A0E102F0A0E148309FE5000083E5342094E5050090 +S21903005EA0E10FE0A0E102F0A0E1301094E50600A0E10FE0A052 +S219030073E101F0A0E124309FE5000083E5302094E50500A0E18E +S2190300880FE0A0E102F0A0E170A81BE9C0F703005CF8030050FB +S21903009D000000A8F30300ACF303000DC0A0E170D82DE9AC604E +S2190300B29FE5003096E504B04CE2000053E31E00001A9C409F37 +S2190300C7E5343094E50000E0E30FE0A0E103F0A0E10050A0E1E2 +S2190300DC343094E50100A0E30FE0A0E103F0A0E1141094E574B1 +S2190300F1309FE574209FE5043081E570309FE5082081E50C309E +S21903010681E568209FE568309FE5102081E5143081E560209FEF +S21903011BE560309FE5182081E51C3081E5342094E50500A0E12B +S2190301300FE0A0E102F0A0E10130A0E3003086E540309FE5404C +S219030145409FE5B010D3E10400A0E1D4ECFFEB34209FE504302A +S21903015A94E5003082E570A81BE9D03903005000000050FD02B1 +S21903016F0088FD020084FC020050FB020030FE0200F4FE0200F9 +S219030184C4FD020050F803005CED0300A4F303000DC0A0E130EC +S219030199D82DE904B04CE2BAECFFEB78309FE578109FE5002091 +S2190301AE93E50350A0E1040091E50140A0E1000052E114000065 +S2190301C30A040050E30E00001A90FFFFEB54309FE554009FE55D +S2190301D8000083E550109FE50130A0E3003081E548109FE54850 +S2190301ED309FE50D20A0E30020C0E5003081E53C209FE5003026 +S219030202A0E3003082E5043094E5000053E30000001AA3FFFF27 +S219030217EB043094E5003085E530A81BE9A4F303005CED0300D6 +S21903022C30F40300B0F30300C039030034F5030034F40300C4D1 +S2190302413903000DC0A0E1F0DF2DE950019FE550119FE55031F6 +S2190302569FE550519FE550419FE501A0A0E300A085E50080A07F +S21903026BE3008081E504B04CE2003084E50A20A0E1E3CBFFEBEF +S2190302800410A0E12C019FE50220A0E3DFCBFFEB0510A0E1202C +S219030295019FE50A20A0E11C719FE5DACBFFEB0710A0E11401CF +S2190302AA9FE50520A0E310619FE5D5CBFFEB0610A0E108019F4D +S2190302BFE50520A0E304419FE5D0CBFFEB008084E501F3FFEB80 +S2190302D4A2E8FFEBF4809FE50590A0E1F0309FE50450A0E1030F +S2190302E90058E10360A0E10900000A0A40A0E10800A0E10FE085 +S2190302FEA0E104F098E5000050E30C4088150C00880510808824 +S219030313E2060058E1F6FFFF1AB8309FE5002093E5000052E365 +S2190303280200001AAC009FE56DE1FFEBF0AF1BE9003099E500E3 +S21903033D0053E30600000A98009FE5430000EB000050E30200DE +S219030352000A8C009FE563E1FFEB010000EA0130A0E3003085F2 +S219030367E5003095E5000053E30A00000A0700A0E1BBEFFFEB84 +S21903037C0010A0E164009FE558E1FFEB38009FE5B6EFFFEB007D +S21903039110A0E154009FE553E1FFEB41FFFFEBF0AF1BE9EC2FE0 +S2190303A60300B8F7030028230000CCF7030050F80300C42F0333 +S2190303BB001C300300103903003830030084F80300603003000D +S2190303D09CF90300EC3B0300FC3B0300BCF70300943003007027 +S2190303E5F80300B4300300E0300300E83003000DC0A0E110D8B5 +S2190303FA2DE94C309FE504B04CE2000093E50140A0E100005064 +S21903040FE30000000A87DFFFEB0030D4E5020053E30900001A4F +S2190304241C0084E224109FE50620A0E3BCE1FFEB000050E3031B +S21903043900001A101084E210009FE50420A0E37ADFFFEB10A8D0 +S21903044E1BE938F50300B0F70300103903000DC0A0E1F0DF2D1D +S219030463E90010A0E34B2FA0E36C319FE504B04CE252DF4DE2A0 +S219030478000083E5165E4BE20500A0E19FDFFFEB54419FE55403 +S21903048D119FE50030A0E30030C4E50130C4E50230C4E5033049 +S2190304A2C4E50100A0E33C219FE528304BE20200C3E734319FFA +S2190304B7E528204BE20300C2E72CC19FE50620A0E328304BE283 +S2190304CC0C20C3E720319FE55C310BE5510F4BE255DFFFEBFF41 +S2190304E1C0A0E3053DE0E328104BE203C0C1E74F2FE0E3013074 +S2190304F6A0E102C0C3E7F8309FE503C0C1E7F4109FE528304BBA +S21903050BE201C0C3E7EC309FE528104BE203C0C1E7E4109FE59E +S21903052028304BE201C0C3E70270A0E3D8309FE528104BE203E5 +S219030535C0C1E70590A0E1CC109FE528304BE201C0C3E7048057 +S21903054AA0E1C0309FE528104BE203C0C1E70850A0E101308342 +S21903055FE203C0C1E734004BE2A8209FE54410A0E3CEFBFFEBFB +S2190305745BAF4BE228E5FFEB0060A0E10900A0E14B1FA0E344A0 +S21903058930A0E300308DE50A20A0E1013043E23EFCFFEBA1E852 +S21903059EFFEB0030D5E5000053E30800001A0130D8E5000053D3 +S2190305B3E30500001A0230D5E5000053E30200001A0340D5E5EE +S2190305C8000054E31200000A4400A0E3D6FBFFEB0000A0E31BA3 +S2190305DD0000EA38F5030010390300B0F70300C8FEFFFFC9FE66 +S2190305F2FFFFCAFEFFFF55553412BCFEFFFFBDFEFFFFBEFEFF0C +S219030607FFC0FEFFFFC1FEFFFFC2FEFFFFC4FEFFFFF4030300E6 +S21903061CFFE4FFEB000066E07D0E50E3DBFFFF3A0730A0E10124 +S2190306317047E2000053E3CEFFFFCA4400A0E3BBFBFFEB0830A8 +S2190306469FE50000E0E3004083E5000000EAB8F70300F0AF1B52 +S21903065BE90DC0A0E1F0DF2DE904B04CE214D04DE20270A0E17E +S21903067001A0A0E12C000BE5006053E2BF00001A0A0057E1423D +S21903068500009A010857E30300002AFF0057E30800A0830000EA +S21903069AA093020000EA010457E31800A0231000A03340139F35 +S2190306AFE53220A0E10230D1E7003083E0200073E20600000A74 +S2190306C41770A0E12C101BE5203060E23133A0E11AA083E1112F +S2190306D910A0E12C100BE50798A0E12998A0E10A00A0E12788AB +S2190306EEA0E10810A0E1710200EB0040A0E10A00A0E10810A073 +S219030703E1110100EB0060A0E1990602E02C101BE52138A0E183 +S219030718044883E1020054E10500002A016046E2074094E00268 +S21903072D00002A020054E10160463207408430044062E00400F0 +S219030742A0E10810A0E15C0200EB0050A0E10400A0E10810A029 +S219030757E1FC0000EB990002E02C101BE50138A0E12338A0E170 +S21903076C055883E1020055E10400002A010040E2075095E00159 +S21903078100002A020055E10100403206C880E1E60000EA000087 +S21903079657E30300001A0100A0E30210A0E1E90000EB0070A0F4 +S2190307ABE1010857E30720A0E10300002AFF0057E30800A083D4 +S2190307C00000A093020000EA010457E31800A0231000A03318E8 +S2190307D5129FE53220A0E10230D1E7003083E0200073E201307B +S2190307EAA00330300B050AA067003400000A202060E21770A0E7 +S2190307FFE12C101BE53A52A0E13132A0E11110A0E12C100BE501 +S2190308141AA083E12788A0E10798A0E12998A0E10500A0E10889 +S21903082910A0E1230200EB0040A0E10500A0E10810A0E1C3006E +S21903083E00EB0060A0E1990602E02A38A0E1044883E102005467 +S219030853E10500002A016046E2074094E00200002A020054E1D1 +S2190308680160463207408430044062E00400A0E10810A0E10FEC +S21903087D0200EB0050A0E10400A0E10810A0E1AF0000EB99004F +S21903089202E00A38A0E12338A0E1055883E1020055E1050000CA +S2190308A72A010040E2075095E00200002A020055E10100403244 +S2190308BC07508530066880E105A062E030600BE50798A0E12994 +S2190308D198A0E10A00A0E12788A0E10810A0E1F60100EB00407B +S2190308E6A0E10A00A0E10810A0E1960000EB0060A0E19906024D +S2190308FBE02C101BE52138A0E1044883E1020054E10500002AD4 +S219030910016046E2074094E00200002A020054E1016046320743 +S219030925408430044062E00400A0E10810A0E1E10100EB005000 +S21903093AA0E10400A0E10810A0E1810000EB990002E02C101BC3 +S21903094FE50138A0E12338A0E1055883E1020055E10400002AE9 +S219030964010040E2075095E00100002A020055E10100403206AB +S219030979C880E16D0000EA0A0056E10020A08330200B8502C0BB +S21903098EA0816800008A010856E30620A0E10300002AFF0056CE +S2190309A3E30800A0830000A093020000EA010456E31800A023F1 +S2190309B81000A03330109FE53220A0E10230D1E7003083E0200B +S2190309CD0073E20800001A2C301BE506005AE10700539101C04D +S2190309E2A0E300C0A0310010A0E330100BE5500000EA003103B3 +S2190309F700202060E23732A0E1166083E11770A0E12C101BE559 +S219030A0C3A52A0E13132A0E11110A0E12C100BE51AA083E126CA +S219030A2198A0E10628A0E12228A0E10500A0E134200BE5091042 +S219030A36A0E1A00100EB0040A0E10500A0E10910A0E140000075 +S219030A4BEB34201BE50080A0E1980202E02A38A0E1044883E13F +S219030A60020054E10500002A018048E2064094E00200002A0280 +S219030A750054E10180483206408430044062E00400A0E1091016 +S219030A8AA0E18B0100EB0050A0E10400A0E10910A0E12B00003C +S219030A9FEB34201BE5900202E00A38A0E12338A0E1055883E127 +S219030AB4020055E10500002A010040E2065095E00200002A02A2 +S219030AC90055E1010040320650853008C880E105A062E02C0810 +S219030ADEA0E12738A0E10018CCE10328C7E191020EE0900202ED +S219030AF3E0930101E0900303E0011092E00138832201E89EE053 +S219030B082138A3E00A0053E10500008A2C101BE50030A0130107 +S219030B1D30A003000053E301005E110000009A01C04CE2002099 +S219030B32A0E330200BE53CC00BE530301BE540204BE238300B97 +S219030B47E5030092E9F0AF1BE9000051E31F00000A0130A0E37A +S219030B5C0020A0E3010050E11900003A010251E300005131019A +S219030B7112A0310332A031FAFFFF3A020151E300005131811002 +S219030B86A0318330A031FAFFFF3A010050E10100402003208293 +S219030B9B21A10050E1A1004020A3208221210150E1210140200E +S219030BB023218221A10150E1A1014020A3218221000050E323AF +S219030BC532B0112112A011EFFFFF1A0200A0E10EF0A0E104E04F +S219030BDA2DE5640100EB0000A0E30080BDE80DC0A0E1F0DF2DAA +S219030BEFE904B04CE224D04DE20260A0E10180A0E138000BE5EE +S219030C0430C04BE234C00BE5007053E29700001A080056E11825 +S219030C1900009A010856E30300002AFF0056E30800A083000052 +S219030C2EA093020000EA010456E31800A0231000A033D4129F09 +S219030C43E53220A0E10230D1E7003083E0203073E23C300BE55E +S219030C585200000A1663A0E138101BE5203063E23C201BE531BF +S219030C6D33A0E1188283E11112A0E138100BE5490000EA0000A9 +S219030C8256E30300001A0100A0E30210A0E1AEFFFFEB0060A051 +S219030C97E1010856E30620A0E10300002AFF0056E30800A083E6 +S219030CAC0000A093020000EA010456E31800A0231000A03354BC +S219030CC1129FE53220A0E10230D1E7003083E0203073E23C301F +S219030CD60BE5088066003100000A3C201BE53C304BE208109348 +S219030CEBE83C101BE5202062E21663A0E13852A0E13C32A0E140 +S219030D0040200BE51CC1A0E138C00BE5188183E12678A0E1061E +S219030D15A8A0E12AA8A0E10500A0E10710A0E1E50000EB004017 +S219030D2AA0E10500A0E10710A0E185FFFFEB9A0002E02838A023 +S219030D3FE1044883E1020054E10300002A064094E00100002ABD +S219030D54020054E106408430044062E00400A0E10710A0E1D4DA +S219030D690000EB0050A0E10400A0E10710A0E174FFFFEB9A009D +S219030D7E02E00838A0E12338A0E1055883E1020055E1030000DD +S219030D932A065095E00100002A020055E106508530058062E019 +S219030DA806A8A0E12AA8A0E10800A0E12678A0E10710A0E1BFAD +S219030DBD0000EB0040A0E10800A0E10710A0E15FFFFFEB9A006A +S219030DD202E038C01BE52C38A0E1044883E1020054E10300005B +S219030DE72A064094E00100002A020054E106408430044062E029 +S219030DFC0400A0E10710A0E1AD0000EB0050A0E10400A0E107C8 +S219030E1110A0E14DFFFFEB9A0002E038101BE50138A0E1233824 +S219030E26A0E1055883E1020055E10300002A065095E00100003C +S219030E3B2A020055E106508530055062E038500BE534201BE5CA +S219030E50000052E39600000A38301BE53CC01BE5333CA0E14814 +S219030E65300BE50010A0E344100BE58B0000EA080057E10500BF +S219030E7A009A48000BE544800BE540204BE20C0012E930C04B06 +S219030E8FE2860000EA010857E30720A0E10300002AFF0057E3A3 +S219030EA40800A0830000A093020000EA010457E31800A02310BD +S219030EB900A03358109FE53220A0E10230D1E7003083E02030BD +S219030ECE73E23C300BE51100001A38301BE5070058E10600532A +S219030EE3910200003A06C053E00780C8E038C00BE534101BE5D1 +S219030EF8000051E36C00000A38201BE548200BE544800BE5408F +S219030F0D204BE20C0012E901C0A0E1640000EA003203003C3042 +S219030F221BE53CC01BE538201BE5203063E240300BE540101BFE +S219030F37E53633A0E1177C83E1166CA0E13851A0E13231A0E1E6 +S219030F4C122CA0E138200BE5188C83E12798A0E10738A0E12356 +S219030F6138A0E10500A0E14C300BE50910A0E1520000EB0040B1 +S219030F76A0E10500A0E10910A0E1F2FEFFEB4C201BE500A0A037 +S219030F8BE19A0202E02838A0E1044883E1020054E10500002AF3 +S219030FA001A04AE2074094E00200002A020054E101A04A320725 +S219030FB5408430044062E00400A0E10910A0E13D0000EB00500E +S219030FCAA0E10400A0E10910A0E1DDFEFFEB4C201BE5900202A5 +S219030FDFE00838A0E12338A0E1055883E1020055E10500002A50 +S219030FF4010040E2075095E00200002A020055E1010040320713 +S219031009508530058062E00A3880E12308A0E126C8A0E1001828 +S21903101EC3E10C28C6E191020EE0900202E09C0101E0900C0C1B +S219031033E0011092E001C88C2201E89EE021C8ACE008005CE1A5 +S2190310480500008A38101BE50030A0130130A003000053E301C6 +S21903105D005E110200009A06205EE007C0CCE002E0A0E13430CD +S2190310721BE5000053E30D00000A38201BE50E1052E00C80C818 +S219031087E03CC01BE5313CA0E140101BE5183183E148300BE51D +S21903109C388CA0E144800BE534C01BE540204BE20C0012E90CAA +S2190310B1008CE830304BE2030093E8F0AF1BE9000051E32600A6 +S2190310C6000A0130A0E3010050E10EF0A031010251E3000051C6 +S2190310DB310112A0310332A031FAFFFF3A020151E300005131F2 +S2190310F08110A0318330A031FAFFFF3A0020A0E3010050E101F5 +S219031105004020A10050E1A1004020E3208221210150E121017F +S21903111A402063218221A10150E1A1014020E321822103C0A052 +S21903112FE1000050E32332B0112112A011EEFFFF1A0E2212E26B +S2190311440EF0A001EC0112E1A10180106C0112E121018010ECDF +S2190311590012E1A10080100EF0A0E104E02DE5010000EB0000F4 +S20E03116EA0E30080BDE80EF0A0E148 +S2190311785B2D772074696D656F75745D205B3C656E7472795F8F +S21903118D706F696E743E5D000000004578656375746520616EBE +S2190311A220696D616765202D2077697468204D4D55206F66667A +S2190311B7006578656300000000776169742074696D656F75749A +S2190311CC000000007374617274696E6720616464726573730094 +S2190311E100000041626F757420746F2073746172742065786543 +S2190311F6637574696F6E206174202570202D2061626F727420FB +S21903120B77697468205E432077697468696E2025642073656392 +S2190312206F6E64730A0000004C6F616420612066696C65006CC6 +S2190312356F616400000000454C4620696D61676573206E6F748A +S21903124A20737570706F727465640A000000496E76616C6964B0 +S21903125F20532D7265636F7264206174206F6666736574202572 +S219031274702C20696E7075743A2025630A00000042616420530B +S2190312892D7265636F726420636F756E74206174206F66667390 +S21903129E65742025700A0000000041646472657373206F66667A +S2190312B3736574203D2025700A00000000417474656D707420B7 +S2190312C8746F206C6F616420532D7265636F726420646174618D +S2190312DD20746F20616464726573733A202570205B6E6F742010 +S2190312F2696E2052414D5D0A00002A2A2A205761726E696E672D +S2190313072120436865636B73756D206661696C757265202D20E0 +S21903131C416464723A20256C782C202530326C58203C3E202560 +S21903133130326C580A0000456E74727920706F696E743A202594 +S219031346702C20616464726573732072616E67653A2025702D9F +S21903135B25700A0000496E76616C696420532D7265636F7264F0 +S219031370206174206F6666736574203078256C782C207479704A +S219031385653A2025780A00256308000A000000766572626F73BA +S21903139A65006C6F61642072617720646174610000006C6F61D1 +S2190313AF64206164647265737300000000646F776E6C6F61645F +S2190313C4206D6F6465202854465450206F722078797A4D4F4455 +S2190313D9454D2900000000686F7374206E616D652028495020BC +S2190313EE6164647265737329000066696C65206E616D65000072 +S21903140300496E76616C696420495020616464726573733A20EC +S21903141825730A006D6F64656D000000496E76616C69642027F5 +S21903142D6D6F6465273A2025730A007466747000000000544682 +S2190314425450206D6F6465207265717569726573206120776F0D +S219031457726B696E67206E6574776F726B0A00000046696C65A9 +S21903146C206E616D65206D697373696E670A0000757361676569 +S2190314813A206C6F61642025730A0053706563696669656420E6 +S219031496616464726573732028257029206973206E6F74206957 +S2190314AB6E2052414D2E0A000043616E2774206C6F61642027CA +S2190314C02573273A2025730A00000000526177206C6F6164204A +S2190314D572657175697265732061206D656D6F72792061646407 +S2190314EA726573730A005261772066696C65206C6F61646564AB +S2190314FF2025702D25700A0000454C4600556E7265636F676E37 +S219031514697A656420696D61676520747970653A20256C780A9C +S2190315290000007B636D64737D00004D616E61676520464C41CA +S21903153E534820696D6167657300666973005B2D6C5D000000CC +S219031553004D616E61676520636F6E66696775726174696F6E9A +S219031568206B65707420696E20464C415348206D656D6F727954 +S21903157D00000066636F6E666967005B2D665D00000000496E73 +S219031592697469616C697A6520464C41534820496D6167652030 +S2190315A753797374656D205B4649535D00696E69740000000034 +S2190315BC5B2D635D00000000446973706C617920636F6E7465BB +S2190315D16E7473206F6620464C41534820496D61676520537936 +S2190315E67374656D205B4649535D000000006C697374000000B9 +S2190315FB0000000000446973706C61792066726565205B6176E9 +S21903161061696C61626C655D206C6F636174696F6E73207769AA +S2190316257468696E20464C41534820496D616765205379737491 +S21903163A656D205B4649535D000066726565000000002D6620B2 +S21903164F3C666C6173685F616464723E202D6C203C6C656E6741 +S21903166474683E00457261736520464C41534820636F6E746598 +S2190316796E74730000000065726173650000004C4F434B204660 +S21903168E4C41534820636F6E74656E7473006C6F636B000000E0 +S2190316A300554E4C4F434B20464C41534820636F6E74656E74B5 +S2190316B873000000756E6C6F636B00006E616D65000000004431 +S2190316CD6973706C617920616E20696D6167652066726F6D2068 +S2190316E2464C41534820496D6167652053797374656D205B4614 +S2190316F749535D000064656C65746500005B2D62203C6D656DE5 +S21903170C6F72795F6C6F61645F616464726573733E5D205B2DDF +S219031721635D206E616D65000000004C6F616420696D61676587 +S2190317362066726F6D20464C41534820496D61676520537973D2 +S21903174B74656D205B4649535D20696E746F2052414D000000A7 +S2190317606C6F6164000000002D62203C6D656D5F626173653E6A +S219031775202D6C203C696D6167655F6C656E6774683E205B2D78 +S21903178A73203C646174615F6C656E6774683E5D200A202020D3 +S21903179F202020202020202020202020205B2D66203C666C6110 +S2190317B473685F616464723E5D205B2D65203C656E7472795FAE +S2190317C9706F696E743E5D205B2D72203C72616D5F616464728E +S2190317DE3E5D205B2D6E5D203C6E616D653E000000004372658B +S2190317F361746520616E20696D61676500637265617465000019 +S2190318082A2A2A20696E76616C696420276669732720636F6D2F +S21903181D6D616E643A2025730A000066697320000000006675D5 +S2190318326C6C20696E697469616C697A6174696F6E2C20657296 +S2190318476173657320616C6C206F6620666C617368000000005C +S21903185C41626F757420746F20696E697469616C697A65205BA4 +S219031871666F726D61745D20464C41534820696D616765207330 +S219031886797374656D002A2A2041626F727465640A002A2A2A56 +S21903189B20496E697469616C697A6520464C41534820496D6139 +S2190318B067652053797374656D0A0000202020696E69746961C2 +S2190318C56C697A6174696F6E206661696C65642025703A2030D8 +S2190318DA782578282573290A0000202020205761726E696E6793 +S2190318EF3A2064657669636520636F6E74656E7473206E6F7413 +S219031904206572617365642C20736F6D6520626C6F636B732074 +S2190319196D6179206E6F7420626520757361626C650A005265B5 +S21903192E64426F6F7400526564426F6F745B6261636B75705DC7 +S21903194300526564426F6F7420636F6E66696700004649532040 +S2190319586469726563746F72790000004572726F722077726921 +S21903196D74696E6720696D6167652064657363726970746F7229 +S219031982732061742025703A2030782578282573290A00000099 +S21903199700646973706C617920636865636B73756D7300000057 +S2190319AC4E616D652020202020202020202020202020464C410A +S2190319C1534820616464722020202573202020204C656E677441 +S2190319D668202020202020456E74727920706F696E740A000066 +S2190319EB00436865636B73756D000000004D656D2061646472D2 +S219031A0000000000252D313673202030782530386C5820202004 +S219031A1530782530386C58202030782530386C58202030782575 +S219031A2A30386C580A00202030782530386C58202E2E203078EC +S219031A3F2530386C580A0000006D656D6F7279206261736520BB +S219031A54616464726573730072616D20626173652061646472D9 +S219031A6965737300000000656E74727920706F696E74206164B4 +S219031A7E647265737300464C415348206D656D6F727920626120 +S219031A9373652061646472657373000000696D616765206C6564 +S219031AA86E677468205B696E20464C4153485D00696D61676530 +S219031ABD2073697A65205B61637475616C20646174615D000025 +S219031AD20000646F6E277420636F70792066726F6D2052414D6C +S219031AE720746F20464C4153482C206A75737420757064617401 +S219031AFC65206469726563746F72790066696C65206E616D6512 +S219031B11000000696E76616C696420617267756D656E747300DA +S219031B260000726571756972656420706172616D657465722040 +S219031B3B6D697373696E670000496E76616C696420464C415386 +S219031B504820696D6167652073697A652F6C656E6774682063FE +S219031B656F6D62696E6174696F6E0A00000000496E76616C69C6 +S219031B7A6420464C41534820616464726573733A20257020281F +S219031B8F2573290A0020202076616C69642072616E6765206948 +S219031BA4732025702D25700A000000004E616D6520697320741F +S219031BB96F6F206C6F6E672C206D757374206265206C6573738E +S219031BCE207468616E2025642063686172730A0000002A2A20D7 +S219031BE35741524E494E473A2052414D20616464726573733A55 +S219031BF8202570206D617920626520696E76616C69640A004379 +S219031C0D616E2774206C6F6361746520256C642062797465735C +S219031C22206672656520696E20464C4153480A000000496D613D +S219031C37676520666F756E642C2062757420464C4153482061E2 +S219031C4C64647265737320696E636F72726563740A00000049BA +S219031C616D61676520666F756E642C20627574204C454E47545F +S219031C764820697320696E636F727265637420283078256C782B +S219031C8B20213D203078256C78290A0000416E20696D616765E8 +S219031CA0206E616D6564202725732720657869737473000043F9 +S219031CB5616E27742070726F6772616D2074686973207265675A +S219031CCA696F6E202D20636F6E7461696E7320636F64652069A7 +S219031CDF6E20757365210A000043616E277420657261736520E5 +S219031CF4726567696F6E2061742025703A203078257828257346 +S219031D09290A0043616E27742070726F6772616D2072656769FE +S219031D1E6F6E2061742025703A2030782578282573290A00008F +S219031D33004572726F722065726173696E672061742025703A9C +S219031D482030782578282573290A00004572726F722070726FAB +S219031D5D6772616D6D696E672061742025703A203078257828A6 +S219031D722573290A00006C656E67746800006D697373696E670D +S219031D8720617267756D656E740000000043616E277420657218 +S219031D9C617365207468697320726567696F6E202D20636F6EC8 +S219031DB17461696E7320636F646520696E20757365210A0000AC +S219031DC600004572726F72206C6F636B696E6720617420257045 +S219031DDB3A2030782578282573290A00004572726F7220756E4C +S219031DF06C6F636B696E672061742025703A2030782578282559 +S219031E0573290A00000000696D616765206E616D6500004465AD +S219031E1A6C65746520696D61676520272573270000004E6F20FB +S219031E2F696D616765202725732720666F756E640A0000000047 +S219031E446D656D6F7279205B6C6F61645D2062617365206164D0 +S219031E5964726573730000646973706C617920636865636B73C4 +S219031E6E756D000000004E6F742061206C6F616461626C65204F +S219031E83696D6167650A000000436865636B73756D3A20307800 +S219031E982530386C780A00002A2A205761726E696E67202D20FB +S219031EAD636865636B73756D206661696C7572652E2020737468 +S219031EC26F7265643A2030782530386C782C20636F6D70757402 +S219031ED765643A2030782530386C780A00464C4153483A20647C +S219031EEC726976657220696E6974206661696C6564212C207378 +S219031F0174617475733A20307825780A000000464C4153483A41 +S219031F16202570202D2025702C20256420626C6F636B73206FF5 +S219031F2B6620257020627974657320656163682E0A000000004E +S219031F40746F6F2066657720617267756D656E74730000007565 +S219031F556E7265636F676E697A656420636F6D6D616E640000D8 +S219031F6A000052756E2073637269707420617420626F6F7400A7 +S219031F7F00626F6F745F73637269707400426F6F7420736372A1 +S219031F9469707400626F6F745F7363726970745F646174610042 +S219031FA9000000426F6F74207363726970742074696D656F751F +S219031FBE742028313030306D73207265736F6C7574696F6E290C +S219031FD300626F6F745F7363726970745F74696D656F757400E3 +S219031FE825733A2000000000257320007472756500000000660C +S219031FFD616C7365000000256C64200000000030782530325886 +S21903201200003A000000200000003F3F00000A0000002E2E2053 +S21903202725730A0000456E746572207363726970742C20746522 +S21903203C726D696E617465207769746820656D707479206C6977 +S2190320516E650A000000003E3E20006C69737420636F6E66690E +S2190320666775726174696F6E206F6E6C79002A2A20696E7661F0 +S21903207B6C696420656E7472790A0000005570646174652052DE +S2190320906564426F6F74206E6F6E2D766F6C6174696C6520635B +S2190320A56F6E66696775726174696F6E0000004572726F7220DF +S2190320BA77726974696E6720636F6E6669672064617461206134 +S2190320CF742025703A2030782578282573290A0000526571759C +S2190320E465737420666F7220636F6E6669672076616C75652039 +S2190320F927257327202D2077726F6E6720747970650A004361BA +S21903210E6E27742066696E6420636F6E6669672064617461207A +S219032123666F7220272573270A000000004E6F2073706163655F +S21903213820746F2061646420272573270A000000464C415348C0 +S21903214D20636F6E66696775726174696F6E20636865636B734C +S219032162756D206572726F72206F7220696E76616C6964206BA1 +S21903217765790A0000657468300000000073635F6C706500007C +S21903218C4346206361726420776F6E277420676F207265616432 +S2190321A179210A000000004E6F742061205343204C50452C20C8 +S2190321B6736F7272790A000000000A00000025733A202573200F +S2190321CB25732025730A00000043616E27742070617273652095 +S2190321E04349530A0000000043616E277420666574636820639F +S2190321F56F6E66696720696E666F0A00000000436F6D70616391 +S21903220A7420466C61736820636172642072656D6F7665642148 +S21903221F0A000000002E2E2E2057616974696E6720666F722094 +S2190322346E6574776F726B20636172643A2000002E0000005BE6 +S2190322492D765D205B2D6E203C636F756E743E5D205B2D742006 +S21903225E3C74696D656F75743E5D205B2D69203C49505F61645B +S21903227364723E5D202D68203C49505F616464723E00000000FB +S2190322884E6574776F726B20636F6E6E656374697669747920F0 +S21903229D7465737400000070696E67000000003C636F756E7451 +S2190322B23E202D206E756D626572206F66207061636B657473DB +S2190322C720746F2074657374003C74696D656F75743E202D2029 +S2190322DC6D617820236D7320706572207061636B6574205B7290 +S2190322F16F756E7420747269705D006C6F63616C204950206189 +S21903230664647265737300000000686F73742049502061646475 +S21903231B72657373003C6C656E6774683E202D2073697A6520A4 +S2190323306F66207061796C6F61640000766572626F7365206F2C +S2190323457065726174696F6E0000003C726174653E202D207412 +S21903235A696D65206265747765656E207061636B657473000016 +S21903236F000000000050494E47202D20496E76616C6964206F60 +S2190323847074696F6E207370656369666965640A0000000050EC +S219032399494E47202D20496E76616C69642049502061646472A1 +S2190323AE6573733A2025730A000050494E473A2043616E277496 +S2190323C32066696E642061646472657373206F66207365727661 +S2190323D8657220272573270A0000000050494E47202D20686F8F +S2190323ED73742049502061646472657373207265717569726510 +S219032402640A000000004E6574776F726B2050494E47202D20AA +S21903241766726F6D202573000020746F2025730A0069636D70CE +S21903242C202D207365713A20256C642C2074696D653A20256CA8 +S2190324416420287469636B73290A0050494E47202D20726563AC +S219032456656976656420256C64206F6620256C6420657870656B +S21903246B637465640A0000000053707572696F757320496E74F5 +S219032480657272757074212121202D20766563746F723A2025BB +S219032495642C20646174613A2025780A0000005152590043613F +S2190324AA6E2774206964656E7469667920464C4153482C207343 +S2190324BF6F7272790A00000000457272203D2025780A000000DD +S2190324D430313233343536373839616263646566000000005039 +S2190324E93031004F4B0000453031004530330045303200423074 +S2190324FE310030313233343536373839414243444546000000EE +S21903251300303132333435363738394142434445460000000009 +S2190325283C42616420666F726D617420737472696E673A200099 +S21903253D000000203A00003E0A00003C6E756C6C3E00003C4E20 +S2190325526F74206120737472696E673A2030780000003E000011 +S21903256700253038583A200000253032580000000020200000F9 +S21903257C20000000207C0000256300007C0A000030313233347E +S21903259135363738390000303132333435363738396162636483 +S2190325A6656600000000303132333435363738394142434445F1 +S2190325BB46000000005E430A003078253038583A20000000002B +S2190325D025303258000000002020000020000000207C000025EE +S2190325E56300007C0A0000202D2061726520796F752073757254 +S2190325FA652028792F6E293F2000556E62616C616E636564206C +S21903260F737472696E67210A00416D626967756F757320636F4E +S2190326246D6D616E6420272573272C2063686F696365732061DB +S21903263972653A20257300202573000A00000055736167653ACA +S21903264E0A002020257325732025730A00002A2A204572726F27 +S219032663723A20257320616C72656164792073706563696669F1 +S21903267865640A002A2A204572726F723A20696E76616C6964B3 +S21903268D206E756D626572202725732720666F722025730A0058 +S2190326A200002A2A204572726F723A20696E76616C69642066D6 +S2190326B76C616720272563270A000000002A2A204572726F7254 +S2190326CC3A206E6F2064656661756C742F6E6F6E2D666C616774 +S2190326E120617267756D656E747320737570706F727465640AD6 +S2190326F6000078797A4D6F64656D202D202573206D6F64652C74 +S21903270B20256428534F48292F256428535458292F25642843A2 +S219032720414E29207061636B6574732C202564207265747269BE +S21903273565730A0000000043524300436B73756D000000436126 +S21903274A6E2774206163636573732066696C65000000536F72E3 +S21903275F72792C207A4D6F64656D206E6F7420617661696C61BB +S219032774626C65207965740054696D6564206F757400000045F3 +S2190327896E64206F662066696C650043616E63656C6C65640031 +S21903279E0000496E76616C6964206672616D696E67004352437B +S2190327B32F636865636B73756D206572726F720000426C6F63BD +S2190327C86B2073657175656E6365206572726F72000000005571 +S2190327DD6E6B6E6F776E206572726F720000004275665B2564F9 +S2190327F25D2F25703A206275663A2025702C206C656E3A202519 +S219032807642F25642C206E6578743A2025700A00004672656512 +S21903281C206C697374203D2025700A005F5F656E65745F706FFF +S2190328316C6C3A206E6F206D6F726520627566666572730A0091 +S21903284600004E45544153434949000000004F435445540000A6 +S21903285B00556E6B6E6F776E206572726F7200000066696C6586 +S219032870206E6F7420666F756E6400006163636573732076692D +S2190328856F6C6174696F6E000000006469736B2066756C6C20A2 +S21903289A6F7220616C6C6F636174696F6E206578636565646507 +S2190328AF6400000000696C6C6567616C2054465450206F70650C +S2190328C4726174696F6E0000756E6B6E6F776E207472616E7312 +S2190328D96665722049440066696C6520616C72656164792065D1 +S2190328EE7869737473006E6F2073756368207573657200000003 +S219032903006F7065726174696F6E2074696D6564206F7574003B +S219032918736F6D6520736F7274206F66206E6574776F726B20C7 +S21903292D6572726F720000696E76616C696420706172616D65E6 +S21903294274657200000070726F746F636F6C2076696F6C61740C +S219032957696F6E000066696C65206973206C6172676572207450 +S21903296C68616E20627566666572000025642E25642E25642E58 +S2190329812564002573202D2063616C6C656420776974682069E1 +S2190329966E76616C6964204349533A2025780A00000063665F7E +S2190329AB70617273655F63667461626C650000000063665F702C +S2190329C0617273655F636F6E6669670050434D4349413A20492A +S2190329D56E76616C696420736C6F742025640A000000002E2E76 +S2190329EA2E2045726173652066726F6D2025702D25703A2000ED +S2190329FF002E0000000A0000002E2E2E2050726F6772616D20E1 +S219032A1466726F6D2025702D25702061742025703A2000002E48 +S219032A292E2E204C6F636B2066726F6D2025702D25703A2000E6 +S219032A3E00002E2E2E20556E6C6F636B2066726F6D2025702DAF +S219032A5325703A20004E6F206572726F72202D206F70657261EC +S219032A6874696F6E20636F6D706C657465000000446576696333 +S219032A7D6520697320696E2065726173652073757370656E6492 +S219032A9220737461746500000000446576696365206973206911 +S219032AA76E2070726F6772616D2073757370656E642073746102 +S219032ABC74650000496E76616C696420464C4153482061646486 +S219032AD1726573730000004572726F7220747279696E672074D0 +S219032AE66F2065726173650000004572726F7220747279696ED4 +S219032AFB6720746F206C6F636B2F756E6C6F636B004572726F38 +S219032B107220747279696E6720746F2070726F6772616D004717 +S219032B25656E65726963206572726F7200000044657669636583 +S219032B3A2F726567696F6E2069732077726974652D70726F7492 +S219032B4F656374656400000000464C415348207375622D737973 +S219032B647374656D206E6F7420696E697469616C697A65640074 +S219032B790000004461746120766572696679206661696C65648B +S219032B8E206166746572206F7065726174696F6E0000556E6BD9 +S219032BA36E6F776E206572726F7200000045746865726E6574CA +S219032BB82073656E643A0A0045746865726E65742072656376E3 +S219032BCD3A0A006574685F6472765F6473722073686F756C6464 +S219032BE2206E6F742062652063616C6C65643A20766563746F7E +S219032BF7722025642C20646174612025780A00000000000000F9 +S219032C0C446973706C617920526564426F6F74207665727369BD +S219032C216F6E20696E666F726D6174696F6E0076657273696F5B +S219032C366E005B3C746F7069633E5D00000048656C7020616256 +S219032C4B6F75742068656C703F0000000068656C700000000063 +S219032C605B2D77203C74696D656F75743E5D205B656E747279AD +S219032C755D00004578656375746520636F6465206174206120C1 +S219032C8A6C6F636174696F6E0000676F00002D62203C6C6F63D5 +S219032C9F6174696F6E3E205B2D6C203C6C656E6774683E5D0032 +S219032CB4446973706C617920286865782064756D702920612000 +S219032CC972616E6765206F66206D656D6F72790000000064755A +S219032CDE6D70000000005B4F4E207C204F46465D00004D616EF4 +S219032CF3616765206D616368696E65206361636865730000001B +S219032D08636163686500000052657365742074686520737973D7 +S219032D1D74656D000000007265736574000000506C6174666FCA +S219032D32726D3A20257320282573292025730A000000417373C1 +S219032D476162657420646576656C6F706D656E7420737973741D +S219032D5C656D00005374726F6E6741524D203131313000004305 +S219032D716F707972696768742028432920323030302C2032308B +S219032D8630312C20526564204861742C20496E632E0A0A000083 +S219032D9B0052414D3A2025702D25700A003D3D204578656375EC +S219032DB074696E6720626F6F742073637269707420696E20258F +S219032DC5642E25303364207365636F6E6473202D20656E74654B +S219032DDA72205E4320746F2061626F72740A0000000052656449 +S219032DEF426F6F743E200000002A2A204572726F723A20496C48 +S219032E046C6567616C20636F6D6D616E643A20222573220A006D +S219032E190000006F6E00006F666600496E76616C6964206361D9 +S219032E2E636865206D6F64653A2025730A00636163686573200F +S219032E433F0A0000003C746F7069633E00496E76616C696420A9 +S219032E58617267756D656E740A00000025730A20202025732036 +S219032E6D25730A00000000626173652061646472657373000005 +S219032E8200006C656E677468000044756D702077686174205BCC +S219032E976C6F636174696F6E5D3F0A0000776169742074696D00 +S219032EAC656F7574000000007374617274696E67206164647225 +S219032EC16573730000000041626F757420746F2073746172745D +S219032ED620657865637574696F6E206174202570202D20616211 +S219032EEB6F72742077697468205E432077697468696E2025647C +S219032F00207365636F6E64730A0000002E2E2E205265736574EE +S219032F1574696E672E00000A0000002121206F6F70732C2052F4 +S219032F2A45534554206E6F7420776F726B696E67206F6E207436 +S219032F3F68697320706C6174666F726D0A0000000025733A20B0 +S219032F5443616E27742066696E642061646472657373206F66F7 +S219032F69207365727665720A0000005F5F7564705F73656E647A +S219032F7E746F000000007564705F7265637666726F6D202D20DA +S219032F9364726F70706564207061636B6574206F6620256420DD +S219032FA862797465730A000047444220636F6E6E656374696F2C +S219032FBD6E20706F7274006764625F706F7274000000004E65A0 +S219032FD274776F726B20646562756720617420626F6F74207427 +S219032FE7696D6500006E65745F64656275670000005573652098 +S219032FFC424F4F545020666F72206E6574776F726B20636F6E43 +S21903301166696775726174696F6E00626F6F74700000004C6F8B +S21903302663616C204950206164647265737300000000626F6F5E +S21903303B74705F6D795F69700044656661756C74207365727672 +S21903305065722049502061646472657373000000626F6F7470A9 +S2190330655F7365727665725F69700025732E25640A00006E65F4 +S21903307A745F696F5F7772697465000000006E65745F696F5F27 +S21903308F72656164004E6F206E6574776F726B20696E7465725F +S2190330A4666163657320666F756E640A0000000043616E27741A +S2190330B92067657420424F4F545020696E666F202D206E657476 +S2190330CE776F726B2064697361626C6564210A00000049503ACC +S2190330E320257300002C2044656661756C742073657276657250 +S2190330F83A2025730A000000000102020303030304040404049A +S21903310D0404040505050505050505050505050505050506063D +S21903312206060606060606060606060606060606060606060612 +S219033137060606060606060606070707070707070707070707F1 +S21903314C070707070707070707070707070707070707070707D3 +S219033161070707070707070707070707070707070707070707BE +S2190331760707070707070707070708080808080808080808089E +S21903318B0808080808080808080808080808080808080808087F +S2190331A00808080808080808080808080808080808080808086A +S2190331B508080808080808080808080808080808080808080855 +S2190331CA08080808080808080808080808080808080808080840 +S2190331DF0808080808080808080808080808080808080808082B +S2190331F408080808080808080808080800010202030303030449 +S21903320904040404040404050505050505050505050505050546 +S21903321E05050606060606060606060606060606060606060617 +S219033233060606060606060606060606060707070707070707F8 +S219033248070707070707070707070707070707070707070707D6 +S21903325D070707070707070707070707070707070707070707C1 +S219033272070707070707070707070707070708080808080808A5 +S21903328708080808080808080808080808080808080808080882 +S21903329C0808080808080808080808080808080808080808086D +S2190332B108080808080808080808080808080808080808080858 +S2190332C608080808080808080808080808080808080808080843 +S2190332DB0808080808080808080808080808080808080808082E +S2140332F00808080808080808080808080808080846 +S21903330000000000207902002079020020790200207902002024 +S2190333157902002079020020790200207902002079020020791B +S21903332A0200207902002079020020790200207902002079027D +S21903333F0020790200207902002079020020790200207902006A +S21903335420790200207902002079020020790200207902002035 +S219033369790200207902002079020020790200207902002079C7 +S21903337E02002079020020790200207902002079020020790229 +S21903339300207902002079020020790200207902002079020016 +S2190333A8207902002079020020790200207902002079020020E1 +S2190333BD79020020790200207902002079020020790200207973 +S2190333D2020020790200207902002079020020790200207902D5 +S2190333E7002079020020790200207902000000000000000000F8 +S2190333FC000000000000000000000000000000000000000000B4 +S2190334110000000000000000000000000000000000000000009E +S21903342600000000000000000000000000000000000000000089 +S21903343B00000000000000000000000000000000000000000074 +S2190334500000000000000000000000000000000000000000005F +S2190334650000000000000000000000000000000000000000004A +S21903347A00000000000000000000000000000000000000000035 +S21903348F00000000000000000000000000000000000000000020 +S2190334A40000000000000000000000000000000000000000000B +S2190334B9000000000000000000000000000000000000000000F6 +S2190334CE000000000000000000000000000000000000000000E1 +S2190334E3000000000000000000000000000000000000000000CC +S2190334F8000000000000000000000000000000000000000000B7 +S21903350D000000000000000000000000000000000000000000A1 +S2190335220000000000000000000000000000000000000000008C +S21903353700000000000000000000000000000000000000000077 +S21903354C00000000000000000000000000000000000000000062 +S2190335610000000000000000000000000000000000000000004D +S21903357600000000000000000000000000000000000000000038 +S21903358B00000000000000000000000000000000000000000023 +S2190335A00000000000000000000000000000000000000000000E +S2190335B5000000000000000000000000000000000000000000F9 +S2190335CA000000000000000000000A526564426F6F7428746D22 +S2190335DF2920646562756720656E7669726F6E6D656E74202D5D +S2190335F4206275696C742031313A35303A31312C204A616E2038 +S219033609333020323030310A0000005B2D725D205B2D765D2062 +S21903361E5B2D68203C686F73743E5D205B2D6D207B54465450FC +S219033633207C2078797A4D4F44454D7D5D205B2D62203C6261DE +S21903364873655F616464726573733E5D203C66696C655F6E6183 +S21903365D6D653E000000007C2F2D5C7C2D000000000000BC3A6D +S2190336720200883A0200943B0200AC3B0200203C02005C3E02C1 +S21903368700F03F0200F03F020084400200403903000000000082 +S21903369C7036030060F603007C2103000000000000000000006F +S2190336B100000008881234567800002000000000000000000038 +S2190336C60000486302009863020000000000000000000000003D +S2190336DB00FFFFFFFF000000000000000000000000A0F603003D +S2190336F000000000000000000000000000000000FEFFFFFFFEC4 +S219033705FFFFFF000000000000000000002110422063308440C0 +S21903371AA550C660E770088129914AA16BB18CC1ADD1CEE1EF6D +S21903372FF13112100273325222B5529442F772D6623993188339 +S2190337447BB35AA3BDD39CC3FFF3DEE36224433420040114E67F +S21903375964C774A44485546AA54BB528850995EEE5CFF5ACC591 +S21903376E8DD55336722611163006D776F6669556B4465BB77A44 +S219033783A719973887DFF7FEE79DD7BCC7C448E5588668A7780B +S2190337984008611802282338CCC9EDD98EE9AFF9488969990A77 +S2190337ADA92BB9F55AD44AB77A966A711A500A333A122AFDDB6E +S2190337C2DCCBBFFB9EEB799B588B3BBB1AABA66C877CE44CC544 +S2190337D75C222C033C600C411CAEED8FFDECCDCDDD2AAD0BBDFA +S2190337EC688D499D977EB66ED55EF44E133E322E511E700E9FFA +S219033801FFBEEFDDDFFCCF1BBF3AAF599F788F8891A981CAB1F7 +S219033816EBA10CD12DC14EF16FE18010A100C230E32004502510 +S21903382B4046706760B9839893FBA3DAB33DC31CD37FE35EF38F +S219033840B1029012F322D2323542145277625672EAB5CBA5A8C8 +S2190338559589856EF54FE52CD50DC5E234C324A0148104667439 +S21903386A476424540544DBA7FAB79987B8975FE77EF71DC73C58 +S21903387FD7D326F2369106B01657667676154634564CD96DC9EE +S2190338940EF92FE9C899E9898AB9ABA94458654806782768C078 +S2190338A918E1088238A3287DCB5CDB3FEB1EFBF98BD89BBBAB5D +S2190338BE9ABB754A545A376A167AF10AD01AB32A923A2EFD0F32 +S2190338D3ED6CDD4DCDAABD8BADE89DC98D267C076C645C454CA8 +S2190338E8A23C832CE01CC10C1FEF3EFF5DCF7CDF9BAFBABFD9FF +S2190338FD8FF89F176E367E554E745E932EB23ED10EF01E00003C +S21903391200000000000000000000000000000000000000000098 +S2190339270000000000000000000000000000000000141E000051 +S21903393C141E000034CF020000D3020058D10200000000000037 +S21903395100000000000180E80300000F00000000000580E8036E +S21903396600001100000000000000000000000200000000000031 +S21903397B0000000000000000000000000000000000000000002F +S2190339900000000000000000000000000000000000000000001A +S2190339A500000000000000000000000000000000000000000005 +S2190339BA0000F4010000000000000000000000000000000000FB +S2190339CF000000000000000000000000000000000000000000DB +S2190339E400180300F01703006817030078180200FC160300CCAC +S2190339F9160300C41603009424020080160300681603004C1685 +S219033A0E03006C1F02004416030000160300FC150300CC16029D +S219033A2300B415030090150300881503006C120200F4150300E6 +S219033A38C4150300BC15030090150200601703002C1703000456 +S219033A4D170300A02602009C160300881603004C16030044215A +S219033A620200BC160300A41603004C160300EC220200082D0306 +S219033A7700F02C0300E42C030068D70200DC2C0300B42C0300D1 +S219033A8C982C0300D8D90200B81103009811030078110300B0EF +S219033AA104020048150300341503002C15030040290200801512 +S219033AB60300541503004C150300002F0200942C0300782C0385 +S219033ACB00602C0300CCDA0200582C0300442C0300382C030046 +S219033AE0F0D80200341203002812030014360300500C0200A42A +S219033AF52203008822030048220300D4400200242D0300102DCE +S219033B0A0300082C03007CDC0200302C03000C2C0300082C0339 +S219033B1F004CD40200801F03006C1F0300000000000100000036 +S219033B340100000000000000981F03008C1F0300801F03000168 +S219033B4900000004000000FC150300D41F0300AC1F0300801FE4 +S219033B5E03000100000002000000000000001C300300F82F03CB +S219033B73000000000001000000010000000100000038300300C7 +S219033B88243003001C3003000000000005000000000000006015 +S219033B9D300300443003001C300300000000000500000000000D +S219033BB20000C42F0300B02F030000000000010000000200001B +S219033BC70028230000EC2F0300D02F0300000000000100000075 +S219033BDC010000000000000074350200440203008421030050DF +S213033BF13A02009C360300000000002482020004 S804020044B5
index e4f4be89933eebabf47538fdfc1fc9dc6744eb33..faacb69cb17f0b281a7a7e055d7d1b9c70f62dc7 GIT binary patch literal 84620 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ï{Pon-7#s{W^vHrzkAvgb1y2D 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 ZjDH+s^kc3-3!eu4JkqYOpM6k;{wH)Uq(%S$
index da525fb481590a9d3e273a3512feb966a9d6bb48..da3156f5aa011c02098de25c33606338e1f412cd GIT binary patch literal 109007 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%0Ave{) zKC(bRp)FTd5zg7_h4lN*DDsRT&)bmaN08@ScRkk7$1^2u8#BRi0kS>j_ZRDa4eIWH zx77YY!n}sD^I=%8_W_1|g>lZVac=fFch;b;A*=_EPbY9(7uM23lsy+^ccBj=?k6+y z-APUB0xW3e6U_7d_Q$2q>X7Ghx7X_iEc<SmB5v*Qy4Ys4!$n>rYf2^Zpc$XK0C{ly z>H%AdJl+GCNr)TZ`bKc3S&2<p^RHr0Xu|XAX&MLg;rA#4+u-L}jy%azjFjOda<`$3 z;qU1A>H<F;b~S#8F4;;t2lcoykNLiv^W6o$c(+nDRSnx@Y{zk);`w3h(_#DBp%m(9 zxgELchEDIT>FOlEl>)AMN$2_)o(p)!T6)S)|8k*F-i9>42JFv4(?r}(%vp><E!GV3 zsGQp=byvgNyqMMLMG@F9!90#45B5zKc^p9=QN%~4Z9_d4=Ay{MQqK-XrgeI(dlI~6 zsslUkbSn{^uJImmqGQ@jyb^t^!?WtK-%aa4{vBRbWrtUdIAzlNX{wmU>BvO@7pvT= z`>b*_-0)B4yc{#@KaKUzHO@Vm`!V;_eOND6TPiz%UylD3pwoeW^FLhLobA7+Ios#z z{XCMw9+=wf9R{z#{Ps<6&i*gVQ|{@H#If%qo_lo__H@oO7kfI^PQLLnb#kxCV;lC; z9>CpY(h-h%5^gr&_8GW-;1kjgYXIK{_}dJ83E<1IW-bD3+Q9BNuqyz&7_grTz;b<6 z0rsGQJ!D{80P6sD<rvs;fW>c~umgatQ=4Dr+IfAR#$Pc58v$(jWyB$gJO-%zkij!p z<K+hx@DN}>U$4Joo!0aNj~>KY{d3HZ7qM>k8~8@jE%B+~KRR>lyN}~L)_t~nlJ3iY znXdDgf;`fSxN5*#U|*AS+;!M@!nrBf$Iy3cKdbkXEX&6p^3>hLt9ZuyiN7`Yk9)I~ zO69qhL--}%9melu{MMm<^HA0vJhPl?lz*owy9{N==4qU#Qe2Bm^Vqj)P6O}F1k5*) zW)RP5v~L>Tzb5<A$JiG&1E!rNd<M)Ed_RQWLzTVW`P22D(r;iYP{)0sz4sv><=*Fo z!B-OB?i#_j!gKEI;a-BY8%;Sj@@9W?k2{=h&c!e`1874G^ZfbQO7<bygAg}>zW(VY z>f{9SY{;h%WnBn-NL*HqJPu=?0B=hAFw+0{y*hnaApMJ1=rO7_cz+P<Wd+jP<fn++ z^`4ZE+}Z0jVx4iHjwGHO;uwe3GLFSP`_Jh8@%2Jsx83l7ci82gbz^?9Qa>z1`n{%4 zD$yr?|Df$Pdx2vPqP(k+=RVYBS5jnAC#=N&!S9$nfv<OSZL=Rq%k~3)9$+rRoL>W; z2JOpFHe>rP<hcrY?s%(k@?yZmfR9qZ+g13jLuf>3MQB4<gRl*u2cZw)5crUN_{|`^ zijV+K^Y?(r3@h>aqu>?rd+-(T55Pr>@VpYC9bpyr^hWn)?*_eQYA(aG3tTx)&((WK zAF}>Wqh1)h6NI0IxJJZnn#Q_+jQc?i*XE(w`d!cWRQAuW(0h9)${GH4k>(8BYje{o zF;BSX+6!_9*ODd%U3UX%*JGGN`Wt9{B{Yze`91a~WoXx7<a0N0?%i=sE38f!ob7BQ zO@+Mf_bmIi%$|!-2N!Wk<ej+Rn-TeF7ISX4a*xRVQ%V{VbtNxz_cT2gY)=X4Hk4&0 zH{_V!TE0HVw8P{zP)~mA1W&dJp&P+(8`pldp{e7@&&IQDQ})&C{is3H*zNDO5`!C* zT8)L1dbgpsf2QeeSMLk?MZ}Y!vEzy6+@kghkM$ugw6F)a00(^B;L9j+V7tcK{m37E znvYtWk8|G5ny1$Vab*Z|Eebf|)<*#cRv^2J;{<$j=M4QGGPq>YG>to6#q&fw4+BRm z0*!Kt>p!!_vp}P&B=A7=mi&aa)Yn3Hr@qTE0v;>hD7^cI%wnwnbfxT1sP`5x27DF5 zym}~XWh{F|=C}2FJrma~#`<CVE}jb>(k6T=y9s3zzyH!9U#L#3!TTvZF9sdEx<RjR z72hg*Gx75(jB^t4VYT&mSalw^lbv1_LUmiGz=S|cMhwq&D`1<zV@^~($0q`oFlFwB zjO}(xzE!SHW3}kL;6}j5415IiN16JE<7x?Mo2Lh7)Dhp|w~6(B8u;-+;LQ8Ib?!pR zui6=%r(cga@=T{k=PCI$>U^yBO*!TxzxIRj8&2MuVY~RuwsFs{wmXHN@0z1d3LODh z#(&lHZ*`!5pP5taU#?;H?*r)5i_pKjFb`MPS&75=jl9Q7*a)24lsj}GG~#_Z0_Xa} z_<aPSAAxJ&5Pn-+Emz=LjMiz|;9&g-&K{{lU!V@PrVjth8D01BfFZ7CSuY`PpB^1H z@{M|~5%5h-W{osrjWo55UL%j7KDV1SQpPpXrq{@CT)jp%DZNHExntHyn_eTo1zZ`{ z1Zes4l^M_{sOw6=t^~em!dh5?HBFgG8Tb<7hY5DdiY0E(EOa!!DMP)8FD?w=n)8vD zi+q}}kJ!%rBQ*2r^!*;`1ACSpgEsuu&C-3#F<61;H3(IJtHzvQ8*A|!F)|qLvolfd zSX`9>t{OJ@lCq(_sQ+GD<EFl}p(7GoP>&ujhWfV0*Jaojluy@6y^)vtjI8U3ku$GR zS}rrr(c?(iiU2I>o@K7iJM28357}!oB|7bF;sL?{kJoUF20@>bj}E&}<il7O8Pfcw zoGMe!FR@N2ui!lN`(xKEjWfxg^rNi)xM@pf+eq8)b=GB6rU&f<-T~|cwLDvcItUH` zO~ZOr3XQg0$_u%xG7GIGS&Y$6AHGcL+>LfTkq@Q2G7~f`;(A8fLHtJiByem8%AJ5Y z;i2!DcS#`c5G9D|^+=l%-btC?cGIp-vyb?D!RwsopkI!HAIKmaM;MN4*}&`g9RN+E z7F5W(i{SULp{<V^+M2w?-T=)mvIoqSd6?TT8Q6@0rEIM$zz_Ja?*Z(ffjw?uQ-ECo z*gM9+)&h1Dz6~3B;VG=k_+`btO5}+N@GpR^1njFO-`7pPZAe=M_*G-_Ed}gp18dc5 z*jB)v!v6M|F|co5s!lGrTEoTxa|ke>HZYt|k+{YKzXDvD;V-VaROeYr9+7)0`g2Es z&mdl)jC1%>E#oX{lQFNkn`Z`~^*&;OuADYiWF3q@YUo7DJxpBraFPBlf4xXYmPZ?k zG-W;VI|VxHeaKHC{#B*FomLekRZA%wz?xU>8B4`;TzmCbtCQPQICC2Ks04fRtFD$u zaE>0we(7NCyc>D>Wpgh$g*>yQ(~^lCc?Z6q#`mzv_n7%Mp0L2#oLdX)HJ!b~(Ank4 zmuD8;*l)WZ)AW~edb|kY%TZp`n(Cd8=ZTu<+Sz8221?~mUx>Y&eP!AV98=SJYp-`$ z_>ApdVnMI)8lXF`WSvOMh26CxLqWe?*@%2jB9AJe@3+hMA-oS4dA^!gkr(N?*GPjK zo=*Xu@h<^3$8#FuC+sz+h&S3tWZ$3}w|TKN_SnZNycpU!<6Xq%4|>rgWuV(YJGN#o zm-YXG;PW{gKeUze<mC%B?KlhN`Sl?kY&#Elr=)+EX0g0$s_h57S214Xp}uNp{%9rk z14DcM5NRybX)5_Y;JL#H#}Q5=R9|c*T!a>cc7!g3)Wv$A?#J&bgxG9+Gq_~d?4m5F z70;cs_5N*NVkPum0lH$%M%gQV41A^MaBDusKEt;R=r`T=Ego^)*fgO)U;Iww-%IoL zoKv=*Q^0ds(E1tD@z;(=``Qzf0hf1SJU)y5`hwwuIR_X1Wpj>WM0()UW)5;M;rxp& znCeAAKYs0!BJI#(Y5CVDF4R271T(iemt;KvW|zr_^at}`UfqE_VkVD|UdX*((}twc zUaSQ@T&d?#2flIqGRV_*H_93>35@Y6XX<%eyN4;m<J`jUaeS+CHjb?8U7T<3R{1`N zZ?(whRs2@tmvwajE9($-|K91s$<u11XJcM1yuMjzKjN(_)SGes`%Kfe2==%01MO=K zw6D>~2ron%z+avq%{LX#)9~!zxf;(G8ak^Ub0Ue*d5M-6K7!vzFkg<&*0h~2d#lj5 z?As-0>D%{RGMcty*@br%>&>y<KD$WU9lGT0wB0hZ=aGkN!Tzx<uIakv_)VBSV41(a zVQ$W97`?x65BOW~5v>Mxxq)rOUZ5J@zPJ1}V2R(WKo1V0og8!G{8Dqa#kSrxSL1z- z<$koQ17q|7v|(8Qk1r3%1|9~?-vWl`(Fu&}`inIkOnl4t)&Rc!y!l3an=mx;&}@xw zlS<>;e?T9$;<**|YfTsN?JmUEu?$=18C-9ljA?wrGdPa>R{=W(u*4(7muNbZ_~Z3U z-i|k7^;SaaiF}jjzk5s_NvkGJ9Uq-t9P6l|<2&D_`F+lv;a&gV#`U!O_Hm8;fpMjb zdhEFVeok>*_x*u!Jw2y5t~=0%@ffo!-(g(u=6C?6!Hny~cNo{G`F4I_T<<jF+GxhL z3H?P`bv^1=9~jqph_61!u?mjUkIphq%g!=RHD;XR_5c5j)6O~PK2BdghjF@Z%s74H z%|AX)JKrph(>G`R;c<Fs*4xLaY|J=4U3>O%I#~N(8>g?GWt>i2{PuC`tJUL_433lG z4XQa#lxZb5qh6ZcW}imU*UN$DG~K!`L%Q`EkqzknTZBFD2K3FRkneoJ&0m7Bz;Dz2 zUTM3ggRJh`GCZHl)ez5b^FrXaL#sCAO0W-G=G@R)MS5T-=%Sml<AoM@-lql1>y7OF z8?_n_{TlSaQT8GF;E17>S`4j2nnPss=KEbpb1nH{wcT^$&ADpOdff9?nz4$sQC<RG z+VtI50)4l}^xdt<W1Q^iJB9yWbg`B(6wDr<sTuu!iOJgz<hwqQZ=K1v8TnFf-&wE6 zIw%9|M%=>)#D6WWIm2Wb4$43towJJa5WkF77r$K|GH*=Xe?04*_sql}ShKBvV9j!$ z8_N@ZyS}()xmNcF<R?MC=^OQWy;3h^xj*j+XK(hljak23yM*`GF4yJWH}t-^9P^{= zje>tBP{X}$ImZ4sQ`O1K18cj=y}u;kR+KDqdOfZoeIAj}`~b?UPTw#69CNsymuA6m zT}j#|i+pDAOatR_6u}=aj*m|hpTe_k-!C%CS(p#ZpW{}Gb>JYLI-N^UN8$^f&-%Eg z-r$9UDC0EY)Dn?<@LZbmWZTFt(o?nUlJrz$4(Rtefpz@ioR`_Ah>YERT6V3L<==z8 zaNB!5tD5U#hi3_oy3Vtr@!T!%!ThlWk4YK3rm}BSS@H_II+V0&Im$@3^?J!<uh0X_ z<C>2pE%rA^pGfHQEXs{K@xF*>&frOu1AZ#KO=OoUz1iC`)yU1A9bTP{yqY?4A?NlC zbu1~r;2Bm>CPNwFra79w@bw*BGe0SVv3PDA7ryza#VB(g`jxVee=Zb8=#)k|S76_5 z^S*xx%g0)m^D@joTkCwqhPTSuE!#iM<gsr~QJ#Kij*+MTM3>$CGg%v1>am2~!(J$* z$C2xN@`XGTI;_`#YDfQfW+EZZ@54SXU+x-S^^PJhU*pFm@f;Rdw2gT?Nbh#!!fop^ z<o))AdqqBXm6->-!kjmqxhvVX?I_n>EczwXyZ8{kzh18rv*xHo55mI;ixH9tADP&k z;}~L2<v%|~om?>k{e(IsCu5w$y?WoXQ&t`Fy#o1M7l6MD@NvL2fuE_x_e-fifd1S# zlXEGRb@1(c#PiGv<CL#n$U46;#5rQi{F3wjdm?~~P33v?der&G{BH||ov%_S1#w{f zPMpFs=izb2alB>zyx^6YbwgR(z-{D%j(Fu}9a-+H@=V<+k^jnE-!FakE3C(Iyj$-6 zLGn0E$9!H9K2x7DtwC8sHSAm9CDC1O6<Otnz&Ek})Ef}}4zmYQXCaaly_z4gykFGl zc;s1La5MQj>R-9f4$T$WP0G3#dEFv>d@B4Usc&(-HgG)Ws>G`Z54$RH^iq{*LRfw2 z=<%9_{{Il(uV<YQcc(dv=6q@dzdgS}%Le`(btp6QoarJ+_o*>sS*X@|m3&0!MZJ^| z>0*;-0(mwe&$!9+1p4X+g~Ev?fjnL@c`P;c`9Ymdy8vkyA?;$5_CJw!7t%JHzBD)_ z|I=#jVW=P0(GB?ap{tv7iG~XAyiYghGVK~K64xZa^F>j&pIoBzpD8+1he6N%>yST( zeuFvGNF1&7oLP<W_|RWB=lX!Z#)(Yzd9T#WpRn}*fkDn0zEgi%&yNFxviHRg$lh~% zjo#-)X9V?lVyfPMIQBJW-2b{p$Ne06RGIZqZrb;E)q+#=6G?Z?1x<&r3SlL}8iY=S zE`)A`Z3sIMdJrB)7(gKHc1;cUYvONpf-ryd>@#D|KGV|H?6^_qpAQXARLk>|=XYdz z25P0dCIK!?T=d((c_{N1xghc@;atZY1x`KD(x4Iy%Mn(X=Vb_NBhyCBuQI=(nEnmY zn%DgFBe|G4mn4m0VeCJ0rf@R3rPt%R;a_2FuEF?6lOGUWmKL6kU4lIVeYzC=x$r7{ za~I}f2&69-UWYl=zS)b$7v<_egYs9kcgVg}9pKS<wn>^}!)&dK8nHGXKOLYkIA%Q4 zB>nQm+4>BV^yvpFmrLA}J9G6tpe=69g5H=Nb&sL0H)O9AJbpy<?)s?H<s9)I!5$eV zegVBK_&d2S!?CN5cY;ROI{c)GBlh~-FQ@4FOnFzNZJW?pi|VutFo`~~u#fotPk#H* zJe6p?OeF^KdmLdHp$hN7FWGCb|3opy?5k+C=FdqFmnPO{%2|G*SI&h7H=%UwtJ^?F z9G<KBj5@^iP{xP(_IIdLolDv2jYcM?apiu&l|oyWBM1$7iu3pD*rUHw9AnC-3KymF z)Z5~Cr?CF4uh8CQqtGW2ccb_EjE&OoE$Fk;;f-E9`m9}O+--99LfUR^@|w&~r|SNR zfRAvE{H{JuIo1xLiEewhf7YkpKQq(N^cc5^q^%5H{CDpz(#4LUi&vqY)RlSqjc-?c z`={Uj>9)YRiMrHE@Qkw5;412f^9=IuXBKI0KkqLG@~$>{-#DdMFYXzqW@_H6{?Y)w z4Vog_VDt>oKGM>Z>-jVV^#-V~#`QjkvAg=J^)mlljtS;m73W*}h|Hrf=AFuPWq8&Q zao2%nxHl7W)@LH=u3Rj>E_36QqF#vEGqY%WjpcrLWDl}gzspsEVI{&c^BhMg4eTX% zUO;|Ao$%v`=T==nJO>;b-ypKxCd#4lZSoY2yV!<VTx*z%Y{S!q!j-iKrrg+;5N6xg z^*n67RL`r<OGoPui!KJ{^xaGJ-p_t&W}A`^h|Dm?^5X5_yB_ckVf{qhO&QW+Q3o_> zdq;+NE+Xf2=x?bT=(P4tvOXDi^@P^^HPi_P{tv4Io(-Bqxd%YgzW{pd0OscNUIhD% zk=vHD4%FL~y~KG<=scd|DYKW5x1df!H2Hv}<z9F$>1_7_(J}PLhI&m0->VV~r%d4U zO9-5URrbal$EF<PK)o72j$>1D0rf^6@HPoPNr_%D=TGMujju-GDxTS5j3Ve0_Qf|b zPPU=xQ`Kgike*|-%ZyE%)>Fy1#WkK@Wprm&CN*y`<pQpS8-<r)z3wqII@f14`jX#X zrwttNh4p^YY@Jxkou2FJ^sismDfnc;8RCjg@Ke1bd<@TWxo(NSh}TBe^4Haf4MP`o zsdz^3>-4xAG@s<I_r7yl*QE({Sw(pg+PX?~fV!nEJj-Dny6gp+@1C#uBi7|Y*5$Ho z!aGurjyy(_;LN4eZL4{G#x{}f@SWpNem{Z!+k>`KcFy_{|N8ibZSd=!M!(kD&AItX z+u{8NWz`z~m3W8yV4da(^QZU?&$Zxl$VVUNm`dMl@Hh`%2mfLNN4Frn4t_4EtKU8^ znF(9%8HG@VK2@PqcCo8@NAgDDVZZ^NMj<|K=Q#8Gt>A+muB`BOSQV&8x7RbR!b??B z|NK4~n_Zyc{%Mjr`53|v5F%KAmRU2qDrwKL6m?8Z25i`hPtH6nYeJ`s7+%THule0G zkRIzHV(2#7hP{P3wF@-iKO1_>nxD#dBdudIkE!16mp13N;r$MtdBit+Q$RD^Wpv|i z|4y^u?@jZ1y;<nz-#A;c3nuC^c?SD)<UIgdwaoAk%;!Ahdxtp(CO&6=x0w9Er<C9J zW$eA=3*EzmP51SV$PxLj3{OH{VbptK^!vk=Q-$}pc&1A`mkYGqMr4-`b$X4y)dl)| zsfIdBpq;lZK|9CP?F!Tlbc5)Pk~Zi@-d*5FV(3figQqIFcO|l6J5|YXOPTZL`@lDF zeyst1E&F%!<+Sa2z*`Gk6?2{&vYhmg1)8%2^~9Pz7VM*`XX&H!OdnkwsK;v5qtC=U zi0?sM8_&DkEuL*-|BJ89^q@YG_&TZQYUgI573Lz%MWFdF0#8>4KDk{@68^c&<@03r zVfl_qoeyOdb)X|k44<!t@AH^vBXu=sZxrwFY9{IRJex8V>f@kamtx#E;rR|cUytV! z!=sZPNh0pUh>K04-eoFZkG1@;;oZ4c^GxL?z;GNBT)XHeu92mTV|&OKAioJ_ZeL$Q zT{v~}a?wq<5)Yjz6de4{M`%JA?og@)ze$8O2t5e>ZjpWvyo)&(O@fw8Y?pQW%yf;T zAD7?tUSoW{?28jn*WlVGY$V+c+M&mrCivnpuK@f}<~)Y?g}I4%cik?}r`<*N67TkO zx@{)SA#X9#OmGf~?P!HM1iIpo>{~H>`+##zZals@*jFNWuU4I26+)D{YYEyMbb1NO zPwhkA)!cgk^Lb}oE`&7H8Ku747w}$&cU$Uo$m>O(isfafC)Wi&^pH2fJu)=GeSFBu z+>3d63vCdNO*i!;Ps=)7XzD~8FW1rf`XhW!Y)KCDWwPuI!9H?yd#f;Kd|gtm>1uhu zf%cU(mMZc$qxx0#c)AX0(1U63nmW=+Y4kS&+RAw1_Ijt-$3B0gx`BH^4_*ygI}(4; zizZT!#S^LLBJNj2-Wmm;KpHUu9wM%8B0W=6)rNf${Z*If^cJIB;(qEOI*6NvxH$DV z@$A>BJdyUUZA@h=@T^46pY}rN({XKSfh|M)B=nU+e7U-XwDj(K8`y>p(3Dt1=<8B@ z>kws~R=P##p;yuG^6ow}$T*vMYr5vCU&vZ&r7p&9;){~Z$_&3-nOnsEy&n5#nLB{? z=yl9=)W4{5xyRl_{x%HWZE_547-wj5(%C7@>)?8b=yQy$tcN&dv4_3ej2x)UK8&`J zXWTF2%5@*%H;iF9;wsdB;1QO)-%B{D@Hl5b=H30i4h(4J1(>7zJ)U<{)>W&TbGEbI z^w)mkyu6Y$l*MU083vxjeB3$3z1gd=Z`L}E&UP<cwKiLaevE)$BYuhu_jpqQ!?nXQ zZZmnY&eKi(DH|-<R?fFm{15b7TR<Prw=s#uwLM)#b)&px*+`~a)*I-r-R!f{G<gJ! zVS0IvdU8?ZN4p(e&eL9b{Aq8I%#Ejo#)vvk11}GF%zK>uv}y0tUa8Cv{Ho<LKe`$y z2i`hlsV?zBP=Y;!G+%_ebjI$?c7KXCJ~l|d2b8%`M#1#IEEIkiYzt+)9KQ(0KjvsX zyomjr&=91rYLnZ9rlTG#`3=XsSL40P*3b2Lrv49Ujygy4*1|Knv^VV(nNT%hSy!HG z8<+~fgbWP%f|%WDbV2WzbBMb1R#`LJ&Z);6i&uj><uVuBFc%XKm~lLSz3Ygyrw|YE zeCR~EsuEhk=coRK_G4q>K7crPOk5UmWz+?Yheg)U{w)LF;$pw%o^)LJ^#{Daq|SA) zj&8T`*sO!2?(>59i?nr=x`(3oyzV$*Vzy6juNBxH(5^eaK3cc%+MkIIZFV5hoMT^& z)vqJoT76kjcTRNokmrnd7xn9Wy*cU*wg7hZ7}#pSE;O)}bBnrzb%6b30G2Y$@qoS7 zz<$8wOI^a#^NO}XK5PiEA2hI&<`#7a56>HYzRWuOZYFgnw4Bn|Lg)Jc=i5sK&$h_( zf7rk^n>tX3uyfwq^&+z~wf<nW+I*a}!3w~X8ht@Ihc&ccerECfYY}MG_n)Uu{u|FW z4IRQWVCrJVKpWGx`G$)$okd(qo6i_%letLqsOYUVi#;6IxSG`K{qM=NsnhxJJmYx0 zIag(A+rb4UAKH6zO&>=)UXN>;@8j>%--uuO@x2OVoOhnKAL^t2Kc2r%*@DUYjjL1P zSq&8>j(G<@3D@FXnfG$MpLQ!sq5=2_zQ2SrKXs8lXIM_1y;LgyW|cb0x_rXKFGl=p zh~v3*Ip*V4;PF3BIT+?)f5XyjG`<7#yCc`{9?bH*JCfkL#;<Y)odnK}rm}mI`?C&y z-;MO&SNlZ<-ESWiKLVZPgYk{uFU0qkz(ec-4Er&r*5@vsOn!TP?zr77Jo(JYlt}=0 zVr}-TquI(ST3)nA9mrBwl`@<D3n*_)W&aX+{~4Y)ksnL0^F+51YbPAvkO}eJ0&V#U z%XjY|(NAc&K+g%#<5$kTfM-FVt?)aGviEp<rjmAG4OU_?!fJ#~2s;q=A{<0Gj&KUW zo@XUmJC$<ryBwh%VFyBNp-OPQe-7oIZ^{DhzLNX!DbvPNlZthso@yP+wo><qeJtn8 zYVg9}SI=dit=8j2{r9Nz@ywU1sEa#Q_IS|6yH6SX(Gu7EE&J(+q0?V7Wj%v;>b<{u zfz|<xfL_`FTsMHc$qQ2lj<Vd<Raz!Re3de70}-P3&nwc<#Ceo6xJsX|6PL|OQ{Q0= zLKi}}_-cs(_t~J;Y`z;j_&Vrw@Gpsnzh1Q0A^s#Uu7Fo{9@^In^QFHRKb@b3boDC7 zmrL9?axTpMXc6|lh#6ykYjQQ+8c+1fxvC{}B=x_=j=kn7><5&w(dKtmi5?G2=$-X4 zE`&K;&}W>B&=>nrhbH6ef%T{}cB&5L*F4`ecF~$XsTwqXW@a<}=}k&8jMyo;VyBmt z{X+E$?)hz{=0(`%Q}c@Uu!K4D)54Iy@7RcILm#xE{5D(rgHYi8*p3xWaqn3!ZPW3j zSticQhzyAN{ez`W#!cJDP1otaIuYyeqRLk$+H1w1f%eg`HXruiQGP^~bVm_l2)6jl zh~QUs`+XwqQgNBbEC;;)G0L~Vf8?z=;^kcbe$pi(_emIA1-_Gx9rrlv-sAbU>Y#fv zc)vF6tc!;-_hu+V54pEy!gvmWcR2wXnq`Vz0n!YDcGl<9x=!rBPE&@^5Yb7%)v3wU zAuYrv0neu<bG{V78&@ly>!c>P+FH+VskCLXoQ+o)`%kf@a>5z^TUdCScC<4=x_u|d z$f1mswrlt;Q+EE8&=nbT&QsD|O`jvL7bg1kn~k&;D)mH_ZTv{Ndj3yxpUC<&1pEDu z!*`q&zQT>?E;8eRKHYhdt8%hOBK@Qpq_1@v*6VC(8j*%H-xPBOPx;(Mw#xM@zx-}* z(zH~zk1{o>L%YZnLV@}azH1bGCfhFX;Y<;p&l)~h&ayG(EPh)#PmC&O))@GzcYycj zu)nU@-sHkw&%QqNN*L?NzB>GhZ?|S$oXYR16nva7sZZq{tkn=`{P6p`K>K#&tt&gS zp@z;O&VTYU<U6>})0aUzX(wCe={ctndo`qKN1B1h(WWc0Prdi-@V^6m>6{{b>Kx#2 zy;Q@KCvQ6k_}c>T@pFK`JpgZ?1N@Y^#XibB_Q&DxxU>l0cMk9&)1N%IXg>$|un!+g z<rC)sPx-gs|IRtUPYR6JaQYnTZ}PV)Qu*{bz=x-5-x+_(JPn&Nf@vauB+Z1tJU!QP zxR<E7N-HO=g8N)8^*f3Gu||RGfe*NDySzzt`usxtIatMgw4QVy_WD^^<Atj`G>pNA z`ki#hHFz$juf=+g1lIg`&=B@O?}!{<4P#CXAddTXp<wxYTOZ2m^L<m;hW1Eo6@Iu> z<Q=+<%h3<q+lOM*rNdmt?}W>=Jc)BK=5%^jUDhG;I%@`aa=eG}PF}nN@U?iq9C=X| z)ec<qee&QX=aE;bX&l)vMV4Dmc}&F6Iac6V1)fiL&|OueJJ@e^fj!YG(Q;v(UejDE z_#D_5{?s!Nk+YzG_`OBzNoFtR`A>rOiZ|xzzl3dGOW!$Y=Y@FA<Ck%uiO6qCJIH&i z7Ct{k-5CAde51_zQ~Fz;^jb({1fYA_Z^;e0aq6So!=DnLX13-_lWv9R0{eQDt$2Q~ z(Np>*=n%hOgR%;aCEKwortQdmnZ<GR!*MxJx;4Y^nYLbUxwQ2GkzxM|bk%>SKdgkI z`8A!X{bL2`v=Z<?@wnC-YBhciUaZt@tD-G1_Q%iSy%BA!BM+Y8+5e-**`A5&k>h;k zuW}#qxb`Nh?Z>}2QTQ$Kl`-qLDv^9uCDNdUYcI1B4noO1%9b{IZu*FKseQzon>pgm zagKPgs<qj*jj8N}x^-Eu|0rOrD)8yfMsG_foaq1^RWgrrf1@`Xpl_G?>nu*a!AOR* z9nS&cM)&hWsK1;ans1ia$YP&C9z5&AoXxPk!1a?+?=a)ZyYu(+>hmg&I@`(yKjMt6 z3B9%`3r+}KPQ5#04|h+koK1=xLE`8uP~;&>&v*J|9loeYv&UT8mMh@9=Z1V4SIcDq zA2*KXd9>cC_&j(j8`blQzNma$Roz)!vjyaLE9kNk<Kx7y<4vTu0qZ((@!K^{_s2bc z-4>WMme6sU4!uGx$OZWcS?`qHW8PM|&0ZbmPpzu(p2Zqsxe?hndHyeSZjBv~JyNgK zP8>FExlv>%b;cHtIK_7Nd$9!8FamuLa9vR*%=Lc(U}k7pNKKUXe?}Hbc`(msZD+rC zzQ`1}d7+9W+Mdwl$+omfe{BPQ!*uiqMju0u4_WTo9OaQ^qNi}9(C%!<w|JHwBFzAt zJCaXI@(BZOhJpK9fw~aXtvSqmvk{SvE|v3)Ie`Bp#_FX);lw3){y3gle#m{+yHd-7 zu(qG|V##gZU-FySW<TdGk1D}mrTPr~o{*i%N2QGChQcoOr`xedJ~33PWfMCsQ!g1a zQ&%4!1@${tw)c8<fL#>Tx`8F}7lw!f$bXjUb&>tEsJ2g!xa%{e_+Ch887TFrW+3h5 z_&zgqbm%htPIOChVRdxKjmr5R?F4g|(7z90smtKcW6Cml4#+jr<r-aTr^D=z-Cj7w zIkP0&3?7hYG^<e0Rc7BIeJ}h3X!K>oQTnWUr*e1Td2&7yPlb6F>ze(Y@}P+J^|e!< zS5Brr^W+fV>S<eMZxLBys+?!N>cqi4O4VZR9K!G6J#>J(gZ(V|)H}@{?Iwsf>ZmhB z`Mz3C{hr<R$>v;JM$5v;x0b4xhLrt~=gd1YL^-^oUW|ROXZ&r{Oaw0#cJR%?H|8nd z1XtBq>8>2}{Y9bhL)z_$O#$i=a#m!N^F^L(VZLsXyvWxMpq}j8?*)8-`R5cX#qOm` z`#n%=y`=PeySLoYXXnHh^dUf55@kW02V8Gl8(TT&WqnXyug~N-4>^~*<lA;n>;68D zytd06V_n#H2TlLgb{6H=br$B^G&A09)Ja@t<T2e|sGGJSH)KDCF^?F3Maq6w=0X|f z!ZO-oV;&5%9qyJ9*{Rs?kDUXFRG97A>(2qsZEcGzFfs=cm;(v&?ezUaIR;^tWr0_A zcZwd%cCNia>UTVHMz4L^&=%U1$S7RFCp!(yJ>ECOZh7M<7}^BT#wXmiUwjua|Kk|b z`am1TiCu!$v*VdjteiSLqvzp3a4xnz;js*+ok*Q_-)F<f9JwRI@hu6=krJ*W&N0km zzAKaex416H%$MbyFRIIH6**nItTFQWiNJhOX1>J7%$Lr0m@l6bT_in6{5Fl9BR(zP zE_ku1dn9{XryAuem2{o>xJ<4Wdb(8fj_>!x)|vL_^V+i_vy-#4PEXhC*%AA0_Sbuj zt@*I=_cZp5kLR>vs})~D`3L%1_Lo7P>xK-DEpzXcu`Y8v_B@g8%TA^}T7o(W*X7nW zq_T}q^ikhCj6Hv{rEVF~#R)t2iJn#=9m~}Vjz|wqbYi)Xdt@ktHb^;{CAm{Z$G$B< z2iV46(I%hP5g!_<JpEVHVystlT+-V-`n?eSYo*W7Vx+M%<g0HHx?N;wnI}Bk?1h&4 zJkQ=ISKwRIi0!l1h4S+dI$h`^RbD+ZMvqG#`xjbj7RJdz*oWsjGiI!>)XDYtdhM%h zg{ytB&?hL%pq;G9F=g%hb|Xdmg83#7-%p$ysAEKAOo2L@G^`iv!+PyEbz<H8ao%Te zgkP_a;FSA3Kc61+-Jdtg%t_!5!k+lXOm(tbbX8N?Z@<U4S5W2O!}B*09>u)h_#WyC zrt;s4>fg`ecQJ7c=!Q~%9l82UG}y<am%5oJa8a>t+ehlgIZ=i7>;gS)<2T~tT4O^~ zM?A|l0^GJ3`_rqbUfI92?Vgr>bB`~z1Ld}BzbK5KTZ(!r?We?c7tx1oKFs;k)|soM zkFmIx6VUI<BEex=Czfk2oPKO5qJ8}SknubVCqH4iFAZAYtL1E3-6ei3sq5_P+m&H% z#+=kv?8zPM>t^xEhVpr&;OOrcxT&pWZmNU6T<*40#>QY_&axjLWE{`C%k&)I8BMGg z|8e~obLv3Su4M}7m;OTGn6KaO(?l_2k5|*idJYVtpR#pme**2kKxotE9QD{<qQ0xq z`KoiKVhubyNMC|=PKEbp<{V)beG;}&4_%#DEpzBu(ZOZEUo7=S``urU*hJKck2|*S z#%wipH-LBQQI;L2@7`tk`ecRY_e&jZG{OILqaL)o<h=Q}64EbnHoddXohoN<9LFSZ zMxFR9=*ZE2qmI66QN|F)W!9K_h0jtiWptLfXRJV8BR+Alc6w%L{F65Px$Nn*r%Lkq zaqnu3Nu$xLtq7?TFWsgRP5(nBR@|-<(NC&G_b2qbANH<LiOkB;aSS`|7!A{MyMAW+ zSI59_yW{QY&ldVj`PH`<<63VY4byM(-oIjWd>n8`SL*cNsKfe4xIy~qNzDg3PkNn` zdcF8OtSiimu=C82@O17op!c2xz5k^5Zx;G<68rxd@wdSK?z7ncn8WU`M*9C-7Wtjd z+?PVYCFc1RJpZ$$^}<8IFZ&p8@FI|4%^6FbjE%|r!L#JO4e1_kYtE$-%~+3}xs<Ez zPpR`W!|aWim*uIz98Y16*CYLf#@F61%+YECJLM0+PNr`KTkBjB@9)C={e`7%B01+$ zcz;;*5>xsAe5-Jh&ne8=b)aEbr<8nqR`Rmkb)mzBLU~I3%xHRs@~zs+(e3?<v$VGr z?S0)I4R^y?;I6YY{v%$bKbj=oA2G5M_R}M%Qy<!W?5)CxUg{%(c0Xd;eV*x~y@34> z1528<&)8V+l{BgRB=hY9ma17krhb>4rGE4c<c@)xb{4o=z#ZJJd4sABrMP}qBCNWM z{)AKceStRZL!0_h&u^N#&^BmapiTQso9-}eN&|MMflU%t5q3bs0%ww+{h08xH|4KV z+PA#no637oZd%*s=6Uvsy<|3Vzh7R&eQd}t^K%+6)iB<1JMt0tz!2j}Pk#aUj&hZ> zoNF)3zEUV$$-4C$zn$+Z(`V@9;nT>Qen81XrIDUIRKKhJT+?RGuOH`9>*UdW`;>Zn z-yQ%yY#alZJ_{W6rdgk~8S5FQ&q((Vk6r&~N&hX{B8`FjyR*R2@8hm9a6M;%dw~27 z#(O{7zCS@Z=3!ZP2k}my<qOr)$z^7Y4`Pg`p}zag`g^}we@I)x?}zYxifIq!XooNd zJ~2bnIBli+_bU7z6n|Kv8&e*gUZkfYV`weH98?u02NP3;HX?2S@5?xEuTm%5>9cjF zu~Wjg+YOCJpSQQk`TIJd59t&2GoWKjO*<M;#~py#LB0|&zo^qTRitTWi+|Kqevzr~ zB>YZ^u#61n`ib-Lyu$FKtS9fZVY*xJErmVz&y~i>T+hvyrt;4LH!m9#w-0gGlTTL~ z&kmrk52Np%GBy$P?==uuYXfGjO)~SI?+XoGK_9v=m+JcS8BD~<U1M;;g=ZOe+Nh<* zz*U_Ej`ovBO+AmIp40_NnR=2hNRG)Pe3m?XnE-tPQ%52BX5r*ZsOx`()yeUOjvx+d zLx_Q9-LXNbM*I$dMvLN?IBGS5kAvBVH<xNVuaCT0IO+Rw^?8e`c(2i0Ol3b%qIFmn z0*<sl@t+UZ6gayueDLmHVE?R(Yx|cUzfq91PntRXd(n?geHY{X4co|64}N_#uR2yI zxdnZ79CL>9y-$aW@_xCq!ROah$J=DI^Qk-F(^^79JT{^uQ=}taGIYdClpBGLcue%~ zqwEvY)}XAo3G`i)jF*-RyGBke=k`vA_y>^l9CxjhRXc{~uKzChCWNEl(fjc0BGh*l z^=WznvUWLJ61^$u*P5S*Pv~W&>z@*TzqXN6AT7^3N}P3>b}hf!>HAY`&9E*H2`(p{ z&_Wr6+wCnDIiKjr{Lpeb<(`C4!`dOrIaK^!Iroe39lzx3wd|uy&ahbDk-7)k6XcV8 zUFOw1|7RQQZZCv3tt7t$nq~6H8C|>A+J<pzmww8IYvulid^k(p?2g=8@+a=}4AX$u z`A2<*Ek3Gi=<9QWvuTKaR)!0OomFkUMs{|O*owNHS`PAqcRd!_i#pD9Z}#fu&&Y(Q zJuoEl*G1Da`ksUTDLms$tWn=*_no4Hq~(&sJcCl&meJ>NR~p+#@;8*t>pAd*Cw9xu zOQM4Wyq~{9+WC^VREb~pno#m3;GK`=8z}2UJooguq_xZ$QN-=a)w;9=YR*0IrlDa_ zx7q+Mt2MYR&a*qDsRL}6fqg$<9pHsJ(uPhZ{~+c}T6Bvv|4%tH=Ru$0Q%cT(PkFcC z-t{>LZTu3;NgnXT_Aq{6i2ibGg;rp{4Ggx>=EN4+k@$RHXmm#^#sAO}*<)xASYmL{ zla}^-?!VLLM7eqA8GEH=WOuvuSQ3xPd^GS*i5g`aqTB%)mo`J=RAZhK?ix$uji`CQ zphS(VZ$IryrycyAK5q)sKdQ@n=h_EDMrSaHcdj*ZE0_GYlOCK*UK#IW@z?bRuGzo^ zzX#-QB2Q3>B{?k@dVY}e^7h};XM3mIGZC3bJ<3$2*jfkVYNPy$#O02h{E)~6saw82 z=l%gW-Z}IW0~ZazjXm2keR0oCcqdNtZAScatSj93eLNo-bKbSn*PRo1qti4ZXNz+U zAC|tL9=Q0|7=!bxfunhc&5Y^9%jv<1v>hOhrVJ0Tcl+laM+5jKu4Rk#_39+#j+YaT ztM4%&t}nf<1ATc|=KK@Jj`KCspDI~A^BfNL74ou^+RhU=Wwxb`48HZczTbt<Z{Rr+ zYRB`x4ie@yLoWySQaKw0d>wGx0q%{}^u1)|9_MqFe*O{9_TmxQZ~F^+pAC*1aVTXq z!~v>!{!-3&w$ER)2eG~n##7%Y*pb|BIXB~YFUlGD-m!?}ab%EjGeocQhRL&O$H;!g zT7Avv?2Rqkj<@GX_j6rX_L0G@g~Es~ZE)`J9FMqA(s4~-?0osrg83{vJ-A>NaRq)G z^}DjuqxAS`^Bgv|nzY;S{XdWwVjW}qJF>LPi79=i>ZdCkDfby84@(#2VPo19#eCtI z)Ea)R*4UVnhgf2Ktt^x^yMK`1U*LSv`c2tQ)MYU8yf@D1x!}u2-QYYo=fV!ksy6t2 zubJ;IaCY64k-Ip`XK9~>d0*F6ne+2to&7n^@u)`nt7HyqKTFlX`57~({WF4}oYD2< z^8o8<?5Bd`OFG8i$B4g~w}buX6X@q@28Z8{XW}K^<<n;TnsR^Qof5S5ZNTqrIV%|O z=4hR1?0ExTgTcYkY5u;vPTTdywcY^j`XWN}-sk!C{*GzGWYY$o6OraUXwq0R4%<B1 zFWoA4T2RKmT6iU;dDohd=<87KLcUBthfF`*Yh<5-7ihO<WNC6|;r~>L6$q;l`Vd+j z?PrqpCas@99Y{BE{O%On<>nmiSlNdC)kPnZj?v|1d20YS&XoOGJaaFj%sh?Y)93L; zmg4tMn7S!rYvYfTZ>J)2HmPNTlw*>f`aej+x%9vB%QF(<wtvTS4e!|O-jLCA`N_eL z$XtGMP<+><c-EB4ex2nZKl-_I4P1%r-Kp#u^Nn=W-XADM`vTu~=Xd6t?~96em5fs# z6~A|`(TB%i?B>}5^P~Se_R)=^`%l}Z3en$q8SAn^^uP~#tWUu%%YANSo<1q^(f%J4 z{d2eh-3ZFzna?Z)%3u9?+l0QjhGS#wJMKB7*IT1`|DYKs&}HR!y4qhsoAk|r!6qa3 zr3_eXnea>h^x`*NO%@uF`zw7B@OP=mif{H3X55<OuD{8`lg|qHxHkQi|69P#;$0yD z_^5%e8w1b%`O|<S9k(U`Zv(zU=2-D=AHvh8^lgB10N)l^_s_m{_BquSz=OmojxV=L z>U;LsZ~pj_FTJRGG@TU-@_p8Qq7UB~;JrqDuUz-G?_49*j!%=`C$@pHchFrE`vgA? z;O#N6q*>kxp8Z+%NAmY=2&#F0X7`Y$r(7aiMIA^xa1J&moybm@FUF$HKOgsHCra)* zc*@6r%kW*>;BNJ*w2gP(mw{-#AwPYGq_+${4YozvF{VCEo%$l_|4LsGzp($u8{I(8 ziB)I|d7PER-HQG3_)xjn_qPkL9qtz2m*p$a_FHMs1=#8&Z3{==J?ZjZKegS9x!b{$ z1kXFSd)K$qPI0@Om5jvm&X6{q1KuQh1H<4K2hk^G?z2NPt~oZubi%hMjtwzwB$yW8 zh^H7|5{Qq)H)RU#kz7e)Q$}<N+No1>ljsfjb(;~W+Zs7D-R{kr^xRO)**+qpTH)yU ziEcE<JKbV|b3?}4f%l75vv)E0%}caSLHWg$|DcS!!o~Zm_?`RZFM$WYS16pA&-2tD z=yB`<eLKs@4i<4934i%T&lR~L`!|$JyH8Lb80B3owpC0wR`)>Gb6npI=F@@12gGHT z{k+gNpBqCbzJ3<l+;_@{c_agQSnA2avH46;SSPYpK-Y}nft1nZoXtC?K=<#(KDIZ5 zkkqmj+A`2CSg9>usG)l()X*jOotEo+z>iVisNQAh^5SwQb(iPjy%Fz?a;J5d*M#@^ z^a+5n=DWP#x+_P&_A8i1@m}$3#4eflREe%-e0@Nk%C&p1HxX$c1zw!)(4T)Q|Ic{7 zh<BW*4O&mf?CF%f@%-4gPx5&hk@Ha>8FNH@S34-Dp=U@ntQ+FGD%bKc)1DrLwP;HZ z+O!sJ=|P*;qAfjW(^|Bp2W?vGt-$+y<A?It87;G7xdRKW0DdyGbO3)7&xq}qt?3)_ z=j&*>745KQnRp*3`ZgMrE!KTrB`8x&enBO8R=$6YO7N_F*XPuTPaQeqPx?9lAI(n> z=wx?dd}Gt7^LoGN4UViKjB%sbtQX^|?EAH^Z`zrm4%9`B@=kO-w;)dZvE#i8?;+5E zpaCb7o@PGW_x*fa+CK;0IbLytGiy=*6$p#}Rwb$t9$BMC<bBo1KkoYSO|9E{R{t_D zQcpHjq@@jAMO~iyM1|<nSnk2WMIns+Z@E7|>GAF&)^VA<9~@jQ^vJ=%l|qjk91Mv} z;oxAHa})2C=G`*ySCZFF9vuAW`Iv)go~t+KTEJt~xy@b+c&r&tv*6ZgX}p8invQtd zAkr51!><*@*7E&v+JYSvJTTAHgLC^*^UVDD&bvLBm!E!?0`1jCUo@%g6(%q0ToJ~< zx3Iy)`}x<HJjWxy3j+D`{rFqO{Fyh?GjAu5he{mu{Iha@O@)nrxtYL!kE~URI)o;K zl?Y>Xv1@5-{HNS?4EX<!yN&IMm9IFZvR}SUw(ZxSy4>~aRALbIeib3MPS@YJ{~K@W zKKAbAvU8}Tly8kLpKEjg>u12o`46RiIdzvuf5)P4Ks`pG9k+Rrw3ZW2r+!O@aSw@( zAb6XdVO1&nSy<U}A4J6M9>iK5Bz}vC&y#z-O5qQCgq~p<%cQYPnmz77W{>+A?F&UO znf0LktMH_v&-sv{sqPiM9@gb2BQnbMhQHK!nD(Kw_Gx*c-Jucz-XW{+1pxnyc8g7N zqEp)cPr`RnUnrR&jm-3Zy0NhT@CRW35UxF!IG@K~>D%0By0KjPUyY`zRQi5TXi~Jh zTGOfdYWiXkx<HMg3wnSbdpxc8)#Leg&g8vBmcMWG*-LB;{mJ@0V)ij#mepu<t9;wt zrwcyMMn5h^onq}nO2_{i^o?!u8e8TMepNU*c3u2vOq_L=K0I3-->(X!_3J$LPV}HI z<Qd+*rNZ4~Wst8F3L`eae`wrBWVk|~5Fe++9)Nq%cq2av<C!#|EpqhLqL17k(6h6W z3wih7Q(@9r$qaR^Po(gD2YCgaYsIzPM3;d);+;AFzHsVE@V>`tGp<@^54;8UtN=~R zeRDDL>zvn-spfh?o;poJ`vNp+N&;!bC*oQ1@^vQ{oBh)b&VM7f<Gtj(!@k%DZGk>$ zlRj7x?1QxFgEa3b(|xd*doSu-Wup(2?gLAiKA?WS=>yiE`*f|)=N+KKd%gDQ>oQeN zhv&-(Th3C~v(25c@3{-rsJX;D*?oH$@^AVc=%uFLX*XXyduRVuQ%818{33(DLPo!G zk?QpRw^AbW4f1fo`uKJs31e>`5!;XouR3#|obQoWl`|ONxa#yn=(FaWuj^Sg#%H_j zYM$;ErO$OO!#ng*=P_tYrFy;Nh6W!r{s(DKC1*1YDX}36tF=Q{8#?@8TFd$R#D7>v zu45kdaIxVby}mR@-%+5iKgK$SP?z5#4d?h|gTo`vdXKgXUE;@OJ;r{$M|<&3yxVwR zjCb;8ZgRbMH{u%G)_V^1k>i<sEx!5mUg@xw)AG4&Sj#@@05=Pv1z{1we6>EeV=`$_ zl!tf9>)X}?!y~XSx;Ll<=Srkq{3NJ4#J3{Y2=h0pL<>UqnIfI24DT%GH(FLb6xQ_O zh@UOO{Lbvnqj5?iPrnOH-(+{6S0#P0RnDP<vVq|*>bm*+MZ(NOkp~05l<Og_Z6PTm zh^ZiNyo~d)#`kys$)c=yB<_d5)czIxGHi1e<m0z;wM^PWdhJRh$8HLoRrqH+L7im1 zE)IJq#CMVQSN%r7X36+p$WwlG3FY_V+j6s{U!(%IeLpMe-^zJ1%DEVGyaj83_n^|h zSh>=3-04n*-R{(6t9t?Hp(Uh;cGK@_iMvhw98lJ|7_>0yZ_-_ir@UF~SZZI*;^*7d zvaf%hp-%F?OJzSd6t$lk^5cCt=5zgYxu0C>#r%GOHbzk=`dJRQr@q#LHCU95FV2OX zV?*QUccDFHwTN!%Q$r%JZeJ|tR;kPAKl|7a-@hVb)yjU`9rXPX4fK`xS4)#W-z>5! z`UavuGm)o{nQK0Nrhj;mzq!wh*nTX^a9>PjCeTNm^9;|kzcC)`8@x7sGn6~-H97i$ zM|=nEh^c3;b*Ob7lx6rh*Rn?YS&A8*fO@;aJ0`OGMD7Ah)jS;T^*&uFh%U-!@w)@> z{{z3YdtQ#;ddgL;twVQl4q@*r)3#E_Rs)W5hjF|kF#fzZQ_KJ5to}M}D|dq9c?r*u z;;)HcY8Nm{<_6}7yGYI}F(&tvHEhguxSbioxorz`uETFjDZ|*gO6vgE@Ef18?}YJO zG85@<Fy{vu>g8+!|M>qnywt4{JH8CQ;okpx9(%w1_PF?2;{IQk@9VbK%bCJ=kJpQC z;S!GVZl&6C%FgEIq~%@%jOk{N`XJ&5TIBFs2Q@rx2a<aL_uX=v_TCzX`S7gIPgkF2 z8U4rW(-okXfrr{Qi`~o5!1sQdW9w*`i0T<6t|Htxm-s@%O~HIyVaitOIq{Ro^7-vs z$m1`RzEgsEl(bVO*)vH0?97KYOpnBSOJZj3PByqXYVLR{?@nd^&YWZXBYvm2AIwcr zH|4`^smIpvjKw`H`Ya=Q9K2HiaU*&hfGtxuR+c4Fk16%%`Lgyq?6TAyigywazX<)+ zMqk?M7}wkv$m<8b$z9{X>2ekXymSa*0O2sgOVnRSAdbKDOcBQm?Qe8zey8sz$d;uv zey%a)+yQvTTd5C^lrvez=B9kToZEkJ(nax9n0Ea)HfkR)b5$zbpi+}R%Ch2%s0Van zrqX9I#G8D+-t-my^6PsVpO-rQ_Ds<>Yod`yR+;lz;_8_56^!p!JULf#Fb@z{g*cus zIe4$edoA9npHq!@2k&)wCmm)}CkOk{<7WzQ+q2}14f{}O+k$qhEwzR1qix>%X+wtb z;Ft|6`b_&|<^^Lje^_ZBYR?tq{3dU=e=ujKHsok$0QlYe6zQ<%hyKl+ML&Y~gLpo0 zJ@=m#84EmMiF<p-GBgNnL(}y6dKGQB*JsMi_cHUn4d3@MFU*~Z>PGtRIYzt2@0#*i zF8yD!Ovhayd%#>fMQ;WtXva^V>AM2y!S5ZT@0V{Nu3Yxj*4z`umhx51m($cmY{VXi z5JRvLsv3)WcD@e5BZar~hUdTa_Bh(h&<-oC_oJQ4U7MxdB5mrpzO|oEeZCg-^T~V0 zNBozQM$2$+EGK`mQ|tfSI~Z~B>)<!=ZX+$@2>WWGaF5vc@H^uH!+K!9zUNOVdqjtV z{DjthAZ@;rauwn#?&*~M`E-^4ZrO(heY#58kk&dSRwMeLsRQj1eSWm3YtRq$!@=K) zdXKwD^chSX%YW0<eT0v<pAf&7rvr8M=Qr=%qMpp%yxSl}J*GsCv=sfo(!ZHcbKMP^ z>u&(#pNDgP@1(C^_vn!5-ML!V;(gQfJq6$oYWzDV#!0`e7Qbwk`>%r`#IwCZ^9ld( zuU_yT2a!{tUM<vXM?Drh&A9~6q9`+sA04Evc5AXie2ktE-M?k|Ul@D#WyITnp$^|1 zqf<bgz-5k(cl|g#gN`8maDwMy<o8M%){7qn`T&k3Ix+%p=nUY&opX`4bR_K;bDEzo z!n{epRp>*ZGvY@ht-x^(o+F?!?xH`q?JBYVfpZHfgg*tIVNC$O{Vd;^pKELa$y?nW zcxGQjfh$_f{!7~2uRHHrN+SL0KOr>ziSWzL;XC)$IjPilNfRsvzTVr=E52_@d-Hu) z1Mdpcu9p#>HK2em5j8D<Xgo*ZeTvvrW~EuvqN%JwKFa54WoXn+<&14Psfp4Gi6 z=l2!qfvbak2bfmg)tk62!#ka@cTVEoAU2uQ4MZHz+R6ibt?X?neYcJS7^Y_#yf2P; zVY!^W>bs!BMqeqImNItk(Mr$Fr~JF5#+I?%(f34Bk3Av#@^gcXPq-CcFwb&BCyyW7 zF4Av~##ODRPNz_wf3IB)&kzH3Ip5F+?^IXH!>h4h)FCuAYQ6R#yzr{%i?h{7#gBU9 z+O;mMGPb}$zN&h}ug~Ly<fV#!6do6OXt$9e`DdB}Pq~xm%Y%*(|BzqG{io5xApEii zG52<jragE!MU_cI`2P@_FLff`Q-lrrC#2k(cPg<i`wg8z*x;V&^LKK->kbTtM)U+J zM_)IhC+Pbl8Ih%8Pty7h&kmY%3F6%v-!6plgkika;lDj|w)DQQL0x8A(u~$87CY}z zWov)vKb3MrLjUReH5g~5pBZ%2x*X*Y3&49$5!y1f)^WRX1t*NS7Ky`NwHEu~7S`{T zv(!%o_EgRZzYac}rCtiQug15(;hr~EW@88QBfoF*vrT^dWjgZHR{HRum0=sYOdCvn zr49Gy3Td|CI*FTrHpEODPMJEKGG&jIO_Sa!^Up`5-b>9mCopf9fR{;1yMpw`Z^pEP zXO{gV_6A$MLQ;tzk}3W@-71sk9^Qzx0K8t5MYZX3+Ti(WmB^B}imq+U6<JhJ_9XOR zqq{@yLh$2xmM8LEW4q+bp~t2toUb!;wr|6WEESYlxkg4>HO40?)7$RWfX;@tWoO<P z;}b!BnB#uGkak7iaDQhzXrnpc_f4Db8}c<HeZ&589~jd&4@li>$M#D?-vRIQCo!Q5 zI%N!gA^o+}iw5!`Z?r7XUt;@ZbR3mS-H>9rtV@Z(YkuFoz5F6fun##ejt1t1^a1Kr z%R9gS)Oo=>NkI$i{_mj-CeO1g%Flclzs<iq%N!|}JqK-0V+;gmzjI#I=^cNxys>j8 zXtN^ceB{^SS{69GwpZ@`<a#fau`2qzpzifd(6q|gBz}=dOZvVjsI!mf=LkFA=*awi zLF4y%vX6-^-m#g!9&4M}w3L%K6u(O7<6DKFZO$#m_nFSkB3mCXchBq>96D8x|5H)m ziOWXLS+ox7Lh-wnpuJmp9MAL_^gaVae^BqmGw+T5g0V-w!qi{NwtBr~vUg=@V{*b$ z`v<9q^<LHo^%%r+xw%_JxyQWmh94QP{h~;mxz|!~KKtlBNZS`U8w?A4Do?xra-+LK z`yAyyCAuur0ly~IEA%;S`Bn$gmPor(dFr{6PWU&<EAabcBNK?3wy^xwzt(4Xv@vl5 zdC;H4znC(sQj~e_AN0##2VB7WjaoogBs!Jq!t;n<gP#@W3VEI~;N7zJYuZEY<m+2S zx0UnfBN*FyL*KA(1{Cj}y*=ZfPmmsyyB_W0nT7EAsl_?Fdt)wY`0XC0?;!PIxIfZ& ztN(sBexL1L6@WP#&rg`e0T`ce&u|R};#nuwWt{N-FO1^-Ni!$VN6QgbAgn}Kg+O`0 zth3~ez3f<3AbwmM@#V+FmqZ)Vtw#9AfWIZ~b#kYtmRHm7tI$8>p}%6}0{b3RZ<87P zG9WV`t>qdy59Q^H#V+wHo=R-<qV|`>Hk-1G9dBuUZmnn6Df*(nle?>K_WoSXx#?>r z75=QqODL1-6h49T<ZjeEXahn0sW&F3@{5iBtB)V6jE^F%cb*#YdrLgDEa2D0w_&1P zTe;Dt=X06pw(IAJ*pKOF|BQ)yS<v_RuZ_(m?;!Vmyo{6l^mD1?ci6{gHM|ozV1rQZ z(;cn850s+;IetRlaX~#NTXp9C!^kXsA7{!wtnZni9HKIn{W;HaqJ1O&iw@&`4*Jj6 zA&S|Z;vfBsZx&A089O}Q|F)j?W~kR5by(YL-kQp`(UwbnJkzfZWXIuKsopyUw^;@^ zlSivG@s+;3!R^fOT#;*Tjiv2o$Hu=E(mu<^#((PqHKJ4fO;x;;Lhcny@}8*;xu`Yy zc({GB_?_e(E{m;Hw%>i8_lxABVjKTtHm=&yw+BSW)oMH7@&3?$^?a7{z$;NF-X%%j z`h95cd-1-P&+g&uD*Bhkyy<iIXTRTeAgk}hIpB>;9gy+<A>!!2|9!O4#V_xxXZ+=F zYCUf1R`LGyP8IO~Z_$_k7jr*E8ML(%K8S6@`r8JcB{=SD#`yH9;e5%+d9&zHOu&A* zyscOCgjy559=_$5C3{7mUfJ8dGN&sOaznY0(~-I5>8_mZuE%(H48_u2Ir_xnT{`0b z9rb+FO=qh>6I7|Sx#2?LW6Itj=d&wOpW~?44u%04j8XfyIbX^r=_?MnWjXLVW$ll; zN5tNtKXXK6PAYDETDhA&JH07a=JpIxXDyQ1>{S6*@xF?xwvD;1rzunZDDOl*#xvO} zrTy%0KCNZVtVcK2KI_uoIQnkeq)$H?UrgMGmD3|O!ZvMdsds9Vmg~UW=<=E}`s}>l zJ(MMmsCRme4i0bx{oAUCys&#K{cGa;y$Ad=HkO@4zbr>s5!A0Y<5es3#<%0&;?dq# zkD<mrOv^k*@U6Wh=kph6<A<r2#kg>~D<fz3>Q1xA1NS&j=R=u}Y~j??`3X&_?2Ln5 znHc6({Vduy^?J_1b(t9IY|&>{I`vpgWwM-mbEECq<Z;ZwSW4a}#M)&(vOa}EK$pav z2lu-JvIp2svp3Ej@Fv>L-lNVywy$y^yXUcitiFq~BhxqS=4=eVdz6j?Po4?#Y?24^ zqwIW}Ie#SHqwKsIWBON!qb`tbZ}YaH{~YR5maCKfYJZlv>)jZ`PSdY@t(&vHj#LZQ zOsGQZ(X2GSN&T~&oyaqXJeL{TgL!NJX&t=(TxjJQyE(`6ouhzr-vRFDVRaIC_5|ns zA?}wLyHXH<tMJ=KUsZtleBeC3EzoA->siTWvEiW}H*xFSHwq`Gqm8s@=lg8h>Mu@Z z>o67<piTW&bJn)+_xhb9qVv-=PMx&hW}l!=WI#*b%{rKJo%tBQ`Ir~8z)w<#Aco&a zDmy*W4*I<#`!-!Tlvij{InIX}fEoMU8H0O-t`vPBpNH3eRC@yRm}@EO_`1tlkInz? z8a)O2IOX>~%rBnZN0s(T)o&k``^4YJIYL}{u#f&!YQ#Ti`U&xGx+nd(q$e!tk-0uB z0?%Q@&nRe!J?aV3hvnGZg)!#dQWwyB3Y&Q{%3gu{p}FhAuXB*@<bFfjMYnB3F4F!0 zc!8>XH1UA=dz5=g1&{nI*1{1l0b0HrbYIf#$j7i>Z0C78=3Bk0kbR>Hd&MKa*ZO<= z8lDuNfBPDq&sNDjGswd^;-#F&^9g5NKIR<onCC>~$GlqAcGAixBWk_349{OMdVqZm z2eMjrx!#MWHsnCR*X*^P&l0u|d(HRpOjz!7<KqWBmM8qI+c|l>d*Hkj*5lvc`=j{2 zXUhTE$GT|)pf=^!{+|2Wrd+w%-#&-;Qj|H)J?QnT7eudRk2;v`kH0`a0@;(4lQ~6O zHIbW{ak_;%2N<J1>p-^L(fY>Y<lf!w!oQIABL1vZXanXF{e$fReL#9*Pe~-Sr$q0O z>BE-V_8rin=o_9naen%3BG1V5Z(OA3BlGxLNZ+S?H`0tfvmlMiu_5me?e6v>N$}X} zLC>`-y!WtwQ=A_UdUXY@7rjTlnB`rLsx<|g;l=E=_??CKs&4FWSj)_(3baOl+Y_<} zCS2Ow{McKxSf4XT)E7m@U~|smnf~mnrSE?%=PG*|ew-~~-uRt~KC7gShV^9D#}nhF zzki$^-}YmfPi-<z8*&%OIBm$e+HX*PGRFzL#JI$h(zbr}oY)xdQBO)8`{U0Ej`@Na zuW@F)S_9+tYdrT^KhDwyhBk#<Ghcm6^VA%NAm7lUX^H%ZUv=<l<in|72>y@ryvFDf zh`$_d+fE&2K6iPvfm6<X!YlsToOz`NM(a6RhTk}Utd5PV{k8MkvA{Q9KWdS|J0rT6 zZnw9{?er$1ef;M8DIBF&Wo!$Wp8k((L33Xm()xQtMi=Wx0o+fTjr=L^j_$W#(0AKV zc0syb-RI4qKLP6S#c$8>j(6HTE_3cj+iw#e-oS%Th1_H&BHuS;D4&@``*C+&W*K$p z1eUblM)AcgvJv(l`^?CvMCRMJPHb-%wXOGB;_JP|$@Rix3=7^a`kZmam&+DU<7GW& ze}y`=66aD*1-{kz*Ez<vp8)OJ3Ou~8;V^LLZ5jFj58J7)8J&@1j3>RcuVFv+6f>># z>)+Hzp1QmVeY|hl;cS)YkhW)5y{>VsPfK!L@vf_Aa);Kfitq5)mrG^7f)+?&Jtg#g zTF<?u=WD6K;g9egw8CqYm0d<(u3N>9RVD5h|4XC;_kiBtyWmLnsx#VtoATxFHyp_t zUvuSs_)fjj_nPm&6yJ-a;nxd~wB`-XYrQP;+#B;pd9DmR9x-=jH_<17zWY)5vGMNn zVwV~*yw@jXt*5e|L0w6+M$BDH<BTrT<EZbZJt}b=q5XR*k@&6-rxD_NRpKy0HR6|l zk2vpnkG8S4K99z{ryk~Z@AO;L1!>Q*Eu1f5wB`H2v-H_K$tEt;I{W*uSFlcfmmkP> zp<LFB{MJ7K{+skIf_D8ic{R4do}BY_%301=75$0Jy+6_}uE)!ej{dl4CwsrhiMD$$ zzQuWTzu~(R*)NNYg3hBAd(@Wz&-|BxFR(TK_HA&pHx-Kf6Y(nHh=VO-x68IZhWwWy z|FHItP{Ve!%_YPSXy-DKiRybe`!3hx{Ar}!x8R7#Rms=0otInMC%J8G%4u`cckO}f z?MBASK1!OpvYvktsOKCR)9v0vW7@jR$l%yk!hRolULVNgf<PX%CXdZy@}RCZ;o0VK z0efS%tK77auxxX=b4`vm$Hb*kQ?8%3LH5G+xi^(=XQjzw9P%hPyfy3b^qJB9JmZg) zNm}iDD051nUFQed_46~jT{n$s*Lc(KFQ7i<rmj&_4<EnxzNL9R;(mW_PLg%`F_F74 z?rW#@Itrf8WD)mbK!26^ZJAT_?POt3<zCHl+JC3-^(0>3yJUZMxzm}8179^Fh(9TZ z_ltGrc!%1fGxldSAJ-|igetyPY`PZ%0jB~yvA@^QZ@%9D)QRVPKl(;Li#XD^)3nF% zNlbf+@bvW$oa)Q9BiavBCHf}p%fusQEXzzAI37#h(!LH#w9g;WF)lUV3Hzb9jQ;SM z(R-F}YpN1Ur4Fd)u@+P3u<?t*J)=c+dY6dKjlO4&@{|kY+<u$b`Tg#-!bzs%ej0Au zm{Cr*$9-%O`m`i*d#3Spaj!jDD3nL-ZqT;RfY%ww%HBBbnoJ8|87J?RYcq@OPQl@% zBU*UJfVwf8Gk&gFF6sOiQSM^;9Y&diq2H{<ylcj}L-HdYA0ES>v7OwL*k+5i;!69$ zmbTI6PZjTrVEn#YIc{=~irhiNeJo79utaJa>#*-N<5LIyyl;uV|M3^6H6Cj-`!0X? zl)TOVx3=-MH;DhLr{3VY+2F<E8$AE68=gVii4C4_^H7StUuYOZD~S%0%um21*NQ#X z!vVUf#Ww!Z%)LN7pB^u?!wuq7($_Z<{>b-JF3(zCK|KPWclwo~%l!P=jy7NJlHl4v zeUtj`1?oC)M|)ywo1D>xG>?8I$5WTL&C~Z0k_Ox+^|vu5+J*w}@$KT5UG$`QMil4V zStfgMu#G%B<2e}b%-y4o2;H^lwDu9xhxY}i3vzEqsA5_8{q#>IzJ;*X+O^!4_^R`D zy}w_E@83t7Mw6yipEKuOyibU)7k?JtSDHU!9#>-ACz<@{qq)S$P#evB@a-$z*YsRi zWBC61*C^-KJR|4lN=NG+{^CvTdxdqFe42WR39;L0G4@|Ry)prGiSW|M>&E}f-rK-O zRh;d^vzr7$h_FCVK2kkE&}ai}FxrR_7YGOib%CI?p!wPjNy*2W-C(e^4J061^g#)V zNM)_`DYf)3ZE0(*wLwv-rIjiwT3UBEZ27ce#Y!tR?{&@0*>iS@*5`TpzVGjS|Nr2) z=Q=ZIKJK~ao_oITVcsje(zd(QSMZ)`4B<J>3dR2m5HHu@sIznKfO8nz?c-dnSIhnF z=mT=*Zk2nuSe|RnsCk<VEql-EGJN!b-t);lxS&z)M`}%t`M3`6<T=%kRG3oMq31!V zhyD@oct@%{Km8HMr+cDKjDg<Zyea8d!7=<E)F<*(u}8M?4DX)!0O+89`he}DBi5?& z5Pb`H7%<1C4EH*459sQ4&yG)k8xJ=Qt^n@yaHX8%<KCdQRdM(F*|E&<s`$rxuFi?_ z+Uta8n>eSt7Wq2-cV*L~uO9c1hNK_qNE?m9vq|#iZpgJa8CLise^=`On>qe;RLqd` zD1Ywhd5LkqC-uolcVaB6=TqgmTci`F%|6Ii?&BoQ`*_sYjP>;9haB^JW4sS2yP_jT z`wIib&GJ6=3>(jF_(18L>EMYDy;hJR_i-a#^qqah14sLc)kis}L+s{!XxAg)myJi) zxz|O~3h$2e741iPkB8{G7j1Jf`=m7CzBfbm3HW9gXt1KAm-!Me_cDj0zA5TlYe83z zUe905`+A35tJhDyEN$rRi5uzEJNBr#YxjQ0?hb2jwY1B5DsJD?!gp!nrf8;PYlgZT z;3gR_@76ja?Je$)pAKw|e_|Zqt%DWnT$S)XEBmi((CiM-EXOk==D>L4sYmxnJ^5nf zF-P!jhzH|4#T(HqX_xWN_~$>O&FVeTUG9TXeNV)Q=_u1!yx%4EMu%Z6o(Y}|xzrrQ znL!ELQ;+x4`v+JTpObsn(5Hmc)IC8Jk!}~-E$vri0?T<9{Bl3$NPP!UKYji#$D1bO z;QDL$_d=X3a(K_cb)Zhx0%ssoMH7`xe%_1DF-OtF4mr=sd)Vybch+gDZO_o}lk0XE z>b8is7u~e!K-)k4WxL6);vT;F(K~sEjCTgcz3OZv`hd5J#K?GY*T{H@F*05>cq96@ zs))3u<_Z6hI`^^DJtvCbUo;Uqd)K;1Q5S8*Z<Mx;izcp?wvMx*dzNrs!?iL}f;8(m z-r#sEdw%y<(5FzBTkBB$oSS<f*RPHhaNl5fbu2W9b{EvW+N2@(zaL^<K&GXmjX}mg zp00IN>Z1dduJ%%<E`!uL5x*(ZejwZK3z}zNh(8Hgz5O4Q)i20(E51*|Gt)ZFvjj+Q zxvu-Gb=?=qK94#&bnf)_=%#;A=k<0Qa((c1jBC{U`>7Au^k;e2+fy2IVO*aLm+oE@ zBaJxk$GolSC2uP~A#V$H-sV|%qshFTmy);J{=vS>tJf~Aye*Y!t(E-8u|$8#(+c;| z{7C*|y%)>#B=e%JJv~pAfFJC9$NLe<TmAL9{4v~fyIXj-!R>(C1@|=E9=LsQ2jC9D z9fmszcN$LK2LygytbZ5k-!lE{)xUG}?@aw$s((HDw?zLI>)#^%>(;-nD;!<}t_W@+ zTmY^EZWG*gxToO`!kvT@SHfLk-4&G>hfoeezGSsY+fP!D=AN}Ix#xdz^a}1jRkBvy zu_Dfw_tbDrc8Y6S%rM$xJ%%$joO5aJ@O`a%e%?i0iRY9Nm%K-%f@?xt({{wB7;~hp z$PBq2?QQ3N{Yv*7b(fkDcRM0ngT7U*nL!TF4y3Xx8NRQNE$q!=&i(w>jOz=)8MNOC z-eI~M`(6^EjQ<^EEXQ!;@$ArXvd+`owXycXaP)%5?v`ix(!|2<U!vdQJn25!Z{DTm zs-8%;=|{c9iE%-`)PwGcry0M8?sHF^=j9xDFV|eOow$(JOXL}iSB1z$J*19zxc@N| zeI57gr&m0zYz<(%nkMJ(?v3S$`;Vr3Rz(ElQI6b?Gf$4mo$f<uYmda8kqy*`pog)) zIuv)f=Ei8(%!$5I>f@0+F^;K-P^UHL-uNx|sdJAq*Y?uYy*8K8b}i}2eFca0enE4* zqU<fNkF&mcH(KgCjXZyfahBSz@yg-Fg=+ln(0ipG8?!3Hyq)2iuD(y)TI*Y{?9}7i zTvu8wm$s&iRfE&G=Fhsvv;7+z5A!@<RCGNQPp{w{(4oV$uTz0CJT{SMt$!D96N9^_ z$i1A04nxL92f~js%;UaS+N#4K;BhzJjrn#sI=UTtm6vkq%iURM|J-x;^z*{I0<HsY z6P%;s(Bbps-pfOA(%b24kCN7$J4h3Fhxbld4|pzE6-_HfzKYtTX%(xY=u=_?DpnsM zuVw1^b6<cALA;0I&M<yYO8ljtF@BGVpY4u&OEWy}N2rf^+>gZ5F&<!9_tNH7*IjYD zO}&Jk1U!uU*Inw23i*)shKHe#8>#mj4&(Va$RC#+#~q4)U+=HtT`T$E?KyA`u`<SZ z9BdD+Hu?RvpfByuu`cv}WYqWb2!pWlY?azq?({s5XM8JiB;O2!-ccjZL|M2>&Uah5 zLC#y{sQZ%y?fk8dwa9Z($_94QdHODv?a*N-cw~g$7s|6yTwih+i{rQd)w20OU6cEQ zrH)6vll<axv8{bk?q_!&I^xW0kCLZ9k~|H6-si2`6z6tIfXA>M$o`!CHkWhdk7tT| zWAfe}ch`}0<B>Se((-=3zoUN4^Wvmu#g(=*Q7&)H+*{2$m}ARpy6zJK2*2-DYn{^^ z3+GZ+dDS}dxLD7L0?KCa1joN<k8hDq=65EoZi}6J&gzj^@_GjES;}>r>lyPC@>SjO z*>QAJETQYm^;6EN@lIXgu9kQ1G8|o(%~n>4q4t5~+SYuj_w?0e<^ESW-w$0&?QNxv z0eKJTB$Iab_}qHWd@k?A>$3I(=KynFVHjkOp#2p6ZQowv;C>8ye&ilRxmMH${qTNy zpW7#WpO97ZY?K;{oax#s*K2d#TjJRP?sJ_VHOt7hDJmX}9|TVx<XBuN`|eXw-~Z0L zYh4&aq<JzT9Lr^TS4VgTkmJ_Z-tRfVdo0uC9PWeienajrO!IU^e)m50FKKi3GP}Kn zAnQ5ojs2B-%{+I-Q*AGC?Dwnp<z7#@-<Y(?`>XJ}-xuC>;MwhP+pbL3Pvm}F?h#zC z=+;RaMHL(igJxl_ZT64z3_WO;b}jj?ZF8LC8{Q3-scH7Xd;eaV<?3^peT_8{o=Lg; zeP!R3<zZQP7w-;~gS6}$@I_X=&$-<_-D#k&T1UH?I;|QTyEn_YD3|+U{DCpZqa1^f zrkSAWg{0|vZ;bPkaxba3{T#aTtVx~BgVHg!X<DYPEB{Y<@3DU~9Y2ZpuKX0<oA3#| zcOd$&dCy4UJ@0G6JM4An@SnhYc6y23HhNX`La)FB@d)S@0loTadfohQr`H2X^lH`g zIu4l-NYLwnc&&|I-G5c|qTTXL*8_3dvb3L*TBGT9>Qm_U%3qV|Mw;z-1G-8I-OT>M z95;>P8Rp+%Oaylt?krsT%fg!tmjjmzR{(bi?+?S};rairaZ-W)J&U~Ne!=1O!1>@- zz;(jygxd>u5bi9TQS9)R7Tfw=_7kXcmXC5jo!HeL=Wjo;@@TqC>80tkQzYN7Ow3o? z_6tO5zf!Hm$T5ms_m|<QGrRO$x9xlm=d(-PTjT5xOK5+`t<Rz1cc6!BV5^j!HvF3F z&%9^7^48VR0n1|0CB7`@`ws|l27P<x0ZT9Fqvu%FJ%FpFE%e7vDZ9tRgql<RPhe>) z$g6BwL%)*i<eYCjY3mz#KFtL^FR|azQ0MIg?Ty*=^-_Ij##+er611rdlwnRA!c%|u zZi!RY?{M*a;6k~c%(ErZ*4ZfDsj?-W?_L+@Tuz?stJQvJ=8N}_rD?gzG_%zlMR&G) zb$ovX&nl>UOfxj^=bqXS--|NN<bAZBQp+B&D5G8Ix9nlFPi>HEL_AZreSQD<0LX=H z;r{U*kjGmB{iSW94#XAK`~Kx#O}Dz&ggOcBSELOTa{iyP?Bn;8tmZtL_jJ#R9b%-M z3%UNZo}(YA)<$^;9Lvsow?)N0@d55TWj<XfUw@(OHL(uX>iJ*Kd1>M(elxFdh%)f5 zFzn@Jp45Gp>Ws-kZP#>TJm1&=dbZ2GGWp<L`&@`y?q!@CHT7m^!iMKcy)Lsw+8E03 zQfI0%b$v4r=32-h#Bs=6_eA~9sn{Ur@`aar+fA~b`{;V+y`i60&s#pFo>S|W_s(3T z_jq!B$=qW;0Q5Zdu9}PHKE4t1-PG8Lcex&@Y|INep6HbOHsoG*<nt5h^*yzJ-(DAH zdoyWZ>foH4<XH;pFv!#6MS-pH)l;~4r1OYyJs9r;nVpV2?R}SX>JP^GOdZ{+=Xm)o z`nac<X10ySjK59q3#831?p29!jk?Vn%l57vjI`6jUUlavc{WVmBJb;Vnge>7_d1i_ z<k_1BD4ykByt(hG^`ZeN^JC~o2S8p7a9tM*zpr?9(ExRyYQ8>O!+DzvF$QB_#JT_d z@AV{X<4b$`yyF@&CC77rJiqJyIPJVKZ#nK&iSsb&(pKRE2-7a*0rQj@SQ|HZwiaO? z)VB0VXY#!dJkPZd(q-GL!pl0a+X~ImHqXrY38rDNU4UOrS?0FQ$9!BmAl3<)>$-N( zU&id_8OmIqE6VyTeR`^mPA~YDXV~O@&lvN_y=eyRSn_^y&Vvh{+mZIP9o_|$+an6x zTlE^hvae*f1xgw0nLS6e;hz`(D)7&Ne?9nT*I^`2L}*`yb_F3jSeDy(r^yBX?XrAa zHXug5!)@-bL))Wm6SU*Ux6{Tocs#A^rEcCIMjL|z)Vb6Vj<&8NX;N-^#U}jAlzWJ~ zj$|906IvN#9OP}<dfo~BlxM}%9YyylT8WKl?;?_I(g|a3(usLtKKMQFjNjfiI~H2M zHGUcIk8&S8;_$4Dnd_8d{i-<YVlm>L)1~Yie^R^yMy-;%7UMm^`^9B_&?fZF=hO$! zL7DZzy4a6@W_={t>q=SAa9v>=qq>wmX1On)?Z`04n({uc#Cc_>NVXTBgE;K*6zMeF zUDQR_9W~=hjfeO0WxJB?%Q2puPlzk+Q{qbhFUIw0`O5e=#?|*<#AOtPqdg^QF{7ki z=`nf0`A*8)sK`EdpSrmwodZ5!uh%fuT+B#m-_G2pn$UUvXw9?By#oQ&4$negKO5c} zFW~-|DQk{!E}e3IwA51$#7Bc)KgT|A)S5`Td$8O)=J0el(>=}%X<JW(wJqNHL;6X5 zl=tJjdU!GS=6J#m-ajet-O;v~814hPR(ZhO`!k{qa`X@HQhu|K^U8Cp!re7ALn!;A z!a5h0W#IQ<Vy$z}Vbia#_EUPn={TRy+RmE2DAzXclw)zq{46=v6>_gs=uRQ>)(Wws z_}n!K)lVw9^&<1=<(O*$=K-Px>g*@lyxcby9dSz4!x*`DWMljn?^3_=MnS)~cpqyP z#y>f7kJ19UH(q_)DZlN1O6^tXC)Ay)?Bf^e{)PGz&k)^@_~f_)-~0!jU7!u)Jg)6( zQMPe>vG!f=?N{R@^Gvl1b;^9dV$P#;42AL@g*&OsZQldLwRVnK$RnY5)!0qZnEgd( zobzX#FKE#D$k2O7spFqQd}r)q7FQQ^v$kWVZNO~kqnXCTahK7CXWFbfcP>3!%>j4I zHP6VyJe$_dz35ruR_JHpA&#zaS|;DOQT|g;zm;|X)7VE9xke5Zu6u_T(e6pt!*RD~ zWSlZ}5M(m<T=UGOOYa#GUF}1;uZ(+j`<Uk{^xUCS&-G>V9rUYVoTn6Cp6MJ>5E&`Q z2m{2;(KU#-@1RXbXm^ly73Z@K(Z-mr-0P3BIx6mrIoAJP?$aveUIXxDn)p(*gzHl} z%|7N{BhBlb4%(aT<le*XA@5rI<qYbOj!j2+{*w2Rr+M3)><9W5u8nYxJ>9!Oo(oCX zOX59M@{F_EPngYpbZDoGxhD`jN1e97q1OC!@Ez~u`S34l-=r)%=X&HCxxP24;?796 z9OGO2_ni7{G4&v>r<><;92%S7I=FX5D4V(D1=5u3w@=CYFBWu9Kwh}Fgt{JW(!KT< zb)Qov>XCKJ{g*|Nk+Qy}ymLJq=lNpN=p}^Bc0C+7_tHD?OMRQRVlrLIrkbK#m~B$( z<FrRZK6lX%b(oGcpZtrmd)Bvb(-HEi%s1Djc~=n1&N8N7<?!ag&4FW^VEsOh?=r&= z$7xrO?KK;`!F63_3sfAhzsfcj_NHwO0Ao+CaY}no;Ac6{C=T)5V${%fQ628HHko!v z(p}Co>N^y<HsaRyb$G|)C#{FNpnp5N);YOW<!~K3Ebsp^ro^VWr|31%d3p_WinRtR zlr5JbdOn@u&HMG7iFME^dL49%Tn9Dd`vS1J4$6FQ>~pc)JHKDwMaz0*{s&NZa=#+? zyz$;gmd9*|X=*KEglX@<VeY;B9_I(wN<Bz)-8s~u-&u13>g=-BFPySyDE7z8I6tJ< zl0&qyB5ft8^UO1VYlK(Y88y##nd41|ZC*sK5$HMn%TWKE?<s=*R0MsIy1`hyBY%y- zFJ-g5+oDUI-Q*d}&;3QMVH{W`#GXkG?;*G|aAELD=G6{w5!~A84sqHxf6sjcoR2P@ z$}~C?V+hV0P)3rE_}+fUM6PpdJa-}-?`N)Pr`+roZL8wkADTGp1;2FOF<r4L?krMe zJu`P}{9T8-o0sx_H*|}mg<IoCABDS(y4V7FK7egejg>YYX8$Jl5=A!4cFJ}8u2Ea# zT~pu&ZH*7$91GVk5NG@7>WH(jJ<>im9KCPszR2?vFfJcc72%neRTHZsY0!OFjhY^L z^&Qi$``z(=kQ21q$Ue@It88vgcvsy6Cigp`{uUOhHSY~$cgr}Z^b+SYh!grWWYIDy z`|}HvZ8FU6FHU56r^k3^(upvp4GHE!o}*ZQw;T_WM@~@&fu`SkNA<nT*FTW2eu;c7 zlj}}<Y<3^ek7P|m8t+J(?>EW01>V`j^F&298{M?K`K3Sfoajb4#{Hdll%9e1^H!Tz z&GSmzn`(bsbk#rAJ~(CXcw^#TBF-OCu9ayW;_HZqeDGUsZ-(<Wv_(Q26DH3chF)|M zj<y91=&ENpzXP6p_4+E;z8MbDf#<+1;q8FGfLnjHCF8gz=QM5nf=9~a-s{eI8F=8^ zx(qJTv@6*je(Kz>eSD+t706DySHLCpe)Ktrcb$&+ieBRVx6Xn0G9LYR+|OagbpgYC zLRoX=+)!tHz&mQcI@e$O>*rmd|C4Y}!yUNV((BAKTRFTVnEjZSYY4PeeGmHgd*t0Z z*?8tWOr~*<yz^wUw%H)}&mxV#p6ofnJxCG6dlW8L-}^4tS>I9nKo@(|m{#8BTp`cy zW-*+Uo#q)cy+8d1U00T!8l^)Rx_qXddElhdF|{3)<EFlT7I`?*%l%MZJ^wUQ-*Y)f z?{V`Qz$hDaTiSN7;@KZvX3}S#JUgSpF4SS&7+>*jfcliM*CDJ^%7T0395cg`Zj_U} zhn#Iu(Q{RdW1{Q+nc(*<ueQZPnZvr<a<WI>Gn`!lnwBWppNHRtI-CL8l)3w7%mE$C zTqEOg^cksTF5x^j^6oKI{^fZK=D%WgtiDjqY03Pf>=nSbbH1c&gDg*Jm)f^Dm}g~J zK73bd@&?Q8LOfcYvP^O>GRibqm+3l`$)od1Ju?%!WT{K-YxJL_O_SL%KGTkgC4a-w zXWyZo6_EEImh$`mkGEIq3GcqC&ghh&{?^lO4}L4)%=)5C^lE+KLePdbU}nnsf2$v+ zK5@ZGWeaAe(V4jOE%n|I`+e@T6|fEIm~wm<pPvKh<t~v_I|S4vaufULH^g(%KMm4% zHpq0P-D+{%xY8j$u$|9Iy6+e|$EJB(<DU!6j%9F;LEB(sT;@Eg8P{gi_vhS;<eu9L z^f|vv5&!n%!n+IZ6x>n$`|olG;Bt#P<(MS5s3Xqwomww6^m_yEx$ltreV%@oSHyiP zk?wVJzf+|9ZmF~0)cu0g!?m5ck*i}YXQpdq63r^~JiR?kzmzaHGYoWb<|o})Ezj4a z=dF%At_}}rL%Vkst(LNM0Q6^d57H;owN%qJ-TlH5SKdZx|Bkk4-{aUSB_CNS`Jj%L zU!?Z+X7-Zr{wd*6Us*fAe><S-I>l>89PZaJ{v8wP(c{4yc~&vfJ(+v4@-|9+hqk>q zrgs%>ly~T*iN$j5A-!U?v_a&Ha9#2BBiX~09kx*=W2F7s9~+NwJuEsZZ*;_&AC6Al z8;+hvnTnBqu`T^<_=%$S=;+M((Tn6*G(sDB$9acauIArNbTIwkIy>Y<jOY)?eK__! z(Y{o=Sj~H%qv`JbGTza}?Gf&6o3>Zw&7tNyo?;r@Z%(@lX|C6faJ=PI`+t;uL)tz= z8mCg`H?rE)99){Vzpc({MiP79sY8{`rGB4sFI@#~-EEAQOxc={3)0@9n`iW_d*x(3 zb+J8LcIUn}-gf6D<h(1dL&}eQ@OS~9b3z^QVff{^I~Tv)!)V}_Yhro$9TEuBMyVV( z57hStr5ULAgsnBjGuit74>KRG($&(23Da`ApFfhW=cITS(GWQwPuuPbrH#7$qSdd} zOL@52vW?jFKs-O^0a+G~?Xxj%8tMwCO>>2Zm}v|vdO)_<VMS}=8HktT5#EjA2wWG_ z<IR_(Z4QsxZ%8?5@<TS9@o3+3?uRJQ`}sNU=icOPj;(UehWSKUo-4>%uk8`4Gl_0( zPxc$+^DuczuGM$niZTvCefuz8+9~hP^~Pw!V<Gg_g;TiK@AV_(d+r0DA@?Iri}lF8 zrrI`uTrWMBu5Qjzcq5>Fi#*Soj^B$uC43HOM42~4hfy@$plQ0{Q)#+N-i0jBoke?# zn{``&aB@uVeh_g#_%GsqP{(~|+-~3hr?Q?FbaSpw-Y@E<t)K{G#+vx0GVb2XM*69J zjV~Pe3;IHP-MUIQ%Q01Y&SuE+FGc(5^A-0URrh%m8PYy-gnPJLMF?Z8iWH$P`>ppy z((^XQ)7-v@tLSd|K0WVldACbJ9>=y{>Na^nju|;`jWV>Mk1R^r%g;W&#JpDra*lKN zMO|Ctc|}{~zU^UoTjaj&eBj(Xb?2Ia=K-#;Bj>o%DUPB~FSy3xb;GfI_Bn`5q4qrV z)q7re{`Ay)=ttoqa0lV`!|jFZf_oC~zq)57U;pOmU&H(k`I!S(57!FU0k<A547Uqz z-!+cJy?5sPvRwb0%X#LZ|LyfZ?!oH>EjuBHC|^F#NtZUN*2yvUO1)-zUwnXD$U9`@ znp)Rlxu#Z6ogUw$!B6d%RBO%Y?#{!Ge4ecgs`~?_je9wd`j+&=du4N&a|Ft^=D%7K zHSmw?a9_v2#JZ?C|5u^r+IiMh_Kp9Bb<rIt+m1HSBfU?Idp~$KFD%y#+rVQF9OnLO zu7$4e+B)<CeQt*Hh_q+X#{0@#DlFF>gs}#C`T98bC}+B}BfLYXk34g{RqpNYEBkc# z!;j}@N!wEP3&5ml1hmT2Y4^5X$vqot--1`ti}Z0lgnz;%NJG*rNq3EC-qGveu1}y* zLWlnh;{mxYZm4zfjKO-2PuKfd$|H{N-1kYF)x0O+a&@+NvntohUf0FVy;Ic1xyEeP zySh_Bo$E>0ZIyfJ7k(hTrmN5{OUL2VzZog>j`n-aONH7$V87>=`@DExD*b;E>E#|m z@Z50t?}$jdA>Da5Fubyne-rXF>~F%G2Uh@B4CjHH30DSJ0T+Plfa`?Y1$O{Wd?>v6 zaBetb0?$A=W3>OuXRbel$E$af^|QQR5Pp-Sy_QJy+jyq^S3`#@N<5E_5wp+hGg`!) zPP9KGJcMWeKX1MpJr7~RLulW%-)IptWisa$`XRh&E8rsS?{HfFPKV`B+1YQRko{3V z=lmh69HV3Qc?#rZFw#%U)?pn^=)DdVHYJ>sd2-4#6iOc?txX%<DSP8V|BTqoh&rR~ z5<}(qWb!o`vFFm1z14x)88Mz!yB1+8+;~rW0D26?^BY@0_ib=H;C8{~cof}>@XNhg zWgglyQg+R$TWr%j@Oi}Nbh^5og&kbC9mITwJj(u;J7v6Qt`DYNo)H^!jg|h-d4A-K z@NW4#G@O4R5BNPedTYFA;`7~3eGZi6b0ID2!|8#J*uY5{v4L6hyXVm!$wcT!qbWNw zq%66fbIO@0Zzj@+sCiUp`cOF^m5~MA6i(iM>QOdqdpwA%BqR3N<>6>(S~z;)m3W>+ znyUO=g)k?PzteDM;nI=6Y`7daH(VK9XNqfuYlB-0w;nD%&?iFvN)KEd8B4wk_#$H@ zu8EA2ziT4oFVgh&w|h>62dKMl)7@(#BG4Wgru|;F`SpQ*A=mE%;J?5$=Rh6ig{1Fm zlEU;+X~}y&c#cTk`4V_Rt}~?vB2m+}gKreZN1C1vIse)b<9kP+p*-)KWzwH^HwMnk zh|!ML_P2SqvMn|+vy5v}gVHL(4hQH?J0_$**QlKtLzS%?(02?R_mk7Ev5EUsR7W_c z#c<NrkFKw&tS^LReVOmBq3yGZiU`k{$@5^Lp)uO@WFB8Z9-aM$Qh(1f^Vil({`z*Q zJLXy;6P+0u7`tUe=1$aSzPi>8rtBV|?zeeM?*FP><BFlo=@m0#=%eJi=+8b@^I1PZ zT0KS2cc%>kU6KE5(^g_k+%`B<tOS`mB6fRGuAT`X>#tB{10Cp#oTkl4&dWJ4j-7(B z<ERUH)_h7VVb{XFCg$+AL*JO&?Eqg=7KT28d_DW=E{re-;Ii?|aqwQ0bu`<C+Znko zeSUWVXx0i|2|FM|-&XUn<W(oetpn53V#0~KnHi3LO_$S<>xSvEc9gwM<aD?7j|>XK z_0!)t(}r}9K^ai*BUYkL*_IgA(SJ~PTNc8?rK29wz}qYjW#QzJk#6SAQS6M2L3)m~ z!QE}?2n+Wk_v;uZq($0ATQuEhi#ZK`x2oH+1#)MPDG$wlE8}g|zS$m}Z_~!MD`Dql zr)z(dcRH=rcV19$k>d}qI@di-m(vW-c}vbu|3<#=ko&L5hrEk6-Q5wBcGkEL%X6PR z^TqGD56WTe>E0<`iSi!$o#Hv9`>d3S>VDzQ_%M0?jQcP<r2U)DHPEIeIm9#1^z?Y~ z`|+Q8j+lM2)Q#l4p?QzHx>t^OP_v!n8{BL53h1=Ed#CZ7Y}e);AWElI`+0>e9j4LS z{9bR^r0WxZ>N%0E?Sq>3q#16-EM>#mWedCQPgWf~`X^NfPEW_+bWev<h5_9k`;%om zhw0R(*qk-bV#z)A@=O)?2kh=PZ91|1)S-5{Uy1H?cggc3>H18QF!vqc`&S|y3x&JG z5p||c-YX&0`s^mqW8oxg|D>{y8t&#Anaqo8qq>7Z#x+-s2ZY+EZr(-Bu`$cJ<WCl_ zIous`Zz1=-)Bf=;_w&)6#vXMiv1fHW-%xX>>C*mFhs@`8ozG<vWzWsb8+pRc59a;1 z+6G??`57Y5X-~52aqH!Iu57U~PCFdA&^a^ZJpD>#6Ate$a8HY6;(Z46)@&nXzrR>7 z&+{7Y^*X$=3n?+4xgMV5YCGo}GrZG1Bxapa+b#Fe<{E8@b#QZi{G2nKkUv8`vtx1( zj7!-DWP60}oHbM|iko_cxrV{L$kOHy=L6)JWWGH2BJ05Qy1b9;*V1m3<$tD^^`B3R zhjARR#o-Vy98QhrluaL#_74zWNdRqy>(pA;nCX5n?i1F08sp{q`2VuqWvk*3$-7QY zZMW{S<y}2&UoO2Liu1p;tz_y^oU>f#aCm)iPr~hiE3?h@3uzzfzIdkGZw_8SU488p z+PD<Qc{WgZ?oYHCE9`TLur;r6ZdM%6^sJZiZx?uzcMhflOIwjP-85jYPmJ>n&lY*# z`*8Pc%?In^$}azUNvH2qPxG#kc3?^G;oOIdap@aTX)A&AL_>so%~0+GGUdLRPKQ_B z=OORyu<dCGaBZSO>7ulQtL8*4+UKBMC-yXZR?0Ik+{c}XcEB?8UKfv>dwf<R?<?bS z-WYh8!S=NBoO#oLuB$DeONnrJJK#3;2yZ5S3s4sa;r0n@e_O6`u1#RGu3j|n23V7< z7bN5(_=#tmr*N-km$DH>c`5G$r5$VZrMujRqNe_4+T9XeTcli-_W|j>p1(at`zm{) zw2dO?$r5(i)=1k|6_c!e`uxTNx7fN{rknO5d9O(yv4DH1vqUS>_PiFo1mS*qOxb@_ zwn}f(cB(eU)j583riC^xGMImDUy}ReIJUQ^EARLrFF|L`tawnS{Zr$0dA5yqsyOFK zTRJ~=zu?#fec?xtwY$XY(FcyHK8QRs{Fr6uQr<0aRN1-YKGh1hY3FhQ?+(h^WxN)p z-obbW)AldoYRC7P9*?vK*~YkvRlJ$5HL)?p>>utSZ$~*Vsm_vYlzS{*I;!^hQ^#YO z%yP!HP0VMHDqB+KJTlh{5;o+*VQE+YXxG;GG|=_5_Ycu*aT9G?+<j1Njc+)r&PWu> zv%G6!PrLU<Gd-K)8JVQZra0?&!7*hMs;{o^xyO_ZP}&E*;h5SV!+ovf0os82sT;fi zegEce+8SFO<9SrJ+4<eccKL4v9ux?7_X|89--Z5-G=I9{prpw&M-{EpwS0T<sI|Aa z5NUD^iZ-jbhn4$T4;@kGS-wG9JTdavGZ}Kzp=H1SO`9F?HZ7;AQ-U7~D%4#I+?((X zYmduQyTpO$`7GZ|mhH7@9)1VwdNb`Hn)SwVQ?`GrN1aEfeB-&)Y?S@k!^*Z4`Ss8> z4zHN(@FwaD`SNkUEA<0UTYPbwxj%lBw0*()np1&y-FhBe-CvQFp=t3K(#7>ae3#fA z<@~ogOUFKXtvr{LqtEj^dRXyDE%?U=R}bf!oV@SYywhTrcvYUyNnii4+-v&UQAL9y z$kZI3Pl6md_Hm-Wk@l-N_U!88@X`(#&t-Bvl<s=ysPIBAwsHNaP2Tf>v8c4C#CEu9 za8-nRf*hk(Mb_uGN5)|MylQTH<efjOHg|%*!WYr|_%6Gi`EYNJ>-+CU@QiLgXmI3X zb#FFl&a&0&@^P<_ITud(w?oSu*)C`o&#TV6(KfgDM9&G@K;U`C40X1B#FK^lqxv3@ z5v?cGIUhA%P<!>3IF!vy;eJ8tBvO8(&uBB0ZhAMqDV2H_^fP&eXJcI7X`H3@;%$k` zyW#LX=RBoe<65WY0FBjBc6LF2uRvM$d!TPmafoyJMm;C;yzc)mlk)L3c_+#x)F~^} zUX<ak*|Dc>deCt9qWEbc?`4v9Dbr**o`=2$9aJcr%4hNH)6ZP<sKoPlY40k`{Upc# ziSGxPb}dofZMOLNj&YUQ;+l)+;jTrppTB|oU^UHB%jEOOJ*m;*UUg3@&vB|b9C3nv z)PH$T2Je<Jbs_ej=K0T`=zQ=@?{MgQLZ1~(=vjXpcWhfg@j_puvjzSC7S!98FkG8D zD=E(xuzyB;WhWBn9OSu3IgcQ1$*hh)d)(6DGu1r4<R6Eo%kksZ{%P7te2e7{+%5M? zii*{e7Ox&BpKRhCF7j@e(u%cGFZkKp%BE@=>V1#qgR-f~_q=UKd))3(dVsv|*7e-s zJh?8oO7Xh157&{w@!}Yp4O2ZwnP%E?sI}>N6^Z*YR>l_^DR&)YEBRAw+fOL@IVD`0 z)<?eGWA2|+b}pFz0Ll@9Yn`OZWuF^fF4UPj$}Qd%blrq-cXPLDd#m8bIL<<DrC;mt z+P_<x@*U-rPk$G(eV2pp#ygVl@-f#!Xm7t%m&5Zf^lp>aMtq9i{WQvE*S+0#-P@~l z?{uwu({@bGc@FR4Y=^f9zaF>>xLVY0ty}GzRC}b_<=Q6sEAy{vK7r@w9)7v!1m|IS zR+@W&l`e9>I-llhkKYOZ{^ppT`}CO}!ez?5+#gqUCXVk#p7+5q@0V-4&+gvFSkxbd zqT9YdDmtrrUL79_S##iH>uk_a$Qo(CNb=(947*Jl##!Jo_3z|8#q5iUWZOv|@3?Ja z8gndLlyc9Mu!SLyl!7Np^|+jTT_V%G|D1iy98<exn$|wpVYaqGKH^^0y&lyL_j%O5 zRa1u1_A2+%a-6~Q3yj<6*=mi8(DxM?ok@ECOg)dp_ZhbLZkH9#0i379xl_Ugbe@<G z=81V@z7qXj#a5}8o8tuD-$;3<XlvW!q3P{N8sl`vdGB0E&Q-092W;aT%8Xju_@)B5 zB58b+oKHo=HF8Wun>jmOuSy;4cIZ?^GX74<hb+&2-FEi&hrWb1aW>20-P_OM-Hzva zw2Kn_wxPU~iF-WBXIF1QeAGW$UD{qR$J64zIQIhc-UD?OO4)Jc88+TaBljkQwqBQ6 z*BHyWw#xC`d9vMgN!_Z%u<Fv3>(mb(Gwn))|H+@s6Z6JCn|(L?amqeZmYaGP?<VmM zf-8iZ3&(vKw7U^rE%$Ycww2o6K?iMqM<aWceFC1F;ko!jdzFn=!y)f*j^^IBHU7q4 zr61=wq<xHTSLN3DD|_WVAGFV@Y_cPr-|nUE-x1&TZqJG7@tzZ>(f4IwtZ<5Y64zP8 zLb;cg@;=L>bY8XBev{N=vOQ~uW{b5MuC}$YJ_!3a$h{|R{en~9E98tRom{vdN}M<1 z-tuWen6fjA_xYWPs<S^1El13LHA|mezx5<_-Efrp@;gzrPw`9o9qaEX-c9LIX|+Pu z^GtO97$MH$m%QS|yX}+J8R<Rv-Gz52@yq?>+-rVztvbVQppOW{&x7B3xR9-{nUgrb zx<T`k+@qM48&P+(IhB4sg7-7fZaHm8%#9^v;Ru(jBgVbA>GIsUn!8*GzTlbp#8~BR zb+^WB^nLZ(Uc|h&ua{?L&%ag8YZc+!GSngWv@3qx!}}ZKPPjBaqYamg+8WPy&xY>w z+>s*0lW)w9rHN;c6zo>{qF=W0+z|tQiwpb5=MJ15I}V+rrz_l@aZRK<A96gcYxj{G zCqyW_qt349j-27#E#94Wskj|@cM|W+u!n8$F?Q%aX!9d)?X&rFT+n6nr>zTRH*EJ2 zjy0&;l!6Yw`>5x{q9<m@j&!TFINFYweNni(RPTc(-&0?iOnc^W*28P2J~qPPJ{Z?J z&IqS|Prgj^@LAsHkyXkyvyarcZ6w#kr>eSOo$UR%r{~vjFTpKXP&D{y{QeT|8MrRE z-Ehys?SZQw?C?IrJc^pg*9LgI|IpJj$-WotcZh~*{o*68BdI=5jSIwa@@lHRq8x4e ziQ^`9zGi;xSIB#oxH&pih|P{ndG_+M9&t0u8g57aH^}wg^qVoJ36F7!@a3K%TjLWA zuKoP}h;X+@3=x#~Vqd^<uWMx7a96|%G42`>Zm0cvyz3wDyD1#KbW>Q~m2=5jWxx0~ zr_!&ogu;V({~+q(p+3$C;~B*{hnekB?)wC-FQa|szMjqq@^cyA0Z;7f>2Rk@TeB*T z#f;Od#^J<gArBrBDn3WC8e3;9WSsII(939-w6Aw##3AEc5CxvtXKx$tRXlE<LnYsH zJ>{6xvq3x1h<E<|D>@Aud@h}+ueja)GqS=<L=n#i7!@&-Zj<JPqlFX037V09q?JiK z)9&*aO*a!iCoH;M_TQk{z!aK2p=p+tLaz)Py_`0B_4TfH_o;1*W`wIE?uy>)`frZp zx_&_X&+9tsNY3}l|7Kk`a9^vqiTg;~-A4b_&aUvvTAmfmys5iSqMmO`spp##^-LQB zsr5`b!TorB#FwLe#r*pmT|A=@E~E_Rol{=Ui=z)<{eJ;<ett!J^wap@V$ib>_wMGa zdY60p;2(Bayg=*$4Y&u8^HH0ez3@ZZ%vc{gUE5|(>|>)V<M^hHuEd|$ajtiMGEekL z;fX%riOju<Ckisb2b|LywlA8N|6=q$=YR;~+Td_R)~BUK9IpE#j^g&wj-!u6MioC6 zp&c;9dpBv3wEslh%Do($<-O|$&u;dQmvr@qZap&2vm(Vj3ncD8CiMc0XD$-zP8)`$ zZK&b2W9Y<qRm?4P3=S8jO$-<Q1M<}AQ14c{!iDW_^^W0D4kOK2HR@43KZ@ta@I1=l zjgE47j4`9|9?y^B`7u1pv+@&n4jMH$Jcx6}9LEgcUe3t4xX+>HB}CgVkJ@E%9%XTb zvV~R*S?unb9pf2s5ttu)P@Yq|iFY(_CLjJQ9z2jLYuv#YZFkQD4bHDd{8BDg%d;z# z&BInfHV@|e{_$D*9DrTc$+aKm?K8H4vQJ1qv#myO9+>I!Oi!k3!%^D!HjJv6%oljQ z1ibD+UFPlvM)`-W1i!a}-?xXOmu*+PP2DptEM6yGjXZ8fd(XG=IP*#Vc4+>#^ESWX z{kSG?6NhvhnJIiN<FUyK@^eO8Rm98_^;YJQar{c>%bdS0*KyJwdcl7oZ$C)M+x2EV zy~wj(^XILK6np#2J;2nJACPk@pgZz$c?rja{pHxb6m`zKnKIGmqn&M@3EnGh>o40- zwitYje7J`7`x*PWg{ksS*FE=zGyT5M<NH7c;=4(Gy5>jvw(X6uo{QMN(N61`Pvm)~ zk(>|SP3@zc^k8hJ%fWEuV-Mo@;QK4V%NML@kDgx--kBSYPAm*Z2N&R(wr|&=|AgG^ zYtl~e{G5`T^F*@T<Q;f(NH^$3o1Mu#C1qUri^=^__=`#X5#zW<B+Jb|>NqLuQu*uC z`cm>)R&iT&4CLm;dnq@ci)QD)kdT{OC^xgSmE7FBPRY%^J0h84v6P#|y~s_TWA9_! z8tL1$FT(w=Mf!}}d7AbET=OE?s29?>5WGU#4l8VzJX5?b9A&-Ge!p2a*<#&M+S^YP z8;+Xt_F^q>DLWzi3O}o?HRUtqtto4}ZL+r7CTqL#OuH9$dHWaI6&gJ_hBO@~9fJ|B z%~g-zQTRP6fJK|jl*JBV$zr}+H12jIRM+5dY6;z9EGqFghMJd`2b$^{Lz8deiL>dg z{_2*H->7Uf>KZDS_>FPK?RBAA<NE6t7)>=b!ViCjyS=h5WJW|B3{^IV>Kd0Al|Emy zKN#e@DOK<^LQRJBH2gB^x~4{>GGvSmAm+-dCcKyN-#ShH)-@VqeMZn<-PGs{@*==F zO_e^Q(x|Dc_ltTw%RJ7Rp)waV8k<5!uq6;cJboX;&uUy&SzqTf=8tPeB+Wjig?tD7 zOtQeJYYeo6CK+R^8Fp%=EnIa|OJgW0be1fGDvtT~n#B81$lnl<rDL|Nczl(iO1{-} zn8cDUVm48<c~h>x1z%rw*=5GfmCcPH*C=CJt-pF{u%*GMsjRDSX(qv$Ccdk0EilHq zC)O`CN+zoZd^?>LX2=SgBuk{zF`6qIm-zW=oXp{;(81j*qYf<(Fnnv47+akwFI`;b zZ?0+zDmo*++htksUSeCl`kHQUl<yjve10RpY(|;aXlgcEm)~*yjiuACzm#EWn}Q*u zv9baFv%KcV@L@&D_qMvS0w6!Abw=A@^S^{IE>V7=noxl8%S2`R&Hme3>hLkR<o2fK zrR2dze~6DP(+o2`qoFPsgeP9M1S?4@Sp>#8Kj5#ftEuxR3Tfnz4P0u}DfUwJHXh$i zt8Ba^q&~Z3Y*1$ifAc^pMKdca4gQ8ERFsY|ONNnUXF#N6))RPHENEmMEorQ~10Jf? z>B^~ZWddKVZtw-aCdBoXjr5x_XUhDUx&eTmL9u9Dy==SMA8n_mZb?gXrEF_U{Q+49 z^_9vN!q%uz__juVJFBrSR0nF`Va7j8=41ZyAo$!^G-KBMTSOhgFzljn)$*Itx?rHb zayb(WL6ESKeDcTSqq?B{-u`V(v)^wls$2%<udJ%~-vatn%Zvw2dGN_G@>|9=uEr>- zsjm#ymXq9*jdArxNxi>uNvL+RnBH6&G>c^Bli&FHp7Q0!X|q$kk%grUv*3o_e8E4B zDuia^L|GCtv!=PJ;ZySM^Vj=Be$uhZC{Z<1PPQo5+%g%G86-BFiIRbzA!bxF1P_>1 zw^>OWl|*?JimNCiBP!SQK|(>JgzemXbBlp7dh*|*6aq7Qej~Z>z^i7Xq`9)e3etFs zQNkijW<I7h`zvkTil~-Y$-+9bor9S#0ihcjDjR*eb>Wr4?`vA>>y0{-NhOCA7_t)4 z+TaD&lQ~T4cj_#rUR2Z6+)#-=&(?a3pd=phU`(mfJqYvjscivy0!fl{B4xL1)RQP( zTl2>TFIC}8IX}tp`IpsI`>nP@(IWHjD=>mhkWW=)s-V#TMxtMp-+-J#lYs2-`=&NE zh0NbYRh89CTLQP3ST}gcx>@rLALLJUNVW0l&CL+Yw>Q_xj#(Ai=MPpl*98zFsJh{# z9D_H_Hm$oQ^7{=GpGkj;EUamOu|d9?BiToJ+d3&mYIbo_MuA!R9iPXJE4&ilB7Ju; zdO6!u>O+>W-i;q`y%j>sS+aMcivkxWzhHZ}vXppj7m2AKC~B!TVJtGm&@K9XP_k5I zb*QDXUiOl=sD6?CLv>SNxoW3qiR420Wr6XP7W9ZM0Uw)zRZI5%&};{l%}ZJuw5-ux ziq8mCqF4|c&1Oet^^Zv`jhs!;*+xsMs%w-Snk7VPc)Nn4svk9=0!Uqg{h!%OX&%6v zP!koN#w7(t1ItrI8ll4s)mBQ)t-7|dS$2w4ai+|>Vb%@TO_Fr5r$!dXhq|~~iGH=3 zq#0Z9Gpd${(5z+GU{YS{c1i?7QA3-lLK9Ca2!cY<Azgb7J7@Y0*Okp=5fb5ye5nc< zqpndp5nI3%Q--rnR6h^J6&+X5?EeGJO-smO=$xQ+`IoT$kCW}XvJSmgHFXl?x+Ulz zmCzYvLpKAT)9jMt{iIN4duCix(LN`D^4IY+^d3gB2HK5cq6Du=8Ewn!XDgkVCPmk$ z<w^CJy@xQ{nrZ~4vTxLNK<bnCnrv9rsr*j2+(qo`Zb@mtsd7y6Fl1$=RKO@#Rh)MD zG)W7V)-1)pN_4aMDLVRi14Ei7w93R61#D~>TG(D?Dft4)-&_aHT6P(_qZn1dAyKF$ zs0bnTR25bZi>TJ4E$I#cJsaMtCgHEFt{pGS&URSizdcD-wAl4X-Hl59w58EdQlI3n zVpk&g|8n(G$WBB*+uoOJ_22Gq4*87yLbu!9Ko$u$)yq-crAgnKL&LEsqm=dN#zW05 zQlF`*te3hMn>sNGHgTc6L{;#`waPf2fTWi?0J;;<PeqJzi@&*nQq8XhjvR$8H|pye zWmSsFlMSh7rf9)UjrGfgP1TUy0Y6xv1hUzcHa0bmTh>&MkLptt>2vy1<*UYf=W_Kt z$ZbEe0ky*niIiJ34`Wc>3?VAje6#)6)HV8&BITzHt>iC8(Sb@R5Nc?d@JJ}9w!$XZ z)h{#L)SM{xQa=mr57oLEXRx}wK7fjtHp8f{#1Qdz*?%o*LZw#vmXFG^+RXfE#vJc- zDk{y2Y_fjF%JG`|FDoHG&{3fwPMbA9%aSQI{!n$TS-85!nkMCkCWAiIm_fx&WuX~O zdKnss^dAofxVchMo5aw=IvJ8&HC~QImPuXHD3Jqrsd$Er63u=R))^(Uyrx<@uGT`b zd}f?Yjg9CM>Xy}ko6yuK5CgK86+%aiT5D`+r~)gZNh0G*{UP>;Ds&=6gled4HO8QA z1Q1k(GZr<=>4gwj_!f>Ypf*^eUZx?(%eGhM00z-XWkV*pTxs=soNhEB0h2eOdWWds z%La<xHFUe*-)QDikGZ_)jS<3B1DXPoTY~23H>;O0sY7$=KgqChY-M7C#0dJEDd-YB ztK&*3nmI~V>6!G`VWr+Q78xdCnP6RY14Uxce;bFx=*w9?`Do;a>cHk`Z2DUWKR+a` zPkK^n;>X{L(&?!ojPqNX>zZ1EC>?}Ib4wsJYSbuvxJ>F|h!oMY<*8W_A?D8elIGt! z9|T5S&2m$hv)Tb<0w;xJcz5B%%ZskK@(aaRRaRB|{56sW?m}_nY=pz_bob?O6U9_K z_ZHTAH)ZOy(&;lk>0JpYuGDx2{YbMMUhusE0Xi8ODQU!D3EW+x8m}3|-Aeh$cIz%) z$S;)C<v2yjU1J5_RSU5q%bsrU<?1b8w@%BFvRuXf>G5;+ui0-bZ)!1uob}3IKB4i_ zYYj2ArDoAs-z^g;PODmK)EpPu0&8aiE2z=mDrdeB#|$cnQrN3$x$<&9L<B~p_4Sh= z$qi@+enwK`S32np)61sJpEhe2^K|31vgu`%|BXu<n{IDZqEeXiQ%xbIW(ZMPT}_@{ zRwp|J+0>|8EH&hS6haAuPd#G+W~=u5eSX>J*45Yhm!Ora$uX;;w&?Ui(6NKam@%tV zrCC`orLL)LBKyG>$V@0&a;%hyLN);KH~LmNYz%S=72IwLM_mw8;wOd;lxNLNp{DAl zdV6VP+EDfCp-3P%Qjb?8LtXjCoBy%@h8~2%B5m34nh8MAo9(5#rd$gD^6HupH7t?z zP7PAM)2^R3Ys#dAfC<)v)?<AMd9UVclo;UP!<6$`+TW|SWGjT(`6~Z8(3w&`m+u!y z4K&#YeX8mq$5}Nb^*A*>16@=O+2xQytHr?<h)YO4s&8uU#~#L1;Zs8OI_^s76Hr9h z!G)R(b51JtJ##)mPdcUg=_JK<VEyL0>I5IFd`-|AJhDf%#XpWLAO)gG=nlb_s&Q%} zL{E2`lOHlnDK!yDbqYT{%TZZFb<D=oscmR_sMg;MeuUI+^i9gLFeLOcVCWy^zUF1+ zz96)^+NKuBX+7hi7;KW3$O(b0`D;OARb_o;W3}I>Wg66kDH!4|X`xWp3a{*bppMrz zq5MG#8TMR)PR1eUemT}18#EOc=!KH3QkyZ`p{-lA{7t6UdVn5}G;96m+;BDZl}iw+ zTJ?vPKUz2BXk|-%XaY4(87!g6CogCSYktvGQc)d2S*wkz6JRCicVbaVs3}laEf;fU z`s)K+V}ZI}i^prFo`DA;^`_gCv?Qqz-(s!*$bnv^8ZTArdS23`<`c~~oISLrT5n0@ zGr!i~YWP|j0+-@*HJ1PZm6&=K^pbhF@djgsapQ~`w<PAS8!*6uDi21063aFs9|ZMj zE?t0;%t<@Jxe>f$9}8hdO33=7{;lg{N-$UnO^8!({`#f>iJSO(euxVAlzG=1g@uJ~ z>Y{<=&2>v^F|wI<sWB0Qn*#p7uz*xIW>#Y0F{`n9d=}%KH|6@oLd!MR7>Z<Uk5#sT zl3d9eKh}MDVmS+9#xF-Qw@#B<Jf|Gh`hlv~$wm^7%+ftbVm@^A*x+axo^`>sI8&}j z8p*{FrKBn18P_tfW`{&rlgpI;o~5Sm^g2fBoS8XSP>T98Zm$J5EHbP97DoR6)EXe= zx2%6gK3??&P~4iD0zp*I^!d}vr2H^ff7nNI_9CF!LY9q-Q(RW!@H!}I#W8mN{2OOp zI)T4s3+3;$DK}hdYRz&G-t32@@hkdFn>S5N(~}8GFVxzBT%80@Q7bGkbVAHhVqL>n z4o)pg^xPcNN*z^xIgK)nf=^g|MGb^HhaX6DLh^VH<8j%Q1v$dRhY7KJjvVIr?9()L z7OK3w#TO{2pbj-L4kC(a*-?%&e9cXPfSi4l!x(DSdU_5YUspOcF>V6UDYL{9Usbt$ z5SDK5^H;SjF{d6R!w5k|O}>{h*>6m}@kS_0Nu#`^(KkP((3sQ9*h%`8H!Lr&3!vYV zV$~drBn4FAln=v>4UU(Z2lG<bR4#i+#-}m+0qO{5hU(aOYbx2RSaVQ{zDqzGRRYRn z4iwFz*U342HK3j4m0gi2Fp_hbSV(j@ooV<>*MAu)e|`SNU*G@XU*`YIfB)N;AAe`> z65juvocKR~|G)mr(#lPKsNquG5%?RI)j|1^>ex68HtQe=3nxx;7f&j>vcUKv2B4R_ zrS3(U=%3aUG}zGuLoHQ7W6`p@N>dNMCGoZG8)HHuF6g+;od1&(gtbNq=b_|;V1w~h zIV@k1*s}69zJ_K?4al|%U&8LWJh6toV#2t^E5@mE<zFMbr%S-UlZAH}+&Z|u9^qX) zRk>4eyvLD$JKBY4o8}OwCpeP$J#+2gqMKUP+=%(t_7&mX|CQu+(bGe#1=e3ltL48R z@uvQLjPM_)eDhiUaxPS^c)#$bA3!-?VLGE+=;hrVp6_^Hs5lbHTzTnzUwm}w57+Jf z!S8<;efPb>!7gWT;=Iv6nb$e>!{*nkuG%oH{i{Fz@?*bzb<1--@BgX0DsNhmk?zR( zv+u>ww$jyQU-{1LpX9IZxA8CWmp|C?{5`MDzq0w_LFc>sys_+WH5+f*HDl4w?)dKT z2aE4~`@@fqeCv&;U)(b@zHm+LcUwJ~mBXC*V~Y3v`kgoLJ@&-kXWmu!P}cW8|ML&N zeBg^eyW@ec+&03Sb@`;hm;Lh(hko;`j~+R({NaV)y!sa-zW<-~cdj@*=lR8>3(`s| zvZv(!uXq0ApC^C&+dp3RgZ{s)y=T_99{l=G8(+Ki^bJEMPaHq@!oYy7J<q)R$G6YE zJn~nQp7_$%*8f<0-}hF&^urU6X8(TN?i=1~inh5P70<f6jdbr=&y2v5il4V{+VIh1 zZ~ge1=W<{DM)$4n|IoR9@cW}*nRvz2oO!ob-PC;iC%^g5_KkO~Zv5cJc)@GuJs&H2 zE-#$3GQB2roiDE}qx28o{m0K9y7S2g%a45h!_U1~^2Vzd|MklI`s_Ua=9*>8hR!Iu zY0jGszaH@S3CH$6bnLFXfByaNl`izp?9+NlZP&19=Bnby^1t?*#ecZ=#DyRI{hJ3L z{>Aq<|DxrKWnccnSI)oVy{!Esetg;elg9sZ;5+qyy#BY3|MHtZIQp$$-*fSbzV*Jv z)8~A<q`e@LyF2@$cPIDU^74weAAaJgU%mMsXSQC@c;(j@+z`5T!}uRf{{4Vc7h2rm zXgiuF#6bC+A)g1?c<1!FY}o5x>%|UlEnH-*!+Usy@P_bP3ReOrE)m`{dGLeV19xzg z@IH;-R=5yc@o?cSz;7m;pnndAe)uhcD}p<Ff$$zgJlo(_z-3=5yg7__tcq{v7~w6# zbFRh<#|m$FlEb?eZUtP<VdMwDbKu-?9e);Hx8d-*;7(nH@A?XF*BFO)2i!LPejfS7 z?>@LaaP@`AAHH+(9-ym`?<0@{_&o%-A8t!rcy}PKFq{`M;pqXwn_Gzd!F9PEUe7d? z7vFBzcL?PlgG|BiwyP9A6G3|8K(}#9jySaApKH9sn+`{RzDtKA&F0`;p6$I;hvyl- zj>*aK(D6*)PJPBt*0c`KGk*JfdC&8JCAN4NKhF#D?BL?b=jJo=1(eZ+x`Hfx8uIgC zyLx}>{{N#3{M-J<2bVX5Dy#4tYF59s<`af><!W{<D8`5UtsyZUgTp#{$mL%BTgca~ zEdeopNp*EOC$_n!D<^g7;rCgQsL!f`!GE1E{Wnr5e(0;9w-f&>wfUR8l5YzKfA2y3 z?zqSjH0fq>g~elRr^f7LVPv8r{hX%5br=q@Wt0`pjIYEN-?}NE9N+ZM7;esI40o$7 zoI!_hGi^Z){o7zGhiJq5sX+bCEeC5P(+qc)5Tx_|Us~Z@`gf2SM*r2$afsGl@@JPH z^7|VdqN`Ad^YFaHq0(iX{ZiuF-{ufK`RB%$`p5T_v2G{RamsioC$E=&{bb)Wrypdd zQ2y+kYJtlf3g-booh7_G_4llAp5W-Kzh}L&&&W$t{;WUt872Dr8-Urz9MJLK%<$-g z4r+gHhF~AEUE{9+vkx(G3k!ihEL*3KsuApip4R@T0>M7-bRUITA6-L)ccxD7Vf=PH zVp1bZd<XwuYr{M7|MfQfEBt>8%2T4h|22NwZ2qs||Lbh{5c4xawIhZ<j^FL=s@_PS zzv6fAWx{({`?Esw3(!8(748rGv>SS%_8$Q}41Hdi#`(aVw)ALSwe#B+z6!V$@_&mC z&uhon9}Ls<x!Iv~<pQ0b8i&%e&HM&|sdE=;{0%Y;^>2;uWqu}G{*M4tFZby9A9v8M zgYfRt{yzn#uHLEfZeZ%|CV#!k@*=%rjo+p}^4CY_@6W(zimmkC1unQsc-L$GN&^Y! zFn#Sm6nNjY824(N2i!SDc%Rhxa)w9xE{&%FQzz)s^q&o!J<Uq*X5cM0`c?pMvf)PH zGq(Eu1{?28;hm$ue-L<^E&Mj7Khui;Dd0Ue|CfNz+TvsR&(5{NzsC4GEPoo};dsWY z{oe=X*v2g1$4u{Xhj)++pDy}>Zlw#X_=W->SYYw@MZnn$h1aL+(+#}$M^^qyfcM$( z41RCJ3xN0Aa5;t4m!Sjd_yWL2hbe>miFV*T8{Q0@Z!6z-f#=);d8709OW?D>n@oBD zw>ALl_<7*a)nt|DUFK)0@b1yrfr$4$Zsl(f@Iufl-z-1<ZS^r8xWJa5tBHSX`Og8) zx8W}VAGDRf26(5<zX8~7!z+kw@vq_CJN1@)SO>hz7JgGY=Vze<YyTa<=>aSMPcnZt z{2Xu@aD~RdW_-YgjXzp#{P70-55V88{o|z1Z5BU&0KDxstG#^;d>D9z##vBWE1IqE zhXJn#F4g!_-~-K8d!GcnC1}Ne9q_K7+4u?gX&bHvF1FF@Yrq}LE&1|I;9+-I=|2j* z$M*gAfJ<!O?*v|FEC0`cXX5(<nxB3PoV&v6KMn)?Z1^9*J62foaR>z0o)uR86##Gl znnj<fz#d!rbAd}%VGN`F%YpNswDMaETwueu0q<)U-ZmZntH7?+7=vlt0i3tmYTtJQ zFI;WqZxe997JeJ>Oj~|_0^9-rY+e36z;0XmuK>@ng{P5}^=mNZ(($q1ExFT@KMp7c zb8L73uzQ{GwrYGaaQHs(gHG>@z-^sY`@Ru)*haKxEuR+xmpx?he>w1aTmI^SbG~Kq z+a16QfrXBLBk>~^y`KQ~+T_nujNewi=YS79X7#7P2kx|`_ZD!iEj%y$IBN4h4!p^R z|3<vu!c-pXZQu6=4%qNO;E)aH0=L?50q_=Ed{+UV{J!u;ba|%&cRpeDx3l@Z4c`R3 z?+0jqrv3#y><LR=Gy#Wg@wWo+e8OtK9l%GQu=wpB;M|>-yncxB1Ftpt4S1U^z8?T@ zx8a`vudtP`3wW2!|3%<7oBu1o9X9+&((CtD_+!93UbXNk;B|Yf{-GZf;JtgS{Eq=X z3p`WP<67W-w(n>5Q*(EwyjlRvdAvLwz6zLgdM5uh1N&aK@G9W#FI)7xp9=T^EB>v( zXKd;10M4}e{{*;WzfHc={|ZOK|7GB9uUhp-qe$5{{||v(Hry91m}A4|ao?B?56x0{ z!3n3L??~WX$1M4OS(dsd%nZ++)2HEIr1dkdVbcz~SwFLZcYFZ-P19>J_tJd`{a(jc z1AG{`K!1N5u<Ijh{IDuZ*>pG4dyxAjZTLU4lpS#s|CqSP%5N9&z8<Uoqgl$1@i3jg zzho(!#-@Dl+n?%|g)ai$Wh+ksFl`>2^6xre+CQ$<_*P(#(~;0WmjOR%`+jwQZ7Wyj z_g-MyC+*PTzXM!r^ZyaB&xU^mTyMiK_g6OY%=iy7J{yh!@3G-`fb%mQ34NUxw&V@4 z@;^LV*>g1G9}P@9VJ5y5n6|@ATnKy`@tNbh8NjrOX2w4cxQI5=G%g3Gy|j9bmjajB z;tOUgdt@eF0UWU9=bOMG8{P!mYUhV+Wt+`xZ$Ad6oi?-ne+5h%ZD#tfGQ5pGf6P{P z22Fe%n6}+aee&<XwDV?;&(hCRcJ0jc2c4&E@0mCkcpd0#>MIk0_uJy11Z)g+cu$)2 z1Kwl%ehx70H<|VGW#EN2`cwfQ$T8PIAb*(NwGP?;QNN*o#fTJtkLADOJYoBLuV>A9 z)*J@$dSJH=Z$3|rB~82y*ki;0>pV3lWa1}*i*5MX^VD3BiGO#VeV*#Qo<rxUxg8T9 zO$q<c^VIx{i3bm`&waetbM*izx)S)y1MKrA@AZ6jfHjvxyk&qIdz$!10}^v+68~m^ zoDQ<`Hz2vZ?+mc7HNDr<13cJ<&l_l;(|@mLB=8U$b`Ml@cP91#Uu45K0>5g*i&MT2 z3{1|?-2-KQbbUL-Cg409eqx}U15DuO2Fm(O;8zFA`cB}t2g>?O;KKuDeI)QP;Mz2i z;IAIwlQujU%#@dI;ZeY08!iA|n_*!$aKMI(T(W$L^sWZ>IV}GfuH^Zdn}7?PmVYJi zjy@K?9k|nm?*iUr!w&;*vElCnx7zU2OwWd223}#qe`a}X_<i7YHvBPgnT<YKU=E)R z=Ky!u!jA(E+3+ObfDO+9&b8628hDEhw*YUmmlrr}!;b>D-EGnDN5uD9_!;86EPQ~> zYzzPAl<z+VUT=#(9gShT4UYugX~P$@v9y`r_Y-d5T{i!#=x<BkJ2*LilyBbGtnkFc zUQfn(e@({j_mgqOX$$)izt<)&mjchU;oE^D!!7(Z;L|p|8aUGyp79;JDEa$27bSmR zaZ&R3Asg0z5~pcNSDL`e|CA1&rX`()m89eRxWXAJxK9dJlF!hIrkRqq&BS^_{4Nut zKSqADgGxUgY?Hh>5~II>KW)G=Cxb**!oNiOe;@u&uT<k(e*Yx!iuaU$Nc<wOuU(D* z?D1FV?@hcjP2qzGzjm|I_Za?d;Kh2pFbMfS27Gv}h5JF6cHXJ_JmL{U)EZ)XhWdUq zg)RE;yiX|Kc=&Toa;GENf0*_!g8#uXHGZJ~OyG1)PZ!cF2kxR><&^lt`uhgv@1JTs zP5+g^wf`x+VU7O-xWZPxhk&1a=v;c`>-cyh>yxc&{6qgA0H3zi&rg8Qc-4F^{dW`F z{P(jwt%`p1B`R3JWG{xiV2OV#`}ao-$e=hXau5O5c5nQEL1-1@MZFJbtLN!aNQ z$#V4nJTPsfn%@@zS2#@iWr``l+uGIq2EV@v52ZGGd<A&NVvAlaz`4uSd=c>);38Z7 zZvr+RSMwG0-v(T^R@Eo{Uj&YP+oJCw;7#AP`1b_xp*bi|nx+SE-apm&j5vEJ!hc;z zeb`<<E?qyv;eWuEpUZ#)+fY7D-!BYR^3MEzCh*Y~;my?k<-kQ~kF_cB7wPze@UQrW zmH)2-7k}N#-#3A|er%R^BQR~yn)!JQc=17tpMNyek~c2I|8vGaz~Zmp0N0m;-a3C# z;F(*IzEj~p50&#viT3p&@Veir^$Fti^HG<#S^RYV`D%Yot>y;<xY)*D6M)NpYVp(6 zz^$zozs>}Ha+(#s3OL7BzGc9}zHf!U2RLM_k1+81h(+J;1Mj)pl7CMzzZ-;?Qy8P! zet^%m32&G7e~tNRI#*t9)Ahqk1$U%568vZWneyiE@ORnhpLqf3ch;iU`M{=pW_^qS zKKo6pJ|+UE+sa!CTpJbM9lAblpuerWmB3w1YCePhw_RZMpDtVea&`Xhg#Wf<N?x)2 z>wvwpt@gGRIPif*-yZ_|ARj{-KM$O@!1Dhs@ZRB$M0#)V`!5OadhH(t-ZNLtuMocj zoco@|&*oo;&R-fB`?RfmIlz1VVDZ<5z>E8wTRxNi`S4$;^)=ZZfmalPpEZBa1de>g z%Kt*(qiBx{HEsmn{%fl}+yT7)ZmWLQ0iS_<U8w8hTfimv39nE4e~<aM)&I|c^Y&Ts zJv&V4Gp2m_9q`OU!h2N5cW{`hKQsJs;0~L7%NP#*WtP={jskYs<Y@tL?ibbkJN>T$ zcE1gJ>-eS(SN*Hd;cw;lH$k3i{~&PJ&(!=N@i&0IyOF<7kXI(2sqx(izvB(7ejWwh zw8qNcQ@|b5&($|f`T8sPueJIAdbrvjY|{5lU{9$fUyck{<L86v%Kts!{WBbi_Vv;5 z<o1>|0{zuqi=T!9Lz(fe(|9Cs1;+2W4i*1c;Qd}p9$Y&@jpt9NC)2}hU$aIi`_Gv= ze~W-KziYLJx)I6r|2lAfnwnpt|3=_-UaLKS7npmj4(s~)88GkmGWpT`o0C!>rvCOa z!p~f6(eEwbQd|2<rT@th91p7b4u=272qj<5{0_ii`0yHwp2LB2Z2Wf#F!zX=@_jsT z-q)@Ee>(8aFIxTm0^riV4!J%<>;umKz~Z0KNK5}^daHqbw)E}=-u6$czx?h<OaCU` zHByZ?IzK`Gdy(JU=<x>Av+>_y;4QZHmxhYYv(?{7;PtlfmjVZtTJr50;4@A~LcW#( zhnp<<Q<ZD=N5o$N&i$p@KS9j-eC~-e>G@Uo=h*UlPp({_kn7F#59ccS%@n=!=T1Bn z+35F+T&q5b_W>W+pw^H0{Q=-kTlxL~yxrEHzXM!+ktP2>1a7nSC)uCF_~S9P-X+@` z@TSMD`Wgv*_@Q(ATSMn}4E*bD^iQonJO7RbE=G7`uhrjpfEPZk)|-j12QKQd^qCsq zz#g^!lB(}9zT4p6x<Kv!p#O4U&la^`hIlP--eN1hO`lVHl}-7)gXOo;dpEFHYNfZI z`SV)s`OxRoeF92;yw`Iac)P7X`H1)m;oYM7Bl|+MCtH1747}qf!W+=xF9+tG1O-~2 zO#$w_)zU}GfDfa-&S+c@Tx;uJ1Hge<R{Kq*|5xE(_Cw+IXnA<og=$};8UFDL6@R75 z8=wCE8Tc1`Pk2x3@Gk)$7z}>W{b7W-<J|P!DfMsW=PbfMX&Z0kTm<^ew&*(^*!6Rf zkhfO@*Zx{0#&=%e{D-afv=I2zGPNE@+yu<MoaT746*$vYzjpp%e!dBR&zly%-w)jR zn3dkQfO&_lN$*tt+YbN5cUtB7IdD$9+W$8S>HP*c^0KAB@G|evqrzLS^Y^!ltoatk z-yaR@sEuES0uMW6wbzU2Z=<){kn?#uPnqHxLq6*G9AX}Dg^gcs26oL?`_t_8W$Fht zhPo@mOn;f7^aZm$+|BPZ9CCk@><{U`-x|L^2Hf!-k?1de0DSskt9|SO=AP!YI{Y)h z;YC(`?`8RH^9yeSAAa28j}MLH{w{kI+M|sg2Jq=NlO9%moBi+Q@aGwb>=b@DnZmDz z#-35h{pt0<-peh0HI<(#;9olH-1!5uJ+#2T_*u1nFZDOz{CCuTpWenRoy_lDmb^;! z{|?J*Yrj7Sw(C>R0~fSg^7ge+R{z2A#i5k)9ijhTt9|_)cwaB_y-cS+cr<8d>tBWg z=l$B!kIcVf9saV>s(&`)n-0u9?WTOW9ys0BUj4vbw(;h2;60C9{qr|~1J7CcO|6f+ z`2BNgeVzWDz{MD!?n((?tHVFW^4w|3=N|%>zF_Is&jKIXZl(7!^RwB~-wp!ruLOT* zDtwIipXb(}IbJ<II=Q|aW6&0#w8qEh5pTBSQO+1OADgZD<>E2wd$T_(8l&#UH0f6g zT=rXw-^{;Ko&H?-^PU`&zF!`r`ZuA!uLo{>$l{+6@Zz-=|F;3J|G<(DcLL|y(%%5Q z!zNF50PlUn(tmyd+&SP}{le@oULM2sLW@5R0e9H+t9O7)Z2WW{I{JlsEqU;{JZpZM z{CPPr&pep*d3ByOUrYHp3wW0;zREl`e`C_a{4>YHcffzWtv|bu;ae?vZT^|<{}K3S zvwzb5kLR)O9OsM|&g$^b!awgZiy!v`*Y7>Izg?)qcf)_rT~>Yl4Y>2?YQJf3^`AZ# z?SG|N{(fQvusL5%e*8S}x^EzT{e1~=_)V++rvmSpcJ6r5tiSp2-}jcKzuXF(-^U^M zD-kaRKKbIg<0VtRnOMdDUeE2!pRK)o9r$Tm`VRtUe{A(9JApm6`hAA^0lh1<|DVPt zk4L-5TI;DU+e)b^Pu_$7!TT+Jxd%A+rxv}<KU3cIzZm0-c~<z*7bh0uWc*hHSKMv! z%WU8StCUS7>JN*61CU4c+Q0eYWPWS|?y${oKLEV;W~=<>pE)1!ZN~o;{8RWLp#68k zzw;+net!X6;yhRXG2`0}|4p{}!QTPz|Ebz9)?4~-!ap;|n*TTqeDEbpfBP%&_H}B1 zx1=xW7qR%?{M(}A%en--w%wxtFknwe?SGg0<R#X6uFJO4ou|LQ@)B!2>ay{hNBds` z|MlRfZ94w>z<X@+rwTaRwq8;P9DYT3({=jGfDhei)z4kPbCz5AeF(VzO^g4(51eO< z|Cg5}_s=f@ciHrvqrf|#w8pa^0(Z<3iT2emU!C(T7OH)W1a{9mcmCWQe@=k^N${h~ zoR0$DWy{ZE;9)lTz63b`HA{ZqfrqkQ<}b|n*TMg=&Hr1#1ut6jyFUQ-+5C4i|1+)m zu2+Hg{ssE09)BFoPaf|JUsJif4?r4JmnNsn{q;5F%EEJbt-p1mdKql?SL?UIKwabb ziG{T5TrTa2^FbO0=YzE9%?D))N&3<15g)VxBtB{b+RD4qCm*yy>2hW5Q(3F_H~NIM zqFGKGdNLTTGL%<Yk;<H_(9%MQ3LjLtscZD9EHS6!uP9`JRalwzCH|0U)~a0FQ`gCB zpbe<#F#2WFQu9ehA_=4-)!~#`#&Z1Bv@`}2Q06WHngZrCZL>Bv)hA$OqcrD{2x@z# zVGr}Ut}$eL)W^B3H^`a4Q5tGSnL+Q$<yHdCzVh12Mqj<ZIVp4HtqpaFIOnxaU*@-x zC`*P@TWS<W<kHHbim#m3{zPq4JrY35MCGPcKLly^-Co)3Pn<j}FAr5N^_Mr%nuk1D zULI<$3<TBpR-k6TwAGpvL>*|WYidLlE%Vn4Qb5-6<-%_ND$v|S`!3~);LLAh6HU}0 z%Xmv`$AWf3N*VbyKr)3gmV%@k{0$Qktei%dKrB37?{An!OOX0`esi^Gs9atyt$~!& zDvkCi4f1=oAR2Gi-}~x(<%*lDYyG~Kdi_e<7%8tats0VN5I_d4X_V&d%R{xyrtM4B zoX&l3mie|8fAjJL3d-_;AIi1CvGU61B`A4AbyLHQEupE(VjOv`JXEgBuY6}UYEOKi znmnzKf!{+(QQ4lW?O++d3xt~O?}C8xEFulHi|Xd;%O|S;>l2DJ6;Mty+~qWX76es- zC@ynVPSZ8!Gh0Ai5HvPlG}cw|bNS3_vj<jms`H7&r}9DBArr|#$W5Upjhp>7BJsr6 z{8m#PY_`lVX`x<>FD@3eZ)l>cKy#~B%e7fKzi<4+FNnnZI_9~0`4Y6r`f{4z@zqr> zDF+)?3tGh;e|eDzGzG_Beg#=;{N-1k8#d5_u;;v0=5Wq=Ev@35^VSqXx*c2XtGeD_ z+1L^|*F%aJTVor4Wg$w7_9ZJ0Tu<}Ps;&5f&8mx_c{o~)3koTbAicE>u%&hIsA7E+ zH8v?LKXujU5AakkE#8&a`PlIUO~XUwG^{1~zjCzW#zudAFg5fQGBnB-Y^wLG@HO=< z6#vRBnF2lq6dh=)NpnSc`3�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 AD*ylh
--- a/packages/hal/arm/sa11x0/assabet/current/images/redboot_ROM.srec +++ b/packages/hal/arm/sa11x0/assabet/current/images/redboot_ROM.srec @@ -1,3440 +1,4033 @@ -S02B00002F776F726B2F617373616265745F726564626F6F742F524F4D2F696E7374616C6C2F62696E2F7265D1 +S02B00002F776F726B2F617373616265742F726564626F6F742F524F4D2F696E7374616C6C2F62696E2F726501 S31A5000000018F09FE518F09FE518F09FE518F09FE518F09FE500D9 -S31A5000001500000018F09FE518F09FE54400000078030050FC035A -S31A5000002A005034040050B004005000000000980500508005001D -S30A5000003F505402005070 -S31A500000441214A0E388269FE5022A82E3012982E3002081E57C54 -S31A50000059169FE57C269FE5002081E578369FE5BF2FA0E3002033 -S31A5000006E83E570269FE5002081E56C369FE56420A0E3009093CF -S31A50000083E5012052E2FCFFFF1A4C269FE5002081E548369FE546 -S31A500000980128A0E3002083E5520F0FEE44169FE50B20A0E300DF -S31A500000AD2081E5510F0FEE0000A0E10000A0E11214A0E3102624 -S31A500000C29FE5022AC2E3012982E3002081E51C169FE501104161 -S31A500000D7E2000051E3FCFFFF1A10169FE510269FE5021041E0FD +S31A5000001500000018F09FE518F09FE54400000068030050EC037A +S31A5000002A005024040050A004005000000000880500507005005D +S30A5000003F503C02005088 +S31A500000441214A0E378269FE5022A82E3012982E3002081E56C74 +S31A50000059169FE56C269FE5002081E568369FE5BF2FA0E3002053 +S31A5000006E83E560269FE5002081E55C369FE56420A0E3009093EF +S31A50000083E5012052E2FCFFFF1A3C269FE5002081E538369FE566 +S31A500000980128A0E3002083E5520F0FEE34169FE50B20A0E300EF +S31A500000AD2081E5510F0FEE0000A0E10000A0E11214A0E3002634 +S31A500000C29FE5022AC2E3012982E3002081E50C169FE501104171 +S31A500000D7E2000051E3FCFFFF1A00169FE500269FE5021041E01D S31A500000EC042091E4043091E4003082E5042091E4000052E3FA08 -S31A50000101FFFF1A1214A0E3C8259FE5022A82E30129C2E30020E1 -S31A5000011681E5E0159FE50120A0E3002081E5D8159FE50820A03C +S31A50000101FFFF1A1214A0E3B8259FE5022A82E30129C2E30020F1 +S31A5000011681E5D0159FE50120A0E3002081E5C8159FE50820A05C S31A5000012BE3002081E50311A0E3002091E5002091E5002091E5A7 S31A50000140002091E5002091E5002091E5002091E5002091E50A5C -S31A5000015512A0E3A8259FE5002081E51B0000EA040000A07FAA01 -S31A5000016AAAAA080000A0AAAAAAAA0C0000A0AAAAAAAA10000022 -S31A5000017FA0384B384B140000A019242122180000A04A994A99BD -S31A500001941C0000A02703FC49200000A07FAAAAAA240000A0AA2A -S31A500001A9AAAAAA280000A0AAAAAAAA2C0000A049441942300099 -S31A500001BE00A0CCAFCCAF000000A0547254720000000000000014 -S31A500001D30028159FE51020A0E3002081E524159FE50321A0E363 -S31A500001E802D081E1840200EB1214A0E3DC249FE5022A82E30148 -S31A500001FD29C2E3002081E504259FE57110A0E3101F01EE02F082 -S31A50000212A0E10000A0E10000A0E10000A0E11214A0E3AC249F65 -S31A50000227E5022AC2E30129C2E3002081E5D8149FE5002081E56B -S31A5000023CD4149FE5009081E50000A0E3CC149FE5082091E50868 -S31A500002512080E50000A0E35C149FE5282091E5282080E51820A3 -S31A5000026691E5182080E5382091E5382080E51C2091E51C208021 -S31A5000027BE53C2091E53C2080E50C2091E50C2080E52C2091E5AB -S31A500002902C2080E5102091E5102080E5302091E5302080E5009C -S31A500002A52091E5002080E56C249FE5202080E5E8339FE5E84350 -S31A500002BA9FE5E8539FE5050054E10500000A043043E20440446C -S31A500002CFE20400B3E50400A4E5050054E1FBFFFF1AA0D39FE575 -S31A500002E4D200A0E300F029E19CD39FE5D100A0E300F029E18C93 -S31A500002F9D39FE5DB00A0E300F029E184D39FE5D300A0E300F0CA -S31A5000030E29E100F069E16CD39FE578139FE578239FE50000A0AF -S31A50000323E3020051E10200000A040081E4020051E1FCFFFF1A9B -S31A500003385B0100EB9B0800EB0000A0E3D8139FE5042091E504F5 -S31A5000034D2080E5242091E5242080E58D0F00EB330100EB9E1603 -S31A5000036200EBFEFFFFEAD300A0E300F029E1B3FFFFEA0BB0AD0C -S31A50000377DE14D39FE501582DE900004FE101002DE90DC0A0E1CE -S31A5000038C00000FE11F00C0E3130080E300F029E10DB0A0E1DCCA -S31A500003A1D29FE50D005BE10300008ACC029FE500005BE1000037 -S31A500003B6009A0BD0A0E14CD04DE2FF0F8DE81F009CE820001045 -S31A500003CBE304404402024044123C008DE500108DE52C208DE5D4 -S31A500003E040308DE538408DE534E08DE54C008CE230B08DE50153 -S31A500003F540A0E34B0000EA5CD04DE2FF0F8DE800004FE1200077 -S31A5000040A10E304304E0202304E123C008DE540C08DE538308D69 -S31A5000041FE534E08DE55C008DE230008DE50240A0E33D0000EAAE -S31A5000043458D29FE504E04EE201582DE900004FE101002DE90DD8 -S31A50000449C0A0E100000FE11F00C0E3130080E300F029E10DB028 -S31A5000045EA0E11CD29FE50D005BE10300008A0C029FE500005B7D -S31A50000473E10000009A0BD0A0E14CD04DE2FF0F8DE81F009CE8D6 -S31A500004883C008DE500108DE52C208DE540308DE538408DE5341B -S31A5000049DE08DE54C008CE230B08DE50340A0E31E0000EADCD11B -S31A500004B29FE504E04EE201582DE900004FE101002DE90DC0A024 -S31A500004C7E100000FE11F00C0E3130080E300F029E10DB0A0E189 -S31A500004DCA0D19FE50D005BE10300008A90019FE500005BE10099 -S31A500004F100009A0BD0A0E14CD04DE2FF0F8DE81F009CE83C00FD -S31A500005068DE500108DE52C208DE540308DE538408DE534E08D6B -S31A5000051BE54C008CE230B08DE50440A0E3FFFFFFEA44408DE5E0 -S31A500005300D00A0E19C0000EB0DC0A0E100000FE1C00080E300EA -S31A50000545F029E10000A0E10000A0E134E09CE530D09DE51F0019 -S31A5000055AC0E3120080E300F029E10CD0A0E138E09DE53C009D54 -S31A5000056FE540C09DE500F069E1FF0F9DE80EF0B0E104D19FE505 -S31A5000058404E04EE201582DE900004FE101002DE9040000EAF064 -S31A50000599D09FE504E04EE201582DE900004FE101002DE90DC00C -S31A500005AEA0E100000FE11F00C0E3D30080E300F029E10DB0A022 -S31A500005C3E14CD04DE2FF0F8DE81F009CE83C008DE500108DE54B -S31A500005D82C208DE540308DE538408DE534E08DE530B08DE50D49 -S31A500005ED90A0E10900A0E1F70000EB0040A0E10400A0E120219F -S31A500006029FE5009082E5A4109FE5041191E798209FE50461921A -S31A50000617E70920A0E10FE0A0E106F0A0E10DC0A0E100000FE1C2 -S31A5000062CC00080E300F029E10000A0E10000A0E134E09CE5307F -S31A50000641D09DE51F00C0E3120080E300F029E10CD0A0E138E056 -S31A500006569DE53C009DE540C09DE500F069E1FF0F9DE80EF0B0FC -S31A5000066BE10EF0A0E100000FE10EF0A0E10D00A0E10EF0A0E148 -S31A5000068030870000308B0000309B000030860000B086000030B6 -S31A50000695870000B0850000404401004044010028140150008027 -S31A500006AA0000B085000004800000F4800000E481000000000053 -S31A500006BF500080000065436F73203A2000417567203234203207 -S31A500006D430303000E414A00004000490FCA707080800049000AD -S31A500006E9A407080000049014000290A0860100640100500000DD -S31A500006FE0050600002800400029055725472309B00002002004F -S31A500007135060010000640100000000005044020050000000502F -S31A50000728DC4101000DC0A0E100D82DE930309FE530009FE50074 -S31A5000073D1093E504B04CE228C09FE50C3091E50C308CE50C30E0 -S31A5000075290E5102091E50C3081E510208CE5103090E510308168 -S31A50000767E500A81BE9D482000020000050309B00000DC0A0E1B7 -S31A5000077C00D82DE91C209FE51C109FE5000092E50C3091E50C7F -S31A500007913080E5102091E504B04CE2102080E500A81BE9D48249 -S31A500007A60000309B00000DC0A0E130D82DE968309FE504B04C95 -S31A500007BBE2002093E50040A0E1000052E30400000A443094E568 -S31A500007D0040053E30100001A382084E530A81BE940509FE500B8 -S31A500007E53095E5013083E2003085E5010053E30000001ACBFFB4 -S31A500007FAFFEB28309FE5004083E54A0400EB003095E5013043CF -S31A5000080FE2003085E5000053E30000001AD5FFFFEB30A81BE918 -S31A500008241C830000509B0000684101000DC0A0E130D82DE924A5 -S31A50000839309FE504B04CE220409FE50350A0E1030054E10300CB -S31A5000084E003A0FE0A0E104F014E4050054E1FBFFFF2A30A81B59 -S31A50000863E9AC850000AC8500000DC0A0E100D82DE90030A0E1F2 -S31A500008780120A0E104B04CE20C009FE50310A0E19D1000EB00D5 -S31A5000088D00A0E300A81BE908FA00500DC0A0E100D82DE904B08F -S31A500008A24CE2FEDEFFE700A81BE90DC0A0E110D82DE970209FD4 -S31A500008B7E570309FE570109FE50040A0E3004082E5004083E5B7 -S31A500008CC64209FE50130A0E3003081E55C309FE5004082E500B8 -S31A500008E14083E5082082E20F32E0E3003082E504B04CE2AE014C -S31A500008F600EB40309FE5004083E50922A0E3004082E5410E006C -S31A5000090BEB101F11EE0F1081E3101F01EE101F11EE011A81E31A -S31A50000920031081E3101F01EE10A81BE904000590080005900CD9 -S31A500009350005901000049014000490100000900DC0A0E130D880 -S31A5000094A2DE90030A0E1010040E2000053E304B04CE21B000025 -S31A5000095FDA6C509FE500E0A0E3014040E2001095E5002095E529 -S31A50000974010052E10300001A50309FE5002093E5010052E1FCFB -S31A50000989FFFF0A09C2A0E300309CE5000053E30400000A012097 -S31A5000099E52E000309C450320824002E08EE0010000EA023061F8 -S31A500009B3E003E08EE002005EE3EAFFFFDA0030A0E10400A0E16D -S31A500009C8000053E3E4FFFFCA30A81BE9100000900DC0A0E10018 -S31A500009DDD82DE984309FE5002093E504B04CE2FF0812E3100003 -S31A500009F2A0130500001AFF0C12E30800A0130200001AFF0012E0 -S31A50000A07E31800A0030000A01358109FE558C09FE55230A0E1A8 -S31A50000A1C010013E30C00000A0B0050E30700001A003091E50C51 -S31A50000A312003E05230A0E1010013E30300001A010080E21B00C2 -S31A50000A4650E3F9FFFF9A00A81BE9200080E200A81BE901008026 -S31A50000A5BE2070010E3ECFFFF1A0000E0E300A81BE9000005904C -S31A50000A701800049000F8FF0F0DC0A0E100D82DE92A0050E30BC5 -S31A50000A8500A0C314109FE50120A0E3003091E504B04CE212308D -S31A50000A9AC3E1003081E500A81BE9040005900DC0A0E100D82D1F -S31A50000AAFE92A0050E30B00A0C314109FE50120A0E3003091E536 -S31A50000AC404B04CE2123083E1003081E500A81BE9040005900D57 -S31A50000AD9C0A0E100D82DE90B3040E21F0053E304B04CE20400EB -S31A50000AEE009A1F3000E20120A0E308109FE51223A0E10020813B -S31A50000B03E500A81BE9180004900DC0A0E100D82DE90B3040E2B1 -S31A50000B181F0053E304B04CE23400009A000051E31900000A0016 -S31A50000B2D0052E30B00000A1F1000E2BC009FE50120A0E30030EE -S31A50000B4290E51221A0E1B0109FE5023083E1003080E5003091EF -S31A50000B57E5023083E1003081E500A81BE91F1000E28C009FE555 -S31A50000B6C0120A0E3003090E51221E0E180109FE5023003E000B8 -S31A50000B813080E5003091E5023003E0003081E500A81BE9000077 -S31A50000B9652E30B00000A1F1000E254009FE50120A0E30030905D -S31A50000BABE51221A0E148109FE5023083E1003080E5003091E599 -S31A50000BC00230C3E1003081E500A81BE91F1000E228009FE501F4 -S31A50000BD520A0E3003090E51221A0E114109FE5023083E100304B -S31A50000BEA80E5003091E50230C3E1003081E500A81BE910000469 -S31A50000BFF90140004900DC0A0E110D82DE904B04CE260439FE5FE -S31A50000C14104F02EE0330A0E3103F03EE0400A0E10010A0E30117 -S31A50000C2929A0E3FB2500EB0010A0E3052CA0E32000A0E302C0FD -S31A50000C3EA0E3033B8CE30C3083E3013A83E1023184E7010040FB -S31A50000C53E2011081E2012082E2000050E3F6FFFFCA8020A0E347 -S31A50000C680210A0E10400A0E302C0A0E3033B8CE30C3083E30172 -S31A50000C7D3A83E1023184E7010040E2011081E2012082E20000B4 -S31A50000C9250E3F6FFFFCA012CA0E30210A0E18000A0E3D0C29F8F -S31A50000CA7E5013AA0E12C3683E1023184E7010040E2011081E246 -S31A50000CBC012082E2000050E3F7FFFFCA062DA0E30210A0E1808D -S31A50000CD100A0E3A0C29FE5013AA0E12C3683E1023184E701002E -S31A50000CE640E2011081E2012082E2000050E3F7FFFFCA612FA066 -S31A50000CFBE30210A0E10100A0E370C29FE5013AA0E12C3683E15C -S31A50000D10023184E7010040E2011081E2012082E2000050E3F794 -S31A50000D25FFFFCA622FA0E30210A0E10100A0E340C29FE5013AAF -S31A50000D3AA0E12C3683E1023184E7010040E2011081E20120822F -S31A50000D4FE2000050E3F7FFFFCA632FA0E30210A0E10100A0E339 -S31A50000D6410C29FE5013AA0E12C3683E1023184E7010040E2018A -S31A50000D791081E2012082E2000050E3F7FFFFCA192EA0E3021049 -S31A50000D8EA0E10400A0E3E0C19FE5013AA0E12C3683E102318494 -S31A50000DA3E7010040E2011081E2012082E2000050E3F7FFFFCAF0 -S31A50000DB8652FA0E30210A0E10400A0E3B0C19FE5013AA0E12CC2 -S31A50000DCD3683E1023184E7010040E2011081E2012082E2000067 -S31A50000DE250E3F7FFFFCA022CA0E30210A0E10200A0E180C19F0D -S31A50000DF7E5013AA0E12C3683E1023184E7010040E2011081E2F5 -S31A50000E0C012082E2000050E3F7FFFFCA032CA0E30210A0E102BD -S31A50000E210CA0E350C19FE5013AA0E12C3683E1023184E7010021 -S31A50000E3640E2011081E2012082E2000050E3F7FFFFCA012BA078 -S31A50000E4BE30210A0E18000A0E320C19FE5013AA0E12C3683E1DC -S31A50000E60023184E7010040E2011081E2012082E2000050E3F743 -S31A50000E75FFFFCA122DA0E30210A0E18000A0E3F0C09FE5013A83 -S31A50000E8AA0E12C3683E1023184E7010040E2011081E2012082DE -S31A50000E9FE2000050E3F7FFFFCA022BA0E30210A0E1010BA0E342 -S31A50000EB4C0C09FE5013AA0E12C3683E1023184E7010040E2018B -S31A50000EC91081E2012082E2000050E3F7FFFFCA031BA0E3002013 -S31A50000EDEA0E32000A0E302C0A0E3033B8CE30C3083E3013A8331 -S31A50000EF3E1023184E7010040E2011081E2012082E2000050E3C6 -S31A50000F08F6FFFFCA032BA0E30210A0E12000A0E302C0A0E30391 -S31A50000F1D3B8CE3043083E3013A83E1023184E7010040E20110B4 -S31A50000F3281E2012082E2000050E3F6FFFFCA0E2CA0E30210A00C -S31A50000F47E18000A0E302C0A0E3033B8CE30C3083E3013A83E128 -S31A50000F5C023184E7010040E2011081E2012082E2000050E3F647 -S31A50000F71FFFFCA10A81BE9004000C00020C0000DC0A0E100D88B -S31A50000F862DE904B04CE21CC09FE500309CE50030C3E101000022 -S31A50000F9BE0003083E100308CE51224A0E3003082E500A81BE9DA -S31A50000FB0600100000DC0A0E100D82DE904B04CE200A81BE90D9E -S31A50000FC5C0A0E100D82DE90C309FE50F0000E20000D3E704B073 -S31A50000FDA4CE200A81BE938FA00500DC0A0E100D82DE920209F35 -S31A50000FEFE5000092E504B04CE2000050E3010000CAED0800EB7B -S31A5000100400A81BE90030E0E3003082E500A81BE9F08200000D20 -S31A50001019C0A0E100D82DE9FF0000E2613040E2050053E300105E -S31A5000102EA0E104B04CE20100008A570040E200A81BE9302040B4 -S31A50001043E2FF3002E2090053E30100008A0200A0E100A81BE954 -S31A50001058413040E2050053E30100009A0000E0E300A81BE9371E -S31A5000106D0041E200A81BE90DC0A0E110D82DE90030A0E304B096 -S31A500010824CE214D04DE214304BE524404BE21C000BE5D2FFFFE1 -S31A50001097EBFF0000E20410A0E1020000EB010050E3F9FFFF1A5B -S31A500010AC10A81BE90DC0A0E170D82DE90140A0E11050D4E50492 -S31A500010C1B04CE2000055E30800001A240050E32800001A0130C2 -S31A500010D6A0E31030C4E50C5084E5005084E5023043E2043084B6 -S31A500010EBE5210000EA010055E31700001A230050E30600001ACA -S31A50001100080094E50C1094E50030A0E30130C0E70220A0E3102E -S31A5000111520C4E5160000EA0C1094E5020B51E30300001A003083 -S31A5000112AA0E31030C4E50000E0E370A81BE9003094E5082094AA -S31A5000113FE5003083E0003084E50100C2E7013081E20C3084E551 -S31A50001154070000EA020055E30700001AFF0000E2ABFFFFEB006F -S31A5000116902A0E1040084E50330A0E31030C4E50000A0E370A8F1 -S31A5000117E1BE9030055E32300001AFF0000E2A1FFFFEB04309457 -S31A50001193E50020D4E5003083E1043084E5030052E10200000AC0 -S31A500011A82D00A0E3750800EBDCFFFFEA2B00A0E3720800EB08E5 -S31A500011BD2094E50230D2E53A0053E31000001A0000D2E50C6088 -S31A500011D294E56B0800EB083094E50100D3E5680800EB0500A071 -S31A500011E7E1060050E10700008A0210E0E3083094E50020D3E794 -S31A500011FC033080E0010080E20120C3E7060050E1F8FFFF9A01FF -S31A5000121100A0E370A81BE90000E0E30030A0E31030C4E570A85C -S31A500012261BE90DC0A0E1F0D92DE904B04CE20070A0E168809FD2 -S31A5000123BE52400A0E3500800EB0050A0E30540D7E70560A0E1BD -S31A50001250050054E10700000A0400A0E1490800EB016086E2045A -S31A500012653085E00640D7E7FF5003E2000054E3F7FFFF1A2300E8 -S31A5000127AA0E3410800EB2502D8E73F0800EB0F3005E20300D839 -S31A5000128FE73C0800EB52FFFFEB7F0000E22B0050E3E5FFFF1AE7 -S31A500012A4F0A91BE938FA00500DC0A0E1F0DF2DE990009FE50079 -S31A500012B920A0E38C309FE504D04DE2002083E504B04CE200106A -S31A500012CE90E503A0A0E1020051E14B0000DA0090A0E16C809F27 -S31A500012E3E56C309FE5002093E5000052E31900000A003090E506 -S31A500012F854109FE5030053E30300009A003098E5030013E30423 -S31A5000130D40A0030800000A30209FE5003092E50140A0E304003D -S31A5000132253E10300009A003091E5010013E30140A0130240A01C -S31A50001337032C004BE2001091E50420A0E1A00A00EB070000EA3E -S31A5000134C54AB0000F482000058AB000060AB0000003098E50006 -S31A5000136120D3E50140A0E32C204BE500309AE5000053E3240000 -S31A50001376001A03C0A0E104005CE1150000AA2C604BE270E09F06 -S31A5000138BE50A70A0E16C509FE50600DCE700109EE52032D5E76D -S31A500013A00130C1E4002097E500108EE5000052E31500001A0F7A -S31A500013B53000E20320D5E70120C1E400309AE500108EE50000E4 -S31A500013CA53E30E00001A01C08CE204005CE1EDFFFFBA0020998C -S31A500013DFE50900A0E1003098E5022064E0002089E5043083E0FC -S31A500013F4003088E5000052E3010000EA5CAB000038FA0050B593 -S31A50001409FFFFCAF0AF1BE90DC0A0E170D82DE904B04CE268C057 -S31A5000141E9FE500108CE564109FE5000081E560009FE50020807C -S31A50001433E55C209FE5000053E3003082E50C60A0E10A00000A9B -S31A500014484C409FE50050A0E3005084E5003094E593FFFFEB0078 -S31A5000145D2094E5003094E5050053E10200000A0500A0E170A8FF -S31A500014721BE98CFFFFEB002096E50030A0E30030C2E5000096DB -S31A50001487E570A81BE95CAB000058AB000054AB000060AB0000E5 -S31A5000149CF48200000DC0A0E1F0DF2DE924019FE524219FE504C6 -S31A500014B1D04DE20070A0E3007082E504B04CE2003090E50290EE -S31A500014C6A0E1070053E15A0000DA04319FE5002093E50010D298 -S31A500014DBE503A0A0E1070051E15400000AF0809FE5F0109FE58E -S31A500014F0003091E5000053E31000000A003090E5030053E303BA -S31A5000150500009A003098E5030013E30450A0030A00000AB4205C -S31A5000151A9FE5003092E50150A0E3050053E10500009A003098C7 -S31A5000152FE5010013E30150A0130250A003000000EA0150A0E3BE -S31A500015440040A0E3050054E1170000AA84609FE5003096E5016A -S31A5000155900D3E4003086E5ACFEFFEB0002A0E1003099E5FF70A1 -S31A5000156E00E2000053E33000001A00309AE50100D3E400308A8F -S31A50001583E5A3FEFFEB000087E1003099E5FF7000E2000053E3F0 -S31A500015982700001A2C304BE20370C4E7014084E2050054E1E837 -S31A500015ADFFFFBA2C109FE5003091E5000053E30900000A2C0040 -S31A500015C24BE2001098E50520A0E10C0A00EB060000EA54AB006E -S31A500015D700F482000058AB00005CAB000060AB0000003098E571 -S31A500015EC0070C3E5003099E5000053E30F00001A30309FE5008B -S31A500016012093E50300A0E1003098E5022065E0002080E5053094 -S31A5000161683E0003088E5000052E3050000DA00309AE50020D3B3 -S31A5000162BE5000052E3000000EA54AB0000ABFFFF1AF0AF1BE9EB -S31A500016400DC0A0E170D82DE904B04CE25CC09FE500008CE55848 -S31A50001655009FE5001080E554109FE5002081E550209FE50000CF -S31A5000166A53E3003082E50060A0E10A00000A40409FE50050A05F -S31A5000167FE3005084E5003094E584FFFFEB002094E5003094E50C -S31A50001694050053E10200000A0500A0E170A81BE97DFFFFEB009E -S31A500016A90096E570A81BE958AB00005CAB000054AB000060AB2B -S31A500016BE0000F48200000DC0A0E100D82DE904B04CE2800800A5 -S31A500016D3EB08209FE50130A0E3003082E500A81BE9D8820000C4 -S31A500016E80DC0A0E170D82DE904B04CE20060A0E30150A0E10054 -S31A500016FD6085E50040A0E1060000EA003095E5016086E2002074 -S31A5000171294E5033280E1003085E5012082E2002084E500209401 -S31A50001727E50030D2E5000053E30300000A0300A0E136FEFFEBA6 -S31A5000173C000050E3F0FFFFAA0600A0E170A81BE90DC0A0E17016 -S31A50001751D82DE904B04CE202E0A0E10060A0E3004051E20400A0 -S31A50001766001A3030A0E30130C0E40030C0E50200A0E370A81BB9 -S31A5000177BE907308EE2000053E3073083B2C3E1B0E11300000A7F -S31A5000179050509FE501104EE28131A0E134C3B0E10020A003010A -S31A500017A520A01301005EE30030A0130130A003032092E1060071 -S31A500017BA000AFFC00CE22C32D5E70130C0E40F200CE20230D5FA -S31A500017CFE7026086E20130C0E400E051E2ECFFFF1A0600A0E18B -S31A500017E470A81BE938FA00500DC0A0E110D82DE90010A0E18897 -S31A500017F9309FE504B04CE2002093E500E0A0E30E0052E11C0097 -S31A5000180E00DA74409FE500C094E50E005CE10300000A0100A02B -S31A50001823E30FE0A0E10CF0A0E100E0A0E101005EE30200001ACB -S31A5000183850309FE500E0C3E510A81BE9003094E501007EE300F2 -S31A5000184D0053130B00001A38309FE5003093E5000053E30700D4 -S31A50001862000A0100A0E30FE0A0E103F0A0E1000050E302000074 -S31A500018770A18209FE50130A0E30030C2E510A81BE9F4400100C4 -S31A5000188C00830000F8820000E8400100FC8200000DC0A0E110EF -S31A500018A1D82DE974409FE50030D4E504B04CE2000053E30B00AA -S31A500018B6000A64309FE500C093E500005CE30700000A58309FF6 -S31A500018CBE50000A0E3002093E50010A0E10FE0A0E10CF0A0E134 -S31A500018E00030A0E30030C4E53C409FE50030D4E5000053E308EA -S31A500018F500000A30309FE5003093E5000053E30400000A0000AE -S31A5000190AA0E30FE0A0E103F0A0E10030A0E30030C4E510A81BAC -S31A5000191FE9F882000000830000F4400100FC820000E84001009B -S31A500019340DC0A0E170D82DE9B8209FE5003092E504B04CE200B7 -S31A500019490053E30200000A003092E50FE0A0E103F0A0E19C20AA -S31A5000195E9FE5003092E5000053E30300000A0030A0E30030824B -S31A50001973E50250A0E3020000EA610D00EB4E0D00EB0050A0E1F3 -S31A500019886B0F00EB000050E30000000A730F00EB630F00EBBECA -S31A5000199DFFFFEB450F00EB0300A0E3A70800EB0300A0E3720897 -S31A500019B200EB48609FE5000055E30600000A40409FE5003094A3 -S31A500019C7E50500A0E10FE0A0E103F0A0E1000050E3F9FFFF1A22 -S31A500019DC4E0F00EB003096E5000053E30200000A003096E50FB1 -S31A500019F1E0A0E103F0A0E170A81BE9EC820000D8410100E882A8 -S31A50001A060000DC8200000DC0A0E1F0DD2DE904B04CE224D04DC3 -S31A50001A1BE20050A0E10040A0E348604BE2F4A09FE500309AE54E -S31A50001A300180A0E3000053E30500000A0400A0E10610A0E10FD7 -S31A50001A45E0A0E103F0A0E10080A0E1020000EA0400A0E13A06AF -S31A50001A5A00EB48000BE50600A0E1103044E2070053E303E0A051 -S31A50001A6FE1017084E21100008A0840A0E30020A0E302C0A0E108 -S31A50001A8444004BE20010A0E1043082E2012082E203C0C1E70469 -S31A50001A990052E1FAFFFFBA0010A0E106C0A0E10320A0E301304E -S31A50001AAEDCE4012042E20130C1E4010072E3FAFFFF1A00005832 -S31A50001AC3E30700000A0510A0E107005EE30C20A0930420A08340 -S31A50001AD80030A0E34BFEFFEB0050A0E1100000EA0520A0E10745 -S31A50001AED005EE31730A0930730A083010073E37810A0E3030014 -S31A50001B02000A013043E20110C2E4010073E3FBFFFF1A07005E92 -S31A50001B17E30200009A085085E2010000EAEC400100185085E23E -S31A50001B2C0740A0E1190054E3BCFFFFDAF0AD1BE90DC0A0E1F0C3 -S31A50001B41D92DE904B04CE20CD04DE20040A0E31A70A0E301305C -S31A50001B56D0E40180A0E124000BE5500053E31700001A24004B34 -S31A50001B6BE228104BE2DCFEFFEB040050E10800000A24201BE579 -S31A50001B800130D2E4FF3003E224200BE53D0053E30200001A2814 -S31A50001B95401BE5017084E2090000EA74209FE50030D2E50810C4 -S31A50001BAAA0E1000053E32900000A0130C1E40130F2E5000053B5 -S31A50001BBFE3FBFFFF1A240000EA0450A0E1070055E1180000AAE3 -S31A50001BD40060A0E32C104BE2104045E2070054E32C600BE50C1D -S31A50001BE920A0930420A08324001BE50630A0E190FEFFEB2C1068 -S31A50001BFE1BE50500A0E1D70500EB070054E30300009A24301BE5 -S31A50001C13E5083083E2020000EA4CFA005024301BE5183083E261 -S31A50001C28015085E224300BE5070055E1E7FFFFBA28209FE500AD -S31A50001C3D30D2E50810A0E1000053E30300000A0130C1E4013072 -S31A50001C52F2E5000053E3FBFFFF1A0030A0E30030C1E50000007E -S31A50001C67EA50FA0050F0A91BE90DC0A0E1F0D82DE9D4239FE54A -S31A50001C7C04B04CE2C0D04DE20040A0E10070A0E30030D4E502BD -S31A50001C9160A0E10070C2E53F3043E23B0053E303F19F971702A8 -S31A50001CA600EA981D0050082500503C1E0050D8230050682200E8 -S31A50001CBB500825005008250050082500508C1F0050B0230050D9 -S31A50001CD0082500500825005008250050082500507020005008CD -S31A50001CE5250050082500508C1F0050241E00500825005068220E -S31A50001CFA0050C42300500825005008250050082500506C2000F5 -S31A50001D0F500825005008250050082500500825005008250050A8 -S31A50001D2408250050082500500825005008250050802400506804 -S31A50001D39220050F01D00500825005008250050301E00500825AB -S31A50001D4E0050082500500825005090230050082500509C1F00A5 -S31A50001D6350082500500825005008250050181E0050A8230050AD -S31A50001D786822005008250050082500500825005008250050082A -S31A50001D8D25005008250050D41D00505A0C00EB470C00EB5330A6 -S31A50001DA2A0E30030C6E50020A0E30320C6E5A0129FE54032A0BF -S31A50001DB7E10F3003E20320D1E70F0000E20030D1E70120C6E53C -S31A50001DCC0230C6E5D00100EA0600A0E1021BA0E32020A0E359D1 -S31A50001DE1FEFFEB0030A0E30030C6E7C90100EA64129FE5003041 -S31A50001DF6D1E50620A0E1000053E3AE01000A0130C2E40130F13D -S31A50001E0BE5000053E3FBFFFF1AA90100EA010084E2890200EBCD -S31A50001E20BC0100EA010084E2EC0200EBB90100EA0600A0E1F451 -S31A50001E35FEFFEBB60100EA0130D4E5000053E30A00001AFC0178 -S31A50001E4A00EB0C129FE50030D1E50620A0E1000053E397010045 -S31A50001E5F0A0130C2E40130F1E5000053E3FBFFFF1A920100EA6A -S31A50001E74A4704BE2A0504BE2013084E2A0300BE50500A0E107C1 -S31A50001E8910A0E115FEFFEB000050E32400000AA0201BE501300E -S31A50001E9ED2E4FF3003E2A0200BE52C0053E31E00001A0500A020 -S31A50001EB3E1A8104BE20AFEFFEB000050E31900000AA0201BE5F6 -S31A50001EC80130D2E4FF3003E2A0200BE52C0053E31300001AA4D1 -S31A50001EDD101BE5000051E30B00000AA8001BE5EB0100EB0010B2 -S31A50001EF250E20300000AA0001BE5A4201BE50030A0E3CDFDFF66 -S31A50001F07EBA4201BE5A0301BE5823083E0A0300BE5A0201BE55B -S31A50001F1C0030D2E52C0053E301308202D4FFFF0AA0301BE500B0 -S31A50001F3120D3E5000052E30900001A1C119FE50030D1E5062058 -S31A50001F46A0E1000053E35B01000A0130C2E40130F1E5000053E2 -S31A50001F5BE3FBFFFF1A560100EAF8109FE50030D1E50620A0E1CB -S31A50001F70000053E35101000A0130C2E40130F1E5000053E3FB65 -S31A50001F85FFFF1A4C0100EA0400A0E10610A0E1E8FEFFEB5E0157 -S31A50001F9A00EAAC504BE20500A0E1013084E2AC300BE5B0104BD5 -S31A50001FAFE2CCFDFFEB000050E31B00000AAC201BE50130D2E427 -S31A50001FC4FF3003E2AC200BE52C0053E31500001A0500A0E1B417 -S31A50001FD9104BE2C1FDFFEB000050E31000000AB0001BE50610A5 -S31A50001FEEA0E1B4201BE50130A0E304FDFFEB000050E34401001C -S31A500020031A5C109FE50030D1E50620A0E1000053E32901000A71 -S31A500020180130C2E40130F1E5000053E3FBFFFF1A240100EA30F7 -S31A5000202D109FE50030D1E50620A0E1000053E31F01000A013096 -S31A50002042C2E40130F1E5000053E3FBFFFF1A1A0100EA54A30041 -S31A500020570038FA005054FA005050FA005084FA005088FA0050C4 -S31A5000206C0170A0E3B8504BE20500A0E1013084E2B8300BE5BC2F -S31A50002081104BE297FDFFEB000050E36B00000AB8201BE5013088 -S31A50002096D2E4FF3003E2B8200BE52C0053E36500001A0500A0C7 -S31A500020ABE1C0104BE28CFDFFEB000050E36000000AB8001BE524 -S31A500020C00130D0E4FF3003E2B8000BE53A0053E35A00001A0030 -S31A500020D50057E33E00000AC0301BE5000053E32400000A9C50DE -S31A500020EA4BE2C0301BE50040A0E3030054E11100002A0510A083 -S31A500020FFE1B8201BE50130D2E40430C1E7FF3003E2B8200BE51E -S31A500021147D0053E30300001A0130D2E4203083E30430C5E7B85B -S31A50002129200BE5014084E27F0054E30200008AC0301BE503005F -S31A5000213E54E1EEFFFF3A0500A0E1BC101BE50420A0E12B0700B2 -S31A50002153EB040050E10700001AC0201BE5BC301BE5022064E0AE -S31A50002168C0200BE5043083E0BC300BE5000052E3DBFFFF1AC0E1 -S31A5000217D301BE5000053E30900001A50139FE50030D1E506207B -S31A50002192A0E1000053E3C800000A0130C2E40130F1E500005328 -S31A500021A7E3FBFFFF1AC30000EA2C139FE50030D1E50620A0E1DA -S31A500021BC000053E3BE00000A0130C2E40130F1E5000053E3FBAB -S31A500021D1FFFF1AB90000EABC101BE5C0201BE50130A0E315FD76 -S31A500021E6FFEB000050E30900000AE8129FE50030D1E50620A034 -S31A500021FBE1000053E3AE00000A0130C2E40130F1E5000053E396 -S31A50002210FBFFFF1AA90000EAC4129FE50030D1E50620A0E100D6 -S31A500022250053E3A400000A0130C2E40130F1E5000053E3FBFF5C -S31A5000223AFF1A9F0000EAA0129FE50030D1E50620A0E100005381 -S31A5000224FE39A00000A0130C2E40130F1E5000053E3FBFFFF1A76 -S31A50002264950000EA013084E2C4300BE5C4504BE20020D4E500FB -S31A5000227930A0E3C8300BE5530052E3430052130700001A050009 -S31A5000228EA0E1C8104BE213FDFFEBC4201BE50030D2E53B00530C -S31A500022A3E301308202C4300B050500A0E1CC104BE20BFDFFEBB3 -S31A500022B8000050E30100000ACC001BE5170B00EB0300A0E35EC0 -S31A500022CD0600EB0300A0E3290600EBC8001BE5000050E3080012 -S31A500022E2000A00229FE5003092E5000053E30400000A00309234 -S31A500022F7E50FE0A0E103F0A0E1000050E3C8000B05C8501BE590 -S31A5000230C000055E30300000A0900A0E3C8000BE5B20000EB7EC2 -S31A500023210000EA680D00EB000050E30400000A6330A0E3003080 -S31A50002336C4E5B0219FE5623043E2003082E50030D4E553005361 -S31A5000234BE3730053130600001A0500A0E123FDFFEB90219FE586 -S31A5000236090319FE5003082E59D0C00EB010000EA0100A0E31C17 -S31A50002375FDFFEB0300A0E3320600EB0300A0E3FD0500EB0000FA -S31A5000238AE0E3640000EA64319FE5002093E50FE0A0E102F0A024 -S31A5000239FE10100A0E35E0000EA940500EB590000EA010084E2F8 -S31A500023B40610A0E14B2FA0E3D30200EB540000EA010084E206BF -S31A500023C910A0E14B2FA0E3B80200EB4F0000EAD0004BE201300F -S31A500023DE84E2D0300BE5D4104BE2BEFCFFEB000050E31800003E -S31A500023F30AD0201BE50130D2E4FF3003E2D0200BE52C0053E348 -S31A500024081200001A0130D2E4D0200BE5430053E30200001AD40D -S31A5000241D001BE5960600EB010000EAD4001BE58E0600EBA810D7 -S31A500024329FE50030D1E50620A0E1000053E31E00000A0130C2DD -S31A50002447E40130F1E5000053E3FBFFFF1A190000EAA0109FE5BF -S31A5000245C0030D1E50620A0E1000053E31400000A0130C2E4015C -S31A5000247130F1E5000053E3FBFFFF1A0F0000EAD8004BE2013082 -S31A5000248684E2D8300BE5DC104BE294FCFFEB000050E30B0000BC -S31A5000249B1A60109FE50030D1E50620A0E1000053E30300000AF8 -S31A500024B00130C2E40130F1E5000053E3FBFFFF1A0030A0E300E7 -S31A500024C530C2E5120000EA0C009FE554FBFFEBDC001BE5C3036E -S31A500024DA00EB0D0000EA50FA005088FA00508CFA0050E482000D -S31A500024EF002C8300000C83000000410100E082000084FA0050D2 -S31A5000250490FA00500400A0E10610A0E14B2FA0E34F0600EB0633 -S31A5000251900A0E141FBFFEB0000A0E3F0A81BE90DC0A0E110D85B -S31A5000252E2DE914409FE504B04CE20410A0E13A0500EB0400A00F -S31A50002543E137FBFFEB10A81BE954A300000DC0A0E110D82DE931 -S31A5000255838309FE5002093E504B04CE2000052E3000000AAEDE6 -S31A5000256DFFFFEB24409FE50400A0E1BDFAFFEB0400A0E1BAFDD0 -S31A50002582FFEB000050E3F9FFFF0A0000A0B30100A0A310A81B66 -S31A50002597E9F0820000549B00000DC0A0E100D82DE904B04CE271 -S31A500025AC00A81BE90DC0A0E100D82DE904B04CE240FCFFEBDCF8 -S31A500025C10400EB2B00A0E36E0300EB00A81BE90DC0A0E100D8E4 -S31A500025D62DE908309FE504B04CE2000083E500A81BE9F0820060 -S31A500025EB000DC0A0E100D82DE93C109FE55830A0E30030C1E598 -S31A500026000020A0E30320C1E504B04CE228C09FE54032A0E10FB3 -S31A500026153003E20320DCE70F0000E20030DCE70120C1E5023082 -S31A5000262AC1E50100A0E1FCFAFFEB00A81BE954A3000038FA0068 -S31A5000263F500DC0A0E100D82DE938209FE538109FE50030E0E309 -S31A50002654003082E530309FE50020A0E3002081E5002083E524CB -S31A50002669109FE524309FE5003081E504B04CE21C209FE5013031 -S31A5000267EA0E3003082E500A81BE9B8AB0000B4AB000064AB005A -S31A50002693003CAC0000BCAB0000048300000DC0A0E130D82DE99A -S31A500026A89C309FE504B04CE20040A0E1002093E50150A0E1006A -S31A500026BD0052E30000001ADDFFFFEB120054E3070000CA7830DB -S31A500026D29FE578109FE5002093E503C0A0E1022061E005208227 -S31A500026E7E0800052E30100009A0000A0E330A81BE958E09FE53D -S31A500026FC00309EE5030054E10B00000A4C009FE5003090E548B6 -S31A50002711109FE5030054E1030000BA012084E20030A0E3023167 -S31A5000272681E7002080E500408EE500309CE5043181E700309C8E -S31A5000273BE50300A0E1053083E000308CE530A81BE9048300002E -S31A500027503CAC0000BCAB0000B8AB0000B4AB000064AB00000DF1 -S31A50002765C0A0E1F0DD2DE904B04CE204D04DE20060A0E17400AB -S31A5000277A9FE50150A0E1001090E50240A0E168A09FE500005179 -S31A5000278FE31300001A0130A0E3003080E558709FE558809FE5DE -S31A500027A40130A0E1031CA0E10800A0E303E1A0E101C083E281E1 -S31A500027B920A0E1073022E0000051E30320A0B10210A0E101009F -S31A500027CE50E2F8FFFF1A0C30A0E10E2088E7FF0053E3F0FFFFE1 -S31A500027E39A14709FE50030A0E300308AE5080000EA088300001A -S31A500027F8F4820000B71DC10440AC000025305BE5243C23E00380 -S31A5000280D2197E7016086E2044422E0015045E2010075E30600D7 -S31A50002822000A25004BE20610A0E10120A0E3650500EB00309A95 -S31A50002837E5000053E3F0FFFF0A0400A0E1F0AD1BE90DC0A0E1AF -S31A5000284C70D82DE968319FE504B04CE20CD04DE21C000BE500AD -S31A5000286120A0E30020C3E500C0A0E10020DCE50350A0E1430068 -S31A5000287652E33700001A0130DCE5520053E33400001A0260DC6B -S31A5000288BE5430056E33100001A0330DCE53A0053E32E00001A8A -S31A500028A01C404BE20400A0E104308CE21C300BE520104BE28BF9 -S31A500028B5FBFFEB000050E34600000A1C201BE50130D2E4FF30FE -S31A500028CA03E21C200BE52C0053E34000001A0400A0E124104BD2 -S31A500028DFE280FBFFEB000050E33B00000A20001BE524101BE57B -S31A500028F40020E0E399FFFFEBC0309FE5004093E50010A0E10057 -S31A500029090054E30B00000AB0209FE50030D2E50510A0E1000046 -S31A5000291E53E30300000A0130C1E40130F2E5000053E3FBFFFFFE -S31A500029331A0030A0E30030C1E5260000EA010085E22020A0E35B -S31A500029487FFBFFEB0060C5E5010080E20040C5E71F0000EA1C42 -S31A5000295D301BE50300A0E10120D0E44C0052E30210A0E106006C -S31A50002972000A020000CA430052E30B00000A110000EA500051FB -S31A50002987E30400000A0E0000EA0510A0E14B2FA0E3C60100EBB7 -S31A5000299C0E0000EA0510A0E14B2FA0E3040200EB0A0000EA055B -S31A500029B110A0E1022BA0E3110100EB060000EA54A30000F48220 -S31A500029C6000084FA00500300A0E10510A0E14B2FA0E3140500A8 -S31A500029DBEB70A81BE90DC0A0E100D82DE90030D0E504B04CE287 -S31A500029F0700053E30300001A18109FE54B2FA0E3420100EB00E2 -S31A50002A05A81BE908109FE54B2FA0E30B0500EB00A81BE954A383 -S31A50002A1A00000DC0A0E100D82DE9682080E2020050E104B04CF8 -S31A50002A2FE20300002A043091E4043080E4020050E1FBFFFF3A86 -S31A50002A4400A81BE90DC0A0E100D82DE94530A0E30130C0E43042 -S31A50002A5920A0E30120C0E4133043E20130C0E404B04CE200A8E3 -S31A50002A6E1BE90DC0A0E100D82DE94F30A0E30130C0E44B20A0DB -S31A50002A83E30120C0E404B04CE200A81BE90DC0A0E170D82DE906 -S31A50002A9804B04CE20060A0E10040A0E3005051E20700000A01B8 -S31A50002AAD00D6E4015045E257F9FFEB004084E1000055E304323F -S31A50002AC2A0E10340A011F7FFFF1A0400A0E170A81BE90DC0A017 -S31A50002AD7E130D82DE904B04CE20050A0E10140A0E10210A0E38B -S31A50002AECE7FFFFEB000084E5020085E230A81BE90DC0A0E13083 -S31A50002B01D82DE904B04CE20050A0E10140A0E10810A0E3DDFF8F -S31A50002B16FFEB000084E5080085E230A81BE90DC0A0E100D82D63 -S31A50002B2BE9FF0000E2613040E2050053E304B04CE20300008A18 -S31A50002B40573040E2003081E50100A0E300A81BE9413040E20523 -S31A50002B550053E337304092F8FFFF9A302040E2FF3002E2090088 -S31A50002B6A53E30100009A0000A0E300A81BE90100A0E3002081DB -S31A50002B7FE500A81BE90DC0A0E110D82DE90040A0E10100D4E494 -S31A50002B9404B04CE2E1FFFFEB0400A0E110A81BE90DC0A0E1009B -S31A50002BA9D82DE904B04CE218C09FE5FF3001E22322DCE701205A -S31A50002BBEC0E40F1001E20130DCE70130C0E400A81BE994FA0003 -S31A50002BD3500DC0A0E1F0D82DE904B04CE204D04DE20040A0E175 -S31A50002BE80060A0E30170A0E120504BE2030000EA20301BE501D2 -S31A50002BFD4084E20F3003E2066283E10000D4E50510A0E1C3FFC6 -S31A50002C12FFEB000050E3F6FFFF1A0400A0E1006087E5F0A81B28 -S31A50002C27E90DC0A0E1F0D82DE904B04CE20050A0E10170A0E188 -S31A50002C3C106085E2060055E10800002A0100D5E4F1F8FFEB005B -S31A50002C5140A0E10100D5E4EEF8FFEB040280E10100C7E40600B4 -S31A50002C6655E1F6FFFF3A0500A0E1F0A81BE90DC0A0E110D82D1A -S31A50002C7BE904B04CE20140A0E1241CA0E1C5FFFFEB2418A0E135 -S31A50002C90FF1001E2C2FFFFEB2414A0E1FF1001E2BFFFFFEBFFEA -S31A50002CA54004E20410A0E1BCFFFFEB10A81BE90DC0A0E130D852 -S31A50002CBA2DE904B04CE20150A0E10520A0E10130D2E40040A078 -S31A50002CCFE3040053E10300000A0130D2E4014084E2000053E3AE -S31A50002CE4FBFFFF1AC80054E3C840A0A3FF1004E2AAFFFFEB049C -S31A50002CF930A0E1014044E2000053E3080000DA0420A0E101306A -S31A50002D0ED5E4014044E2230053E3000053132A30A0030130C08D -S31A50002D23E4000052E3F6FFFFCA30A81BE90DC0A0E130D82DE926 -S31A50002D3804B04CE20150A0E1104080E2040050E10300002A0167 -S31A50002D4D10D5E493FFFFEB040050E1FBFFFF3A30A81BE90DC0C5 -S31A50002D62A0E100D82DE90330A0E30020A0E304B04CE2013043E8 -S31A50002D77E20120C0E4010073E3FBFFFF1A413CA0E10130C0E40D -S31A50002D8C4128A0E10120C0E44134A0E10130C0E40010C0E500AD -S31A50002DA1A81BE90DC0A0E100D82DE9040080E20310A0E304B02F -S31A50002DB64CE200C0A0E30120A0E1011041E20130D0E400005234 -S31A50002DCBE30CC483E1F9FFFFCA0C00A0E100A81BE90DC0A0E13E -S31A50002DE000D82DE90720A0E304B04CE20130D1E4012042E201E2 -S31A50002DF530C0E4010072E3FAFFFF1A00A81BE90DC0A0E130D835 -S31A50002E0A2DE904B04CE208D04DE20140A0E11C504BE20500A05E -S31A50002E1FE1B00700EB000050E30900000A5130A0E30130C4E4A2 -S31A50002E344320A0E30120C4E40500A0E1D7FFFFEB0010A0E104A9 -S31A50002E4900A0E188FFFFEB010000EA0400A0E1FAFEFFEB00409A -S31A50002E5EA0E10030A0E30030C4E530A81BE90DC0A0E110D82DBD -S31A50002E73E90010A0E104B04CE220D04DE218404BE20400A0E16F -S31A50002E88B4FFFFEB0400A0E130104BE2B80700EB000050E30370 -S31A50002E9D00000A28301BE50100A0E3000053E30000001A000094 -S31A50002EB2A0E310A81BE90DC0A0E130D82DE904B04CE204D04D07 -S31A50002EC7E20040A0E10150A0E118104BE23EFFFFEB000054E17A -S31A50002EDC0600000A18001BE5E0FFFFEB000050E30200000A0556 -S31A50002EF100A0E1DDFEFFEB010000EA0500A0E1D0FEFFEB0030D7 -S31A50002F06A0E30030C0E530A81BE90DC0A0E130D82DE90030E0B0 -S31A50002F1BE304B04CE20CD04DE20120D0E40150A0E120300BE594 -S31A50002F30670052E32100000A020000CA630052E30700000A2ECC -S31A50002F450000EA700052E32C00001A20104BE20AFFFFEB1C10D0 -S31A50002F5A4BE231FFFFEB2A0000EA0030D0E52D0053E306000063 -S31A50002F6F1A0130D0E5310053E30300001A08219FE50030A0E313 -S31A50002F84003082E5030000EAF8409FE50410A0E10EFFFFEB0412 -S31A50002F9920A0E1000092E5000050E30200000AAFFFFFEB0000DE -S31A50002FAE50E31300000A0500A0E1ACFEFFEB120000EAC8409FAB -S31A50002FC3E50410A0E101FFFFEB001094E51C004BE261FFFFEB23 -S31A50002FD8004094E5010074E30100000A000054E30200001A021D -S31A50002FED30A0E320300BE5050000EA0130A0E320300BE50200A1 -S31A5000300200EA0500A0E18EFEFFEB0050A0E120301BE5013083A8 -S31A50003017E2030053E303F19F971E0000EAAC3000503430005021 -S31A5000302C443000508030005058209FE558309FE5003082E519BD -S31A500030410000EA50409FE548109FE50400A0E171FEFFEB1C0050 -S31A500030564BE21A10A0E30420A0E1580700EB000050E30C000007 -S31A5000306B0A20309FE5004083E50500A0E17CFEFFEB090000EA97 -S31A500030800500A0E179FEFFEB060000EAF4400100F04001000C9C -S31A5000309583000000410100704101000500A0E167FEFFEB005034 -S31A500030AAA0E10030A0E30030C5E530A81BE90DC0A0E1F0DF2D87 -S31A500030BFE904B04CE208D04DE20160A0E10070A0E32C104BE296 -S31A500030D40240A0E1A9FEFFEB30104BE27BFEFFEB50509FE50544 -S31A500030E910A0E1CDFEFFEB1A4044E2049086E05130A0E3013087 -S31A500030FEC6E44D20A0E30120C6E40710A0E106A0A0E10A00A099 -S31A50003113E1A2FEFFEB0060A0E10680A0E13030A0E30130C6E440 -S31A500031280510A0E10600A0E1FEFEFFEB0060A0E1080000EA4026 -S31A5000313DB00000017087E20600A0E10410A0E1F7FEFFEB006042 -S31A50003152A0E10500A0E10410A0E11EFFFFEB090056E10D000022 -S31A500031672A30301BE5030057E10A0000AA3C409FE50510A0E1EE -S31A5000317C2C001BE50420A0E1E90600EB0030A0E32C300BE5033B -S31A500031910050E1E9FFFF1A313083E20030C8E50A00A0E1FF1064 -S31A500031A607E27DFEFFEB0030A0E30030C6E5000000EA48B00000 -S31A500031BB00F0AF1BE90DC0A0E130D82DE90030A0E304B04CE205 -S31A500031D024D04DE22C300BE528300BE524300BE50150A0E120A7 -S31A500031E5300BE538104BE242FEFFEB1C404BE20410A0E18AFE1A -S31A500031FAFFEB0400A0E134404BE20410A0E1DB0600EB000050A9 -S31A5000320FE33700000A7130A0E30130C5E47020A0E30120C5E455 -S31A5000322438101BE50500A0E190FEFFEB0410A0E1BDFEFFEB3887 -S31A50003239301BE50050A0E1020013E30600000A0210A0E388FE06 -S31A5000324EFFEB0210A0E352FEFFEB2C105BE550FEFFEB0050A0B8 -S31A50003263E138301BE5040013E30800000A28301BE5000053E31D -S31A500032780500000A0500A0E10410A0E37AFEFFEB28101BE5889D -S31A5000328DFEFFEB0050A0E138301BE5080013E30800000A243051 -S31A500032A21BE5000053E30500000A0500A0E10810A0E36EFEFFF0 -S31A500032B7EB24101BE57CFEFFEB0050A0E138301BE5100013E3EA -S31A500032CC0B00000A20301BE5000053E30800000A0500A0E11054 -S31A500032E110A0E362FEFFEB20101BE570FEFFEB010000EA05002D -S31A500032F6A0E1D2FDFFEB0050A0E10030A0E30030C5E530A81BE2 -S31A5000330BE90DC0A0E170D82DE904B04CE208D04DE20040A0E118 -S31A5000332020504BE20500A0E10160A0E10210A0E18AFEFFEB0533 -S31A5000333500A0E10410A0E10620A0E1B30600EB70A81BE90DC0E3 -S31A5000334AA0E100D82DE90C309FE5002093E504B04CE2000192DC -S31A5000335FE700A81BE90C8300000DC0A0E100D82DE90C309FE5E5 -S31A50003374002093E504B04CE2001182E700A81BE90C8300000DB2 -S31A50003389C0A0E100D82DE920309FE5182093E50010A0E1000095 -S31A5000339E92E5FF1001E20C3092E504B04CE20FE0A0E103F0A0C3 -S31A500033B3E100A81BE9500000000DC0A0E100D82DE91C309FE5C6 -S31A500033C8182093E5000092E5103092E504B04CE20FE0A0E10367 -S31A500033DDF0A0E1FF0000E200A81BE9500000000DC0A0E100D811 -S31A500033F22DE924309FE504B04CE218C093E500109CE50020A0FF -S31A50003407E10100A0E114309CE50010A0E30FE0A0E103F0A0E1BB -S31A5000341C00A81BE9500000000DC0A0E100D82DE9000050E304D6 -S31A50003431B04CE20F00000A70209FE5003092E5013043E20030F8 -S31A5000344682E5000053E3160000CA0030A0E3003082E554209F41 -S31A5000345BE5183092E5000093E5142093E50510A0E30FE0A0E136 -S31A5000347002F0A0E100A81BE930209FE5003092E5013083E200C1 -S31A500034853082E5010053E30600001A1C309FE5182093E500006E -S31A5000349A92E5143092E50410A0E30FE0A0E103F0A0E100A81B57 -S31A500034AFE910830000500000000DC0A0E100D82DE91C309FE5DA -S31A500034C4182093E5000092E5103092E504B04CE20FE0A0E1036A -S31A500034D9F0A0E1FF0000E200A81BE9500000000DC0A0E1F0DF1D -S31A500034EE2DE9FF1001E20D0051E304B04CE208D04DE26C0000D5 -S31A500035030A68319FE568219FE5000093E50010C2E70A0051E3BA -S31A50003518010080E2000083E50390A0E10100000A640050E36166 -S31A5000352D00001A44319FE5186093E500200FE100400FE1C040F0 -S31A5000354284E304F029E130200BE5000096E50C3096E52410A073 -S31A50003557E30FE0A0E103F0A0E1000096E54F80A0E30C3096E5BE -S31A5000356C0810A0E10FE0A0E103F0A0E1002099E50070A0E302E4 -S31A500035810057E1170000AAF0A09FE5E4209FE50730D2E72342F5 -S31A50003596DAE7000096E50F3003E20350DAE70C3096E50410A0EB -S31A500035ABE10FE0A0E103F0A0E1000096E5017087E20C3096E5E4 -S31A500035C00510A0E10FE0A0E103F0A0E1044088E0FF8004E20510 -S31A500035D55088E0003099E5FF8005E2030057E1E8FFFFBA0000E4 -S31A500035EA96E50C3096E52310A0E30FE0A0E103F0A0E17C309F5F -S31A500035FFE5000096E52812D3E70C2096E50FE0A0E102F0A0E183 -S31A5000361464209FE5000096E50F3008E20310D2E70C3096E50F0D -S31A50003629E0A0E103F0A0E1000096E5103096E50FE0A0E103F0C8 -S31A5000363EA0E129004BE529305BE52B0053E30F00000A29004BC0 -S31A50003653E20110A0E3380300EB000050E30700001A29305BE583 -S31A500036682D0053E3EFFFFF1AB5FFFFEA1483000050B000005009 -S31A5000367D000000A8FA005028209FE50130A0E3443082E5002075 -S31A50003692A0E3002089E530201BE500300FE1C04002E2C030C3B5 -S31A500036A7E3043083E103F029E1000000EA50000000F0AF1BE963 -S31A500036BC0DC0A0E170D82DE904B04CE20160A0E10240A0E1046C -S31A500036D130A0E1014044E2000053E30050A0E10600000A01104E -S31A500036E6D6E40500A0E17DFFFFEB0430A0E1014044E200005364 -S31A500036FBE3F8FFFF1A70A81BE90DC0A0E170D82DE904B04CE2C7 -S31A500037100160A0E10240A0E10430A0E1014044E2000053E30057 -S31A5000372550A0E10600000A0500A0E160FFFFEB0430A0E1014093 -S31A5000373A44E20100C6E4000053E3F8FFFF1A70A81BE90DC0A084 -S31A5000374FE10E002DE900D82DE90000A0E310B04CE200A81BE9FF -S31A500037640DC0A0E170D82DE90000A0E304B04CE22AFFFFEBB422 -S31A50003779C09FE5B4509FE5B4E09FE5B4609FE50020A0E3B01006 -S31A5000378E9FE50C40A0E1000091E5023190E702318CE701208216 -S31A500037A3E20A0052E3FAFFFFDA001091E52C3091E52C308CE5A3 -S31A500037B8402091E530208CE5303091E534308CE5342091E53862 -S31A500037CD208CE5383091E53C308CE50000A0E33C3091E51C20A4 -S31A500037E28CE20C10A0E164308CE5400082E5042042E20100522A -S31A500037F7E1FBFFFFAA00309EE5004085E5000053E30400000A42 -S31A5000380C0030A0E300308EE50F00A0E3CAFEFFEBE00700EB0FD6 -S31A5000382100A0E3C7FEFFEBDD0700EB000086E570A81BE9004173 -S31A5000383601000C8300002C830000D8410100684101000DC0A0B7 -S31A5000384BE100D82DE904B04CE260109FE50000A0E301E0A0E188 -S31A5000386058C09FE500209EE500319CE7003182E7010080E20A03 -S31A500038750050E3F9FFFFDA001091E52C309CE52C3081E530206F -S31A5000388A9CE5402081E534309CE5303081E538209CE534208133 -S31A5000389FE53C309CE5383081E564209CE53C2081E50100A0E3D3 -S31A500038B4DAFEFFEB00A81BE968410100004101000DC0A0E10001 -S31A500038C9D82DE90000A0E304B04CE200A81BE90DC0A0E100D86F -S31A500038DE2DE930209FE530309FE530109FE5003082E52C309F5B -S31A500038F3E52C209FE5003081E528309FE528109FE5003082E5F0 -S31A5000390824309FE504B04CE2003081E500A81BE9E4820000C42E -S31A5000391D380050E0820000003A0050EC82000064370050E88208 -S31A500039320000483800500DC0A0E170D82DE99C209FE50060927C -S31A50003947E504B04CE2000056E32200001A0130A0E3003082E58E -S31A5000395C84509FE5CA0800EB343095E50000E0E30FE0A0E103D7 -S31A50003971F0A0E10040A0E1343095E50200E0E30FE0A0E103F0B3 -S31A50003986A0E1141095E558309FE558209FE5043081E554309FF2 -S31A5000399BE5082081E50C3081E54C209FE54C309FE5102081E526 -S31A500039B0143081E5020074E3000054130300000A343095E50453 -S31A500039C500A0E10FE0A0E103F0A0E1303095E50600A0E10FE0E2 -S31A500039DAA0E103F0A0E170A81BE91883000050000000BC360094 -S31A500039EF5004370050E8340050B83400504C3700500DC0A0E1C9 -S31A50003A0400D82DE918309FE5403093E504B04CE2000053E3019C -S31A50003A1900000A0FE0A0E103F0A0E100A81BE9500000000DC08B -S31A50003A2EA0E1F0D82DE95430A0E304B04CE208D04DE20150A0ED -S31A50003A43E10570A0E10040A0E10130C7E44402A0E15AF5FFEBA4 -S31A50003A580100C5E5017087E20400A0E156F5FFEB0100C7E474A4 -S31A50003A6D30A0E30130C7E46820A0E30120C7E4023043E2013000 -S31A50003A82C7E4032042E20120C7E4113043E20130C7E401204276 -S31A50003A97E20120C7E43A50A0E30150C7E4F80400EB00C0A0E1E5 -S31A50003AAC20004BE24C3CA0E120304BE54C28A0E11F204BE5076E -S31A50003AC110A0E11DC04BE54C34A0E11E304BE50420A0E30030A6 -S31A50003AD6A0E34CF6FFEB0070A0E13B40A0E30140C7E40000A05B -S31A50003AEBE334F5FFEB0100C7E40F00A0E331F5FFEB0100C7E480 -S31A50003B000150C7E40F00A0E30EFEFFEB0710A0E10420A0E30097 -S31A50003B1530A0E324000BE524604BE20600A0E139F6FFEB0070BD -S31A50003B2AA0E10140C7E40000A0E322F5FFEB0100C7E40D00A0E6 -S31A50003B3FE31FF5FFEB0100C7E40150C7E40D00A0E3FCFDFFEB1F -S31A50003B540710A0E10420A0E324000BE50030A0E30600A0E12851 -S31A50003B69F6FFEB0070A0E10140C7E40030A0E30030C7E5F0A80D -S31A50003B7E1BE90DC0A0E100D82DE904B04CE2030050E300F19FF4 -S31A50003B9397280000EA3C3C0050A83B0050BC3B0050E83B005069 -S31A50003BA8101F11EE011A81E3031081E3101F01EE1F0000EA1057 -S31A50003BBD1F11EE011AC1E3101F01EE151F07EE0000A0E10000F8 -S31A50003BD2A0E10000A0E10000A0E10000A0E10000A0E1140000EF -S31A50003BE7EA0E02A0E3021A80E2202090E4000031E1FCFFFF1A9E -S31A50003BFC160F07EE9A0F07EE0000A0E10000A0E10000A0E10023 -S31A50003C1100A0E10000A0E10000A0E1151F07EE151F08EE000072 -S31A50003C26A0E10000A0E10000A0E10000A0E10000A0E10000A00E -S31A50003C3BE1100F11EE2006A0E1010000E200A81BE90DC0A0E19B -S31A50003C5000D82DE904B04CE2030050E300F19F97190000EACC0D -S31A50003C653C0050743C0050843C0050983C0050101F11EE0F10E7 -S31A50003C7A81E3101F01EE110000EA101F11EE0C10C1E3101F0144 -S31A50003C8FEE161F07EE0C0000EA0E02A0E3021A80E2202090E4F7 -S31A50003CA4000031E1FCFFFF1A160F07EE9A0F07EE0000A0E10056 -S31A50003CB900A0E10000A0E10000A0E10000A0E10000A0E1100FFC -S31A50003CCE11EE2001A0E1010000E200A81BE90DC0A0E170D82D98 -S31A50003CE3E9D0209FE5D0409FE504B04CE2CCC09FE50130A0E3DF -S31A50003CF800308CE5C4309FE50260A0E1003082E50C50A0E100F1 -S31A50003D0D3094E504C0A0E1000053E32200000A04E0A0E1003066 -S31A50003D229EE5030053E30900009A030011E30700001A030010AC -S31A50003D37E30500001A043090E4043081E400209EE5042042E2F3 -S31A50003D4C00208EE5110000EA00309CE5010053E30900009A01F2 -S31A50003D610011E30700001A010010E30500001AB230D0E0B2305B -S31A50003D76C1E000309CE5023043E200308CE5040000EA0120D0B9 -S31A50003D8BE40120C1E400309EE5013043E200308EE5003094E5CE -S31A50003DA0000053E3DDFFFF1A0030A0E3003085E50030A0E3008D -S31A50003DB53086E570A81BE91C830000B4B00000F4820000B03D86 -S31A50003DCA00500DC0A0E130D82DE90030A0E10100A0E10310A0EC -S31A50003DDFE118409FE50250A0E1005084E504B04CE2B9FFFFEBAC -S31A50003DF4000094E5050060E030A81BE9B4B000000DC0A0E130E8 -S31A50003E09D82DE918409FE50250A0E1005084E504B04CE2AEFF69 -S31A50003E1EFFEB000094E5050060E030A81BE9B4B000000DC0A0E4 -S31A50003E33E100D82DE90000A0E304B04CE200A81BE90DC0A0E1F6 -S31A50003E4800D82DE90000A0E304B04CE200A81BE90DC0A0E100C2 -S31A50003E5DD82DE90000A0E304B04CE200A81BE90DC0A0E100D8D5 -S31A50003E722DE90100A0E304B04CE200A81BE90DC0A0E100D82D6A -S31A50003E87E90100A0E304B04CE200A81BE90DC0A0E100D82DE999 -S31A50003E9C04B04CE2A7F2FFEB00A81BE90DC0A0E110D82DE9045A -S31A50003EB1B04CE200300FE100400FE1C04084E304F029E10820EB -S31A50003EC69FE50130A0E3003082E5FEFFFFEA0000039010A81B76 -S31A50003EDBE90DC0A0E100D82DE904B04CE2EEFFFFEB0000A0E31B -S31A50003EF000A81BE90DC0A0E100D82DE90000A0E304B04CE2001A -S31A50003F05A81BE90DC0A0E170D82DE904B04CE20040A0E1000056 -S31A50003F1AA0E30160A0E30010A0E1020074E30D00000A020000D2 -S31A50003F2FCA030074E30F00000A100000EA010074E30E00001A70 -S31A50003F44BC309FE5003093E5000053E3016043E20B0000CA0366 -S31A50003F5960A0E10260E003080000EAA0309FE598209FE518003D -S31A50003F6E83E5004082E5030000EA0040A0E1000000EA0140847C -S31A50003F83E20110A0E3000051E31B00000A74509FE5183095E5FA -S31A50003F98000053E30400000A000093E5143093E50410A0E30FA0 -S31A50003FADE0A0E103F0A0E154309FE548209FE5843283E018307F -S31A50003FC285E5004082E5183095E5000050E30500000A000093EC -S31A50003FD7E5143093E50510A0E30FE0A0E103F0A0E1040000EA74 -S31A50003FEC000093E5143093E50410A0E30FE0A0E103F0A0E106B5 -S31A5000400100A0E170A81BE92083000050000000B8B000000DC08F -S31A50004016A0E100D82DE90010A0E304B04CE201C0A0E3020070A5 -S31A5000402BE30D00000A020000CA030070E30F00000A100000EAFB -S31A50004040010070E30E00001A64309FE5003093E5000053E301A2 -S31A50004055C043E20B0000CA03C0A0E102C0E003080000EA4830F3 -S31A5000406A9FE540209FE5141083E5000082E5030000EA0100A002 -S31A5000407FE1000000EA010080E20110A0E3000051E30500000AD1 -S31A5000409418309FE51C209FE5000083E510309FE5802282E014F1 -S31A500040A92083E50C00A0E100A81BE92483000050000000B8B08C -S31A500040BE00000DC0A0E100D82DE904B04CE200A81BE90DC0A060 -S31A500040D3E100D82DE904B04CE200A81BE90DC0A0E110D82DE9D9 -S31A500040E804B04CE22C409FE5E60600EB303094E50000E0E30F19 -S31A500040FDE0A0E103F0A0E1000050E30300000A343094E5000066 -S31A50004112A0E30FE0A0E103F0A0E110A81BE9500000000DC0A062 -S31A50004127E110D82DE9FF1000E258309FE504B04CE2142093E5C3 -S31A5000413C0340A0E1000052E30400000A000092E50C3092E50FD8 -S31A50004151E0A0E103F0A0E1040000EA182094E5000092E50C30DC -S31A5000416692E50FE0A0E103F0A0E1443094E5000053E30300006D -S31A5000417B0A0000A0E37D0000EB0030A0E3443084E510A81BE998 -S31A50004190500000000DC0A0E100D82DE904B04CE200A81BE90D9D -S31A500041A5C0A0E110D82DE90030A0E350209FE504B04CE204D013 -S31A500041BA4DE214300BE518E092E500309EE50020A0E10300A0D1 -S31A500041CFE10130A0E118C09EE514104BE20FE0A0E10CF0A0E159 -S31A500041E414301BE50040A0E1000053E30200000A10309FE50065 -S31A500041F90093E55E0000EB0400A0E1010000EA50000000DC41BD -S31A5000420E010010A81BE90DC0A0E1F0D82DE9E8009FE5E8609F09 -S31A50004223E50020A0E3E4509FE504B04CE2E0709FE50510A0E1A4 -S31A500042380231A0E1012082E2030081E73F0052E3FAFFFFDAC869 -S31A5000424DC09FE50030A0E3B0009FE5011083E28332A0E1072008 -S31A50004262A0E303008CE7012052E2043083E2FBFFFF5A0130A0E6 -S31A50004277E1020053E3F5FFFFDA98209FE51330A0E3003085E55A -S31A5000428C042085E58C309FE58C209FE5083085E5402085E584D9 -S31A500042A1309FE584209FE5103085E5482085E57C309FE530609A -S31A500042B685E578209FE5347085E5203085E50140E0E31C20858A -S31A500042CBE50400A0E10FE0A0E106F0A0E10400A0E10FE0A0E142 -S31A500042E007F0A0E10030A0E3243085E5283085E54C3085E5449E -S31A500042F53085E53C0085E2720200EB34309FE58C3085E5F0A81C -S31A5000430A1BE9F43E0050083F00505000000014400050B8B000CF -S31A5000431F000480000020000000A83E0050DC3E0050943E0050CD -S31A50004334C0400050D0400050285800500DC0A0E100D82DE90062 -S31A500043490051E304B04CE20700000A011041E20130D0E70300C3 -S31A5000435E53E30100001A0100A0E300A81BE9000051E3F7FFFF4A -S31A500043731A0000A0E300A81BE90DC0A0E100D82DE9000050E327 -S31A500043881C109FE504B04CE23810901514309FE58C2093E5015E -S31A5000439D00A0E10FE0A0E102F0A0E100A81BE9A843005050001A -S31A500043B200000DC0A0E130D82DE90020E0E304B04CE258C09FB8 -S31A500043C7E50040A0E100309CE50150A0E1140053E30600001AF8 -S31A500043DC18309CE5000093E5142093E50610A0E30FE0A0E1027E -S31A500043F1F0A0E10020A0E1020054E10400001A0400A0E1051060 -S31A50004406A0E165FFFFEB000050E30200001A0400A0E10510A0F3 -S31A5000441BE112F1FFEB30A81BE9500000000DC0A0E110D82DE9F0 -S31A50004430FF0000E204B04CE20040A0E10A0054E30100001A0D34 -S31A5000444500A0E335FFFFEB0400A0E133FFFFEB10A81BE90DC041 -S31A5000445AA0E110D82DE90040A0E10030D4E504B04CE200005399 -S31A5000446FE30400000A0000D4E5EAFFFFEB0130F4E5000053E325 -S31A50004484FAFFFF1A10A81BE90DC0A0E100D82DE90030A0E31000 -S31A5000449910A0E32B20A0E304D04DE200308DE504B04CE244008C -S31A500044AE00EB00A81BE90DC0A0E1F0DF2DE904B04CE224D04DB6 -S31A500044C3E20150A0E10040A0E129104BE24C300BE548A04BE232 -S31A500044D804309BE50A00A0E1000053E32090A0033090A013013D -S31A500044ED9041E4000051E1FCFFFFAA0080A0E3053094E1030029 -S31A50004502001A3030A0E348304BE5018088E2150000EA053094F6 -S31A50004517E11300000A0260A0E10070A0E30510A0E10400A0E14A -S31A5000452C0730A0E10620A0E1CF2B00EB68309FE50010D3E708F2 -S31A5000454110CAE70730A0E10620A0E10510A0E10400A0E1018053 -S31A5000455688E2632A00EB0150A0E10040A0E1053094E1EDFFFFF0 -S31A5000456B1A08309BE5080053E10380A0A14C301BE52D0053E334 -S31A500045800600001A013048E20320DAE7090052E10380A0014CC5 -S31A50004595301BE50830CAE7050000EA018048E2030000EABCFA65 -S31A500045AA00500800DAE7018048E29BFFFFEB000058E3FAFFFF2B -S31A500045BFAAF0AF1BE90DC0A0E100D82DE908D04DE200308DE55F -S31A500045D404B04CE204309BE501C0A0E104308DE50010A0E30269 -S31A500045E930A0E10C20A0E1AFFFFFEB00A81BE90DC0A0E100D89F -S31A500045FE2DE9000050E304B04CE201C0A0E31500000A0010A014 -S31A50004613E10030D1E5000053E31000000A44E09FE5013060E00C -S31A500046280E0053E10020D1E500C0A0A30D0052E30A0052130259 -S31A5000463D00000A203042E25E0053E300C0A083011081E20000A9 -S31A500046525CE30200000A0030D1E5000053E3EFFFFF1A0C00A0E3 -S31A50004667E100A81BE9010100000DC0A0E1F0DF2DE904B04CE244 -S31A5000467C0CD04DE20060A0E12C100BE5DAFFFFEB004050E2176F -S31A5000469101001AA4039FE56EFFFFEB0600A0E179FFFFEB98039D -S31A500046A69FE56AFFFFEB2000A0E35CFFFFEB2C301BE5040193F6 -S31A500046BBE772FFFFEB014084E2070054E3F7FFFFDA74039FE5A3 -S31A500046D060FFFFEB090100EA0040D6E5250054E30200000A04DB -S31A500046E500A0E14EFFFFEBFF0000EA0070A0E32BC0A0E3014027 -S31A500046FAF6E50710A0E1300054E30090A0130190A00330304460 -S31A5000470FE2090053E30600008A073187E0833084E00140F6E5BC -S31A50004724307043E2302044E2090052E3F8FFFF9A6C0054E3037B -S31A5000473900001A0140F6E56C0054E30110A0030140F6052530F7 -S31A5000474E44E2530053E303F19F97E00000EAD44A0050E04A00C5 -S31A5000476350E04A0050E04A0050E04A0050E04A0050E04A005039 -S31A50004778E04A0050E04A0050E04A0050E04A0050E04A0050E094 -S31A5000478D4A0050E04A0050E04A0050E04A0050E04A0050E04A15 -S31A500047A20050E04A0050E04A0050E04A0050E04A0050E04A004A -S31A500047B750E04A0050E04A0050E04A0050E04A0050E04A0050E5 -S31A500047CCE04A0050A44A005060490050AC480050E04A0050E033 -S31A500047E14A0050E04A0050E04A0050E04A0050E04A0050E04AC1 -S31A500047F60050E04A0050E04A0050E04A0050E04A0050E04A00F6 -S31A5000480B50E04A0050E04A00507C490050E04A0050E04A0050F5 -S31A50004820E04A0050E04A005008490050E04A0050E04A0050E0C4 -S31A500048354A0050E04A0050E04A0050E04A0050E04A0050E04A6C -S31A5000484A0050E04A0050A44A005060490050AC480050E04A0094 -S31A5000485F50E04A0050E04A0050E04A0050E04A0050E04A00503C -S31A50004874E04A0050E04A0050E04A0050E04A0050E04A0050E097 -S31A500048894A0050E04A0050E04A00507C490050E04A0050E04A7D -S31A5000489E0050E04A0050E04A005008490050000051E30B00008B -S31A500048B30A2C301BE50300B3E82C300BE5000051E3020000AA6A -S31A500048C8000070E20010E1E22DC0A0E30A20A0E300908DE50C35 -S31A500048DD30A0E1100000EA2C301BE5040093E42C300BE50000A2 -S31A500048F250E3000060B22DC0A0B30A10A0E30C20A0E11000007C -S31A50004907EA000051E30900000A00908DE50C30A0E12CC01BE569 -S31A5000491C0300BCE82CC00BE51020A0E304708DE5016086E2DF6C -S31A50004931FEFFEB6E0000EA0C20A0E12CC01BE504009CE410109E -S31A50004946A0E32CC00BE50930A0E100708DE5016086E219FFFF2B -S31A5000495BEB640000EA2C301BE50000D3E5043083E22C300BE5BF -S31A50004970016086E2ABFEFFEB5D0000EA0050A0E32CC01BE50575 -S31A5000498580A0E104409CE405A0A0E12CC00BE5050054E1AC40DA -S31A5000499A9F050C00000A0400A0E113FFFFEB000050E30800003C -S31A500049AF1A98009FE50A90A0E1A6FEFFEB0400A0E1B1FEFFEBA0 -S31A500049C4193047E2190057E30370A0C17C409FE50530D4E701BE -S31A500049D96086E2000053E30300000A015085E20530D4E70000C0 -S31A500049EE53E3FBFFFF1A000057E3070055110750A0C10000595D -S31A50004A03E30780651007A065000830A0E1018048E2000053E3C3 -S31A50004A1801704AE2050000DA2000A0E37FFEFFEB0830A0E101F3 -S31A50004A2D8048E2000053E3F9FFFFCA0030D4E5080000EAD0FAD8 -S31A50004A420050E8FA0050ECFA0050F0FA0050F8FA00500CFB00CE -S31A50004A57500000D4E571FEFFEB0130F4E5000053E30200000A46 -S31A50004A6C015045E2010075E3F7FFFF1A0A30A0E107A0A0E1001C -S31A50004A810053E31A0000DA2000A0E365FEFFEB0A30A0E101A054 -S31A50004A964AE2000053E3F9FFFFCA130000EA000057E32C301BE4 -S31A50004AABE5014047121F40A003005093E55534A0E1010013E356 -S31A50004AC02E00A0033100A01356FEFFEB014044E2F8FFFFEA252C -S31A50004AD500A0E352FEFFEB030000EA2500A0E34FFEFFEB0400E9 -S31A50004AEAA0E14DFEFFEB016086E20030D6E5000053E3F5FEFFCF -S31A50004AFF1AF0AF1BE90DC0A0E10F002DE900D82DE914B04CE23C -S31A50004B1420D04DE208309BE50C209BE504009BE52C300BE528BB -S31A50004B29200BE510309BE514209BE524300BE520200BE51830E1 -S31A50004B3E9BE51C209BE51C300BE518200BE520309BE524209BBD -S31A50004B53E514300BE510200BE52C104BE2C2FEFFEB00A81BE9FF -S31A50004B680DC0A0E1F0DF2DE904B04CE20060A0E1060051E106AE -S31A50004B7D7041800170A091000057E30290A0E13B0000DA000098 -S31A50004B9259E30300000AE4009FE5061069E0D7FFFFEB020000E6 -S31A50004BA7EAD4009FE50610A0E1D3FFFFEB0050A0E3108047E282 -S31A50004BBC10A086E2070055E1030000AAB8009FE50510D6E7CBB3 -S31A50004BD1FFFFEB010000EAAC009FE5C8FFFFEBC54FA0E10530FA -S31A50004BE664E00130C3E3053063E0010053E30100001A90009F50 -S31A50004BFBE5C0FFFFEBA43EA0E1033085E00730C3E3053063E071 -S31A50004C10070053E30100001A70009FE5B8FFFFEB015085E20F85 -S31A50004C250055E3E4FFFFDA60009FE5B3FFFFEB0050A0E30700D6 -S31A50004C3A55E1040000AA0510D6E7203041E25E0053E32E10A074 -S31A50004C4F83000000EA2010A0E338009FE5A8FFFFEB015085E2D5 -S31A50004C640F0055E3F2FFFFDA28009FE5A3FFFFEB0A60A0E100B1 -S31A50004C797058E2C3FFFFCAF0AF1BE910FB005018FB005020FB1F -S31A50004C8E005024FB005028FB00502CFB005030FB00500DC0A02A -S31A50004CA3E100D82DE90020A0E304B04CE2ACFFFFEB00A81BE911 -S31A50004CB80DC0A0E100D82DE904B04CE205FDFFEB00A81BE90DCE -S31A50004CCDC0A0E100D82DE908309FE504B04CE2000083E500A89F -S31A50004CE21BE918B100000DC0A0E100D82DE930109FE530309F9B -S31A50004CF7E5000081E5002093E5002092E504B04CE2000052E3C1 -S31A50004D0C0100001A0200A0E100A81BE90200A0E30FE0A0E102FB -S31A50004D21F0A0E100A81BE91CB1000018B100000DC0A0E100D84E -S31A50004D362DE934309FE504B04CE230C09FE507008CE800209390 -S31A50004D4BE5002092E5000052E30100001A0200A0E100A81BE902 -S31A50004D600300A0E30C10A0E10FE0A0E102F0A0E100A81BE9181E -S31A50004D75B100001CB100000DC0A0E100D82DE934309FE504B07D -S31A50004D8A4CE230C09FE503008CE8002093E5002092E500005224 -S31A50004D9FE30100001A0200A0E100A81BE90400A0E30C10A0E158 -S31A50004DB40FE0A0E102F0A0E100A81BE918B100001CB100000D62 -S31A50004DC9C0A0E100D82DE934309FE504B04CE230C09FE507000B -S31A50004DDE8CE8002093E5002092E5000052E30100001A0200A0D5 -S31A50004DF3E100A81BE90500A0E30C10A0E10FE0A0E102F0A0E1C0 -S31A50004E0800A81BE918B100001CB100000DC0A0E100D82DE9348D -S31A50004E1D309FE504B04CE230C09FE507008CE8002093E50020ED -S31A50004E3292E5000052E30100001A0200A0E100A81BE90700A078 -S31A50004E47E30C10A0E10FE0A0E102F0A0E100A81BE918B1000028 -S31A50004E5C1CB100000DC0A0E12034A0E1FF3C03E2203C83E1001B -S31A50004E71D82DE90024A0E1FF2802E2023083E1000C83E104B07E -S31A50004E864CE200A81BE90DC0A0E100D82DE904B04CE208D04DA4 -S31A50004E9BE214004BE290FFFFEB000050E30300000A10001BE5C0 -S31A50004EB0EAFFFFEB0008A0E12008A0E100A81BE90DC0A0E10098 -S31A50004EC5D82DE9030040E204B04CE2040050E300F19F97080027 -S31A50004EDA00EAF04E0050F04E0050F04E0050F84E0050F84E00FD -S31A50004EEF500A00A0E300A81BE90200A0E300A81BE90500A0E316 -S31A50004F0400A81BE90DC0A0E100D82DE90C309FE5002093E504FE -S31A50004F19B04CE2440092E500A81BE9684101000DC0A0E100D818 -S31A50004F2E2DE90010A0E10F00A0E304B04CE209F9FFEB00A81B4E -S31A50004F43E90DC0A0E110D82DE904B04CE20040A0E11900A0E38F -S31A50004F58FAF8FFEB0020A0E3244EA0E10F0054E304F19F9756B5 -S31A50004F6D0000EAB04F0050BC4F0050C44F0050D04F0050D84F4C -S31A50004F820050E04F0050EC4F0050F84F0050085000501C5000BF -S31A50004F97502C5000504C5000506C50005098500050C050005003 -S31A50004FACC8500050202FA0E1012002E2430000EA202FA0E10D53 -S31A50004FC10000EAA02EA0E1012002E23E0000EAA02EA0E10800C8 -S31A50004FD600EAA02FA0E13A0000EA0020E0E1A22FA0E1370000A8 -S31A50004FEBEA202EA0E1012002E2340000EA202EA0E1012022E28B -S31A50005000012002E2300000EA062200E2020252E30020A013010F -S31A5000501520A0032B0000EA062200E2022252E20120A0132700FB -S31A5000502A00EA092200E2000052E30030A0130130A003090252DB -S31A5000503FE30320A0110120A0031F0000EA092200E2010252E33D -S31A500050540030A0130130A003020152E30320A0110120A0031753 -S31A500050690000EA093200E2000053E309025313202FA0E101203D -S31A5000507E22E20030A0130130A003000053E3012002120020A0E1 -S31A50005093030C0000EA093200E2010253E302015313202FA0E12A -S31A500050A80030A0130130A003000053E3012002020120A01302B5 -S31A500050BD0000EA0120A0E3000000EA0020A0E30200A0E110A832 -S31A500050D21BE90DC0A0E130D82DE904B04CE20050A0E10F00053C -S31A500050E7E296F8FFEB0040A0E1100015E30200001A3E3D05E2BD -S31A500050FCC303A0E1020000EA0F0C05E22004A0E18DF8FFEB60A0 -S31A500051113005E2C332A0E1030053E303F19F97130000EA3451C1 -S31A5000512600503C510050445100504C5100501440A0E10D00003D -S31A5000513BEA3440A0E10B0000EA5440A0E1090000EA000050E3FA -S31A500051500600001AA440A0E11900A0E379F8FFEB020210E3027F -S31A500051653184E30340A011000000EA7440A0E10400A0E130A8D7 -S31A5000517A1BE90DC0A0E1F0D82DE904B04CE20040A0E10150A006 -S31A5000518FE1033305E2233DA0E1030053E303F19F97B90000EAD0 -S31A500051A4B451005034530050E853005044530050D8229FE5FF85 -S31A500051B932C5E3020053E10200001A0F0005E25EF8FFEBF0A891 -S31A500051CE1BE9047084E20F3A05E20F0A53E35200001AB0329F2C -S31A500051E3E5B0229FE5033005E0020053E14D00000A0F0805E283 -S31A500051F82008A0E151F8FFEB0060A0E1020415E30400001A056E -S31A5000520D0AA0E1200AA0E1AEFFFFEB0040A0E1030000EAFF407C -S31A5000522205E20F3C05E2A333A0E17443A0E11E3605E2A33AA0C1 -S31A50005237E10F0053E303F19F97390000EA845200508C52005045 -S31A5000524C945200509C520050A4520050AC520050C8520050EC99 -S31A500052615200502C5300502C5300502C5300502C5300501053A1 -S31A500052760050185300502053005028530050047006E0270000B3 -S31A5000528BEA047026E0250000EA067064E0230000EA047066E0C4 -S31A500052A0210000EA047086E01F0000EA1900A0E324F8FFEBA073 -S31A500052B50EA0E1010000E2043086E0007083E0180000EA190094 -S31A500052CAA0E31DF8FFEBA00EA0E1010000E2063064E00000501B -S31A500052DFE30370A011017043020F0000EA1900A0E314F8FFEB1C -S31A500052F4A00EA0E1010000E2043066E0000050E30370A011016B -S31A50005309704302060000EA047086E1040000EA0470A0E10200D4 -S31A5000531E00EA0470C6E1000000EA0470E0E10700A0E1F0A81BC5 -S31A50005333E964219FE5023005E0020053E10100001A040084E24B -S31A50005348F0A81BE9010615E3FBFFFF0A0F3A05E20F0A53E3F8E5 -S31A5000535DFFFF1A0F4805E22408A0E1F6F7FFEB083080E20F085A -S31A5000537254E30060A0110360A001010415E31600000A0204154C -S31A50005387E30900001A020515E30300000A053AA0E1233AA0E10B -S31A5000539C036086E00E0000EA053AA0E1233AA0E1066063E00A94 -S31A500053B10000EA020515E30400000A050AA0E1200AA0E142FF1E -S31A500053C6FFEB006086E0030000EA050AA0E1200AA0E13DFFFF69 -S31A500053DBEB066060E0000096E5F0A81BE9027415E21A00001A1E -S31A500053F0010615E3D2FFFF0A020915E3D0FFFF0A0F4805E2243C -S31A5000540508A0E1CEF7FFEB083080E20F0854E30060A0110360A8 -S31A5000541AA00107C0A0E10C20A0E178309FE5020505E20310055F -S31A5000542FE05132A0E1010013E301C08C12012082E20E0052E310 -S31A50005444F9FFFFDA000050E30C618610E2FFFF1A046046E2E090 -S31A50005459FFFFEA0500A0E1B7FEFFEB000050E3B5FFFF0AFF34B8 -S31A5000546EC5E30311A0E1020515E33F0381E308008012080081CE -S31A5000548302000084E0F0A81BE90000A0E3F0A81BE910FF2F015E -S31A500054980000BF0F00000F0110000002FFFF00000DC0A0E170FD -S31A500054ADD82DE90118A0E14128A0E1211EA0E1041041E204B077 -S31A500054C24CE20060A0E1023086E2015083E30B0051E301F19F4F -S31A500054D7973E0000EA0C550050D8550050D8550050D855005083 -S31A500054ECD8550050D8550050D8550050D8550050D855005038AC -S31A500055015500506C550050A45500500228A0E1C8309FE52208EF -S31A50005516A0E1033002E0470453E32C00001A780000E2A001A032 -S31A5000552BE185F7FFEB0050A0E1270000EA0238A0E10F0403E239 -S31A500055400002A0E12348A0E17DFEFFEB000050E32000000AFFD0 -S31A500055553004E28300A0E1800014E3800BE011A00BE011090039 -S31A5000556A00EA0238A0E1020313E32318A0E11600001A813AA0EF -S31A5000557FE1A33AA0E18300A0E1010B11E3800AE011A00AE01168 -S31A50005594043080E2033086E0015083E30C0000EA3E1BE0E302B2 -S31A500055A928A0E1013802E02302A0E1010312E38004E011A0041B -S31A500055BEE011B230D6E1013003E0830080E1042080E2022086D2 -S31A500055D3E0015082E30500A0E170A81BE9000087FF0DC0A0E161 -S31A500055E830D82DE90F00A0E304B04CE253F7FFEB0040A0E119B8 -S31A500055FD00A0E350F7FFEB200010E30600000A0400A0E1B01027 -S31A50005612D0E1A3FFFFEB88309FE5000083E580109FE50F000029 -S31A50005627EA005094E50500A0E143FEFFEB000050E30600000A71 -S31A5000563C0400A0E10510A0E15C409FE5CBFEFFEB000084E5505C -S31A50005651109FE5030000EA48209FE5043084E20210A0E1003024 -S31A5000566682E5004091E5010014E30600000A30309FE50120C4EB -S31A5000567BE3B000D2E128109FE5B000C3E1B010C2E130A81BE92F -S31A500056901C309FE5002094E518109FE5002083E5001084E53069 -S31A500056A5A81BE9288300002CB10000BEBEFFFF28B10000FEDE37 -S31A500056BAFFE70DC0A0E100D82DE944309FE50300A0E100109344 -S31A500056CFE504B04CE2000051E30B00000A010011E30400000A5D -S31A500056E428209FE5B020D2E10130C1E3B020C3E1020000EA18BF -S31A500056F9309FE5002093E5002081E50030A0E3003080E500A884 -S31A5000570E1BE9288300002CB1000028B100000DC0A0E100D82D78 -S31A50005723E904B04CE200A81BE90DC0A0E100D82DE904B04CE286 -S31A5000573800A81BE90DC0A0E100D82DE90F00A0E304B04CE2FDAD -S31A5000574DF6FFEB0C309FE5030050E10000A0130100A00300A81E -S31A500057621BE9A40800500DC0A0E110D82DE90F00A0E304B04CFE -S31A50005777E2F2F6FFEB0040A0E11900A0E3EFF6FFEB200010E3D4 -S31A5000578C02408412044084020F00A0E30410A0E1F1F6FFEB1008 -S31A500057A1A81BE90DC0A0E100D82DE96C309FE504B04CE200C0F3 -S31A500057B693E500005CE30100000A0000A0E300A81BE954209F84 -S31A500057CBE5001092E50130C1E3030050E10E00001A010011E3E1 -S31A500057E00200000AB430D2E1B030C0E1010000EA043092E500A4 -S31A500057F53080E50030A0E3003082E50300A0E310F9FFEB0300EE -S31A5000580AA0E3DBF8FFEB0100A0E300A81BE90C00A0E100A81B73 -S31A5000581FE92C83000030B100000DC0A0E130D82DE984209FE511 -S31A500058340030A0E380509FE504B04CE2001095E50040A0E100D5 -S31A500058493082E5030051E10100000A0100A0E1D1FFFFEB0030B1 -S31A5000585E95E5000053E31300001A1900A0E3B5F6FFEB200010A1 -S31A50005873E30600000A013084E3003085E53C209FE5B030D4E130 -S31A50005888B430C5E1B020C4E1040000EA004085E528209FE50052 -S31A5000589D3094E5043085E5002084E50300A0E3E6F8FFEB03007F -S31A500058B2A0E3B1F8FFEB30A81BE92C83000030B10000BEBEFF8E -S31A500058C7FFFEDEFFE70DC0A0E100D82DE910309FE5000093E53D -S31A500058DC04B04CE2000050E20100A01300A81BE930B100000DFF -S31A500058F1C0A0E100D82DE9001090E50000A0E30C0081E51C3057 -S31A50005906A0E31C3081E50820A0E3002081E504B04CE204008169 -S31A5000591BE5173043E2083081E5052042E20C2081E500A81BE9AB -S31A500059300DC0A0E100D82DE9000090E5FF1001E2203090E504A0 -S31A50005945B04CE2040013E30200001A203090E5040013E3FCFF49 -S31A5000595AFF0A141080E500A81BE90DC0A0E100D82DE9000090D8 -S31A5000596FE5203090E504B04CE2023013E20500000A143090E552 -S31A500059840030C1E50420A0E31C2080E50100A0E300A81BE90367 -S31A5000599900A0E100A81BE90DC0A0E130D82DE904B04CE204D054 -S31A500059AE4DE20050A0E115404BE20500A0E10410A0E1E7FFFF0C -S31A500059C3EB000050E3FAFFFF0A15005BE530A81BE90DC0A0E1DA -S31A500059D870D82DE904B04CE20160A0E10240A0E10430A0E101C9 -S31A500059ED4044E2000053E30050A0E10600000A0110D6E4050002 -S31A50005A02A0E1C9FFFFEB0430A0E1014044E2000053E3F8FFFFBE -S31A50005A171A70A81BE90DC0A0E170D82DE904B04CE20160A0E17E -S31A50005A2C0240A0E10430A0E1014044E2000053E30050A0E10623 -S31A50005A4100000A0500A0E1D4FFFFEB0430A0E1014044E2010090 -S31A50005A56C6E4000053E3F8FFFF1A70A81BE90DC0A0E1F0D82D96 -S31A50005A6BE904B04CE20050A0E1043095E50160A0E13C709FE574 -S31A50005A80033183E08340A0E1030000EA483097E56400A0E30F09 -S31A50005A95E0A0E103F0A0E10500A0E10610A0E1AEFFFFEB00001D -S31A50005AAA50E30200001A014044E2010074E3F3FFFF1AF0A81BC5 -S31A50005ABFE9500000000DC0A0E10E002DE910D82DE910B04CE2E5 -S31A50005AD404309BE50040A0E3043043E2030053E303F19F971E16 -S31A50005AE90000EA245B0050FC5A0050505B00505C5B005054207D -S31A50005AFE9FE50130A0E3003082E5001090E50C3091E50830837C -S31A50005B13E30C3081E5080090E5E1EBFFEB100000EA2C209FE5A5 -S31A50005B28004092E50030A0E3003082E5001090E50C3091E508D2 -S31A50005B3D30C3E30C3081E5080090E5CAEBFFEB050000EA084032 -S31A50005B5290E5030000EA4883000008309BE5044090E504308096 -S31A50005B67E50400A0E110A81BE90DC0A0E170D82DE904B04CE21F -S31A50005B7C04D04DE200C090E520409CE514309CE519304BE50463 -S31A50005B9120A0E31C208CE50050A0E3080090E50160A0E18300A4 -S31A50005BA600EB005086E5020014E30600000A19004BE20110A0EE -S31A50005BBBE3DFF9FFEB050050E10130A013003086150150A0E321 -S31A50005BD00500A0E170A81BE90DC0A0E170D82DE984509FE500C4 -S31A50005BE500E0E3343095E504B04CE20FE0A0E103F0A0E170403E -S31A50005BFA9FE50060A0E10400A0E139FFFFEB343095E50000A0B6 -S31A50005C0FE30FE0A0E103F0A0E1141095E550309FE550209FE5CD -S31A50005C24004081E5043081E548309FE5082081E50C3081E54069 -S31A50005C39209FE540309FE5102081E5143081E538209FE53830E4 -S31A50005C4E9FE5182081E51C3081E5342095E50600A0E10FE0A033 -S31A50005C63E102F0A0E170A81BE95000000030830000D4590050E6 -S31A50005C781C5A005030590050A0590050C45A0050705B005064EC -S31A50005C8D5A00500DC0A0E100D82DE91C209FE5003092E504B0AB -S31A50005CA24CE2000053E30200001A0130A0E3003082E5C7FFFF07 -S31A50005CB7EB00A81BE94C8300000DC0A0E130D82DE970E09FE5DC -S31A50005CCC00309EE504B04CE2000053E31700000A0E50A0E100A2 -S31A50005CE1000FE100400FE1C04084E304F029E100E095E5143035 -S31A50005CF69EE5003085E518109EE50020A0E318208EE500300FEE -S31A50005D0BE1C04000E2C030C3E3043083E103F029E100009EE5BC -S31A50005D2010209EE50CC09EE50FE0A0E10CF0A0E1003095E5007F -S31A50005D350053E3E8FFFF1A30A81BE938B100000DC0A0E100D8E2 -S31A50005D4A2DE904B04CE20C209FE5003092E5013083E200308257 -S31A50005D5FE500A81BE9E04101000DC0A0E110D82DE904B04CE2F8 -S31A50005D7434409FE5003094E5010053E30000001ACDFFFFEB001C -S31A50005D8930A0E3003084E51C309FE5002093E5000052E30200C4 -S31A50005D9E000A0130A0E3003084E5F2FFFFEA10A81BE9E041018B -S31A50005DB30038B100000DC0A0E100D82DE904B04CE243EBFFEB66 -S31A50005DC800A81BE90DC0A0E100D82DE904B04CE24BEBFFEB0086 -S31A50005DDDA81BE90DC0A0E1F0DF2DE90000E0E301DC4DE2C0618C -S31A50005DF29FE5343096E504B04CE20FE0A0E103F0A0E10090A0ED -S31A50005E07E1343096E50000A0E30FE0A0E103F0A0E19C019FE5E8 -S31A50005E1C9C319FE50050A0E3005083E5482096E590719FE50FC8 -S31A50005E31E0A0E102F0A0E1005087E584019FE584119FE58421AF -S31A50005E469FE584419FE50234A0E3003084E5D31000EB78019FEC -S31A50005E5BE5D11000EB74019FE5002094E5001097E56C419FE5DC -S31A50005E70CC1000EB68219FE568319FE50180A0E364A19FE54AFF -S31A50005E857F4BE2005083E5020054E10250A0E10300000A0FE048 -S31A50005E9AA0E104F094E4050054E1FBFFFF1A0A50A0E100609593 -S31A50005EAFE5000056E30F00000A30419FE530019FE5001094E51E -S31A50005EC4B71000EB0700A0E1002094E5011CA0E30040A0E382BB -S31A50005ED93262E0032182E0004085E58221A0E1161200EB020081 -S31A50005EEE70E30040850500608A15000058E30200000AF0009F57 -S31A50005F03E50080A0E3A61000EB0740A0E10400A0E1011CA0E3BD -S31A50005F18FA20A0E3091200EB000050E3050000AACC309FE50019 -S31A50005F2D2093E5000052E3EFFFFF0ADC1500EBEDFFFFEA06008E -S31A50005F42001A6C209FE5343092E50900A0E10FE0A0E103F0A062 -S31A50005F57E14EEAFFEBE5FFFFEA0400A0E1A41000EB000050E3B8 -S31A50005F6C0F0000DA88509FE50400A0E184409FE50510A0E1041E -S31A50005F8120A0E1210000EB003050E20400000A000095E504100A -S31A50005F96A0E10FE0A0E10CF093E5020000EA5C009FE50710A0B8 -S31A50005FABE17D1000EB0180A0E3CFFFFFEA50000000400D0300D7 -S31A50005FC0F04101008C42010004FC005034FC005040FC0050F425 -S31A50005FD54101004CFC005070FC0050948500009C8500008442CB -S31A50005FEA010094420100F84101007CFC0050B8FC0050CC43015E -S31A50005FFF008842010000420100C4FC0050F0AF1BE90DC0A0E128 -S31A50006014F0DD2DE904B04CE20040A0E10050A0E30170A0E102D4 -S31A5000602960A0E1D4809FE5D4A09FE5210000EA054186E720007D -S31A5000603E52E3015085E21A0000EA220053E31200001A052186D6 -S31A50006053E0043012E5040053E101408402044002050030D4E5A4 -S31A50006068000053E3220053130300000A0130F4E5000053E322A0 -S31A5000607D005313FBFFFF1A0030D4E5000053E30900001A780085 -S31A500060929FE5431000EB000000EA014084E20030D4E5FF200345 -S31A500060A7E2000052E30300000A200052E3E3FFFF1A0030A0E367 -S31A500060BC0130C4E40030D4E5000053E30800000A200053E30217 -S31A500060D100001A0130F4E5200053E3FCFFFF0A0030D4E5FF20DE -S31A500060E603E2000052E3D1FFFF1A005087E50800A0E100209651 -S31A500060FBE50A10A0E1030000EBF0AD1BE984840000F4840000AB -S31A50006110DCFC00500DC0A0E1F0DF2DE904B04CE20040A0E10224 -S31A5000612580A0E10800A0E101A0A0E1311000EB0450A0E10A0058 -S31A5000613A55E10090A0E12C00000A0800A0E1001095E50920A0A1 -S31A5000614FE1801000EB000050E32300001A000095E5251000EB7F -S31A50006164090050E11D0000DA0170A0E30A0054E11400000A044A -S31A500061790055E10F00000A0800A0E1001094E50920A0E171102F -S31A5000618E00EB006050E20900001A000057E30400000A58009FC7 -S31A500061A3E50810A0E1002095E50670A0E1FC0F00EB48009FE5C0 -S31A500061B8001094E5F90F00EB104084E20A0054E1EAFFFF1A0009 -S31A500061CD0057E30300001A2C009FE5F20F00EB0700A0E1F0AF4D -S31A500061E21BE90500A0E1F0AF1BE9105085E20A0055E1D2FFFF4E -S31A500061F71A0000A0E3F0AF1BE9F0FC005018FD00501CFD0050F3 -S31A5000620C0DC0A0E170D82DE904B04CE20040A0E10150A0E130D6 -S31A50006221009FE50260A0E1DE0F00EB050054E10700000A200068 -S31A500062369FE5002094E5083094E50610A0E1D70F00EB104084F3 -S31A5000624BE2050054E1F7FFFF1A70A81BE920FD005028FD0050BF -S31A500062600DC0A0E100D82DE90010C0E50C0080E904B04CE20487 -S31A50006275309BE50C3080E508209BE5102080E50C309BE5143030 -S31A5000628A80E500A81BE90DC0A0E1F0DF2DE904B04CE20CD04D5A -S31A5000629FE200C0A0E334C00BE50CE09BE501A0A0E32C000BE5DF -S31A500062B40A005EE100C0A01301C0A00308E09BE50180A0E130C5 -S31A500062C9300BE500005EE300C0A00300005CE334101B150010E3 -S31A500062DE8E1534301BE504C09BE530401BE50C0053E111000049 -S31A500062F3AA03C0A0E104009BE5103094E5000053E300C0831587 -S31A50006308041094E5000051E30600001A083094E5000053E30161 -S31A5000631D00000A020053E30100001A0C3094E5001083E5184033 -S31A5000633284E2010050E2EFFFFF1A2CE01BE50270A0E10E0057FC -S31A50006347E1870000AA071198E70030D1E52D0053E35300001A8C -S31A5000635C0050A0E330401BE50500A0E104209BE5016087E2019E -S31A5000637190D1E5020055E1440000AA0030D4E5030059E13C00F3 -S31A50006386001A103094E5000053E30600000A003093E500005398 -S31A5000639BE30300000A94019FE5141094E500A0A0E37D0F00EB57 -S31A500063B0043094E5000053E32000000A070198E70230D0E53DCA -S31A500063C50053E3035080020200000A073188E0017087E2045088 -S31A500063DA93E5082094E5000052E30200000A010052E30C0000BC -S31A500063EF0A0D0000EA0500A0E10C1094E50230A0E15D0000EB2C -S31A50006404006050E20700001A2C019FE50510A0E1142094E50680 -S31A50006419A0A0E1610F00EB010000EA0C3094E5005083E5102014 -S31A5000642E94E50130A0E3003082E5036087E00C0000EA083094B3 -S31A50006443E5000053E30200000A020053E30400000A060000EA91 -S31A500064580C2094E5003092E5013083E2010000EA0C2094E50166 -S31A5000646D30A0E3003082E50150A0E3040000EA010080E2043021 -S31A500064829BE5184084E2030050E1BAFFFFBA000055E330000063 -S31A500064971A0910A0E1A0009FE505A0A0E13F0F00EB2B0000EA4E -S31A500064AC08C09BE500005CE32400000A34E01BE500005EE30378 -S31A500064C100000A10109BE578009FE500A0A0E3340F00EB0C105D -S31A500064D69BE5000051E30200000A010051E30D00000A0F000040 -S31A500064EBEA08109BE50C209BE5070198E70230A0E11E0000EBD5 -S31A50006500004050E20800001A30009FE510209BE5071198E7049D -S31A50006515A0A0E1220F00EB020000EA073198E708209BE5003063 -S31A5000652A82E50130A0E334300BE5036087E0070000EA34FD00AB -S31A5000653F5044FD005060FD005074FD005020009FE5016087E234 -S31A50006554130F00EB08A09BE52CC01BE50670A0E10C0057E17709 -S31A50006569FFFFBA0A00A0E1000000EA84FD0050F0AF1BE90DC059 -S31A5000657EA0E1F0D92DE904B04CE200C0A0E10140A0E30A50A071 -S31A50006593E30060A0E30180A0E10270A0E10000DCE503E0A0E1BD -S31A500065A8200050E30200001A0130FCE5200053E3FCFFFF0A00AD -S31A500065BD30DCE5000053E33F00000A000054E30B00000AFF3088 -S31A500065D203E2300053E30800001A0130DCE5411043E2202083C6 -S31A500065E7E2FF2002E2190051E30230A091780053E31050A00303 -S31A500065FC02C08C020040A0E30110DCE40400A0E1302041E24117 -S31A500066113041E2050053E3090052830200009A613041E205005D -S31A5000662653E30000008A0100A0E3000050E31300000A0000A0D5 -S31A5000663BE3302041E2FF3002E2090053E30200A0910600009A79 -S31A50006650613041E2050053E3570041920200009A413041E20591 -S31A500066650053E337004192050050E1040000AA0030DCE595061A -S31A5000667A26E0000053E3D0FFFF1A0F0000EA00005EE30B00004C -S31A5000668F0A0E20A0E10030D2E5010000EA0130F2E5FF3003E2F9 -S31A500066A4000053E30100000A030051E1F9FFFF1A0030D2E5001D -S31A500066B90053E30100001A0000A0E3F0A91BE9006088E5000038 -S31A500066CE57E300C087150100A0E3F0A91BE90DC0A0E100D82D57 -S31A500066E3E90030D0E504B04CE2200053E30200001A0130F0E524 -S31A500066F8200053E3FCFFFF0A0000D0E5540050E30030A01301BD -S31A5000670D30A003740050E30130A003000053E30400001A460039 -S31A5000672250E3660050130200000A0300A0E100A81BE90130A003 -S31A50006737E3003081E50100A0E300A81BE90DC0A0E110D82DE902 -S31A5000674C020050E304B04CE20140A0E15A00001A040094E56CAC -S31A50006761119FE5CE0E00EB000050E31000001A00C00FE1004024 -S31A500067760FE1C04084E304F029E1101F11EE011A81E303108122 -S31A5000678BE3101F01EE101F11EE0F1081E3101F01EE00300FE1B3 -S31A500067A0C0400CE2C030C3E3043083E103F029E110A81BE904B5 -S31A500067B50094E518119FE5B80E00EB000050E33B00001A00C05A -S31A500067CA0FE100400FE1C04084E304F029E10E02A0E3021A80B0 -S31A500067DFE2202090E4000031E1FCFFFF1A160F07EE9A0F07EEDB -S31A500067F40000A0E10000A0E10000A0E10000A0E10000A0E100B5 -S31A5000680900A0E1101F11EE011AC1E3101F01EE151F07EE00006F -S31A5000681EA0E10000A0E10000A0E10000A0E10000A0E10000A0EA -S31A50006833E1101F11EE0C10C1E3101F01EE161F07EE0E02A0E350 -S31A50006848021A80E2202090E4000031E1FCFFFF1A160F07EE9AD9 -S31A5000685D0F07EE0000A0E10000A0E10000A0E10000A0E10000C8 -S31A50006872A0E10000A0E1151F07EE151F08EE0000A0E10000A045 -S31A50006887E10000A0E10000A0E10000A0E10000A0E1161F07EE97 -S31A5000689C171F08EE00300FE1C0400CE2C030C3E3043083E10326 -S31A500068B1F029E110A81BE91C009FE5041094E5380E00EB10A8B0 -S31A500068C61BE910009FE5350E00EB10A81BE9B0FD0050B4FD0037 -S31A500068DB50B8FD0050D0FD00500DC0A0E130D82DE934309FE58C -S31A500068F004B04CE230409FE50350A0E1030054E10700000A2426 -S31A50006905009FE5041094E5002094E5083094E5230E00EB104060 -S31A5000691A84E2050054E1F7FFFF1A30A81BE9F484000084840007 -S31A5000692F00DCFD00500DC0A0E130D82DE904B04CE208D04DE27F -S31A500069440050A0E1010055E30140A0E1020000CA64009FE51256 -S31A500069590E00EB1F0000EA18104BE20020A0E3040094E502302A -S31A5000696EA0E101FFFFEB000050E30300001A40009FE504109497 -S31A50006983E5070E00EB140000EA020055E30D0000DA1C104BE24C -S31A500069980020A0E3080094E50230A0E1F4FEFFEB000050E308A6 -S31A500069AD00001A10009FE5081094E5FA0D00EB070000EAECFD74 -S31A500069C2005004FE005020FE00502030A0E31C300BE518001B18 -S31A500069D7E51C101BE5221000EB30A81BE90DC0A0E170D82DE99F -S31A500069EC04B04CE23CD04DE23C304BE240204BE200308DE5005B -S31A50006A0140A0E104208DE530604BE284319FE50600A0E108301E -S31A50006A168DE50150A0E178319FE57710A0E300C093E50120A0A1 -S31A50006A2BE344C00BE50030A0E309FEFFEB0120A0E300208DE54F -S31A50006A4044304BE204308DE50010A0E308108DE548319FE50486 -S31A50006A5500A0E10C308DE50510A0E10630A0E109FEFFEB000069 -S31A50006A6A50E34D00000A40301BE5000053E30C00000A20019FBB -S31A50006A7FE544101BE53C201BE5C60D00EB38004BE23C201BE598 -S31A50006A940810A0E3823262E0032182E08221A0E1270F00EB0239 -S31A50006AA90070E33D00000A44301BE500C00FE100400FE1C04094 -S31A50006ABE84E304F029E10E02A0E3021A80E2202090E400003112 -S31A50006AD3E1FCFFFF1A160F07EE9A0F07EE0000A0E10000A0E1A9 -S31A50006AE80000A0E10000A0E10000A0E10000A0E1101F11EE0110 -S31A50006AFD1AC1E3101F01EE151F07EE0000A0E10000A0E1000027 -S31A50006B12A0E10000A0E10000A0E10000A0E1101F11EE0C10C109 -S31A50006B27E3101F01EE161F07EE0E02A0E3021A80E2202090E413 -S31A50006B3C000031E1FCFFFF1A160F07EE9A0F07EE0000A0E1008F -S31A50006B5100A0E10000A0E10000A0E10000A0E10000A0E1151F20 -S31A50006B6607EE151F08EE0000A0E10000A0E10000A0E10000A082 -S31A50006B7BE10000A0E10000A0E1161F07EE171F08EE0FE0A0E106 -S31A50006B9003F0A0E1030000EA40FE00509042010050FE005064D6 -S31A50006BA5FE005070A81BE90DC0A0E100D82DE908009FE504B09F -S31A50006BBA4CE2790D00EB00A81BE9D4FE00500DC0A0E1F0D92DBF -S31A50006BCFE904B04CE20150A0E10070A0E30530A0E1015045E29D -S31A50006BE4070053E10080A0E10260A0E1470000DA0FE0A0E1088E -S31A50006BF9F0A0E1FF4000E20FE0A0E108F0A0E10010A0E33020D3 -S31A50006C0E44E2413044E2050053E309005283FFE000E202000082 -S31A50006C239A613044E2050053E30000008A0110A0E3000051E328 -S31A50006C382F00000A00C0A0E330004EE2FF1000E241204EE2FF94 -S31A50006C4D3002E2050053E3090051830200009A61304EE205004E -S31A50006C6253E30000008A01C0A0E300005CE32100000A0774A03E -S31A50006C77E100C0A0E3301044E2FF3001E2090053E301C0A091E5 -S31A50006C8C0600009A613044E2050053E357C044920200009A4141 -S31A50006CA13044E2050053E337C044920010A0E3FF3000E209007D -S31A50006CB653E30010A0910600009A61304EE2050053E357104EAB -S31A50006CCB920200009AFF3002E2050053E337104E920C2281E12B -S31A50006CE0027087E1000056E30500000A003096E5023083E000E7 -S31A50006CF53086E5010000EA0000E0E3F0A91BE90530A0E1015047 -S31A50006D0A45E2000053E3B7FFFFCA0700A0E1F0A91BE90DC0A0B0 -S31A50006D1FE1F0DF2DE90120A0E304B04CE268D04DE288200BE5BE -S31A50006D340070A0E38C700BE50030E0E390300BE50790A0E180DA -S31A50006D49100BE50080A0E1930000EA530052E30300000A0402C6 -S31A50006D5E9FE50710A0E10F0D00EB910000EA0FE0A0E108F0A024 -S31A50006D73E1027087E200C0A0E10800A0E10110A0E37C204BE2D2 -S31A50006D880030A0E37C300BE5FF600CE28BFFFFEB004050E27CA2 -S31A50006D9DA04BE2030000AAC0019FE50710A0E1FD0C00EB7F00C1 -S31A50006DB200EA017087E2303046E2090053E303F19F976200005F -S31A50006DC7EA946F0050F06D0050F06D0050F06D0050546F00500A -S31A50006DDC546F0050546F0050206F0050206F0050206F00500881 -S31A50006DF100A0E12F1046E20A20A0E171FFFFEB0050A0E12F301A -S31A50006E0647E288201BE5067083E084500BE5000052E30A000074 -S31A50006E1B0A80301BE5000053E30400000A039065E03C019FE575 -S31A50006E300910A0E1DB0C00EB000000EA80901BE50020A0E38866 -S31A50006E45200BE524319FE5001093E5095085E090301BE50520CE -S31A50006E5A69E0030052E10230A03190300BE5010055E103000061 -S31A50006E6F3A00319FE5002093E5020055E10300009AF4009FE5E4 -S31A50006E840510A0E1C60C00EB480000EA2E3084E2034066E004CD -S31A50006E997087E00430A0E1014044E2000053E3080000DA08007B -S31A50006EAEA0E10110A0E30A20A0E142FFFFEB0430A0E101404454 -S31A50006EC3E20100C5E4000053E3F6FFFFCA0800A0E10110A0E3C7 -S31A50006ED80020A0E339FFFFEB017087E20000E0E17C205BE5FF14 -S31A50006EED3000E27C200BE5020053E10200000A84101BE578004E -S31A50006F029FE5A70C00EB8C201BE5053069E0020053E10320A0DF -S31A50006F17218C200BE51C0000EA0800A0E13B1066E20A20A0E185 -S31A50006F2C25FFFFEB4C309FE590201BE50050A0E144009FE500A3 -S31A50006F415083E58C301BE50510A0E1950C00EB170000EA071037 -S31A50006F56A0E12C009FE50620A0E1900C00EB120000EAF0FE0087 -S31A50006F6B501CFF005040FF00508C420100F441010058FF0050C5 -S31A50006F8094FF005090420100D0FF0050F8FF0050017087E20FA1 -S31A50006F95E0A0E108F0A0E10A0050E3FAFFFF1A0FE0A0E108F000 -S31A50006FAAA0E1002050E267FFFFCAF0AF1BE90DC0A0E130D82D54 -S31A50006FBFE9B4309FE504B04CE2085193E50340A0E1000055E367 -S31A50006FD42100001A143194E5000053E30900000A183194E590BE -S31A50006FE9209FE50310D2E78C009FE5013083E2183184E5690C00 -S31A50006FFE00EB183194E5060053E3185184850C3194E5FF0053C5 -S31A50007013E3060000CA143194E5000053E30100000A5C009FE580 -S31A500070285E0C00EB0000E0E330A81BE9043084E20300A0E101EA -S31A5000703D1CA0E3043184E5112E84E20FE0A0E100F094E50C0120 -S31A5000705284E5080184E5000050E3EDFFFFBA083194E5042194B5 -S31A50007067E5013043E2083184E50100D2E4042184E530A81BE9C0 -S31A5000707C3CB100005083000024000150280001500DC0A0E100AD -S31A50007091D82DE920309FE504B04CE200C0A0E308C183E5012C4F -S31A500070A6A0E30C2183E5000083E5141183E518C183E500A81B6E -S31A500070BBE93CB100000DC0A0E100D82DE914309FE5042083E207 -S31A500070D0042183E50C1193E504B04CE2081183E500A81BE93CE8 -S31A500070E5B100000DC0A0E1F0DD2DE90C20A0E304B04CE2C0D03D -S31A500070FA4DE20080A0E130604BE20600A0E10040A0E3B8400BF1 -S31A5000710FE50170A0E1D0400BE50410A0E1BF0C00EB0150A0E31F -S31A50007124BA524BE1BC424BE1B0304BE200308DE504A0A0E104C6 -S31A50007139A08DE538339FE50C20A0E3B8224BE17610A0E30830F4 -S31A5000714E8DE5AC404BE224339FE50400A0E114C093E50A20A0D5 -S31A50007163E130C00BE50230A0E33BFCFFEBB4304BE200308DE577 -S31A5000717894004BE200339FE57210A0E308308DE50A20A0E104D6 -S31A5000718DA08DE50230A0E331FCFFEBB8304BE200308DE5BC2026 -S31A500071A24BE204208DE57C004BE2D4329FE56210A0E308308DD2 -S31A500071B7E50520A0E10A30A0E126FCFFEBC0304BE200308DE55C -S31A500071CCC4204BE204208DE564004BE2AC329FE56D10A0E308B6 -S31A500071E1308DE50520A0E10530A0E11BFCFFEBC8304BE20030EF -S31A500071F68DE5CC204BE204208DE54C004BE284329FE56810A042 -S31A5000720BE308308DE50520A0E10530A0E110FCFFEB0530A0E381 -S31A5000722000308DE5D0204BE224008DE90800A0E15C329FE50708 -S31A5000723510A0E10C308DE50520A0E10430A0E111FCFFEB00005D -S31A5000724A50E3AB00000ACC301BE5000053E30800000AC8001BCA -S31A5000725FE50610A0E1B01100EB000050E30300001A20029FE5A6 -S31A50007274C8101BE5CA0B00EB9F0000EAC4301BE5000053E3164E -S31A5000728900000AC0001BE504129FE5020C00EB000050E301A069 -S31A5000729EA0031000000AC0001BE5F0119FE5FC0B00EB00005041 -S31A500072B3E30700001AE4319FE5002093E500A0A0E1000052E3E5 -S31A500072C80600001AD4019FE5B40B00EB890000EACC019FE5C0B4 -S31A500072DD101BE5B00B00EB850000EA00005AE30700001AD030C3 -S31A500072F21BE5000053E30400001AAC019FE5A80B00EBA8019FC6 -S31A50007307E5A60B00EB7B0000EA00005AE32900001A0610A0E11E -S31A5000731C0120A0E3D4404BE2D0001BE50430A0E1F00D00EB00B4 -S31A500073315050E2070000AAD4001BE5D0401BE5E90E00EB0020D8 -S31A50007346A0E168019FE50410A0E1940B00EB690000EA5C019F00 -S31A5000735BE5B0101BE50A60A0E148FFFFEB50819FE534704BE2E0 -S31A50007370010000EA0650C7E7016086E2030056E30400008A0B25 -S31A50007385FFFFEB005050E2F8FFFFAA103198E5D4300BE50000E0 -S31A5000739A55E3070000AAD4001BE5D00E00EB0010A0E110019FC1 -S31A500073AFE57C0B00EB0400A0E12D0E00EB4F0000EA01005AE3FA -S31A500073C40200001AF8009FE5750B00EB4A0000EA39FFFFEBB451 -S31A500073D9301BE5000053E31100000ABC301BE5000053E30200A4 -S31A500073EE001AD4009FE56B0B00EB3A0000EAB8401BE5C8609F7E -S31A50007403E5000000EA0150C4E4E9FEFFEB005050E2FBFFFFAA60 -S31A500074180600A0E1B8101BE50420A0E15F0B00EB2E0000EA3375 -S31A5000742D004BE29C109FE50320A0E3B20B00EB000050E3020014 -S31A50007442001A8C009FE5D7FDFFEB250000EA34305BE55300539E -S31A50007457E31F00001A33305BE5303043E2090053E31B00008AA2 -S31A5000746C64009FE5B8101BE528FEFFEB1A0000EA84000150A07C -S31A500074814201008C0001509C000150AC000150CC000150E40095 -S31A500074960150F00001500801015010010150CC43010018010113 -S31A500074AB5040010150540101502C0001506801015094AC005027 -S31A500074C03CB1000080010150A4010150D0010150F40101500C38 -S31A500074D5020150B86F005018009FE534101BE52F0B00EB00007D -S31A500074EA5AE30300001AD4004BE2DE0D00EB000000EA10020109 -S31A500074FF50F0AD1BE90DC0A0E100D82DE90010A0E118009FE5C8 -S31A5000751404B04CE2220B00EB10009FE510109FE510209FE537EF -S31A50007529FBFFEB00A81BE970040150148400008484000090046D -S31A5000753E01500DC0A0E1F0DF2DE904B04CE230D04DE20070A03D -S31A50007553E344304BE20060A0E140504BE244700BE50500A0E181 -S31A5000756800308DE50140A0E144329FE56610A0E308308DE507B0 -S31A5000757D20A0E104708DE50230A0E334FBFFEB0130A0E3880012 -S31A500075928DE80600A0E120329FE50410A0E10C308DE50220A0B7 -S31A500075A7E308708DE50530A0E136FBFFEB070050E1A000000AF9 -S31A500075BC00029FE52F0D00EB070050E10200001AF4019FE5F4F6 -S31A500075D10A00EB990000EAEC019FE5F10A00EB44301BE500000C -S31A500075E653E31900000ADCC19FE548304BE2D8E19FE50320A01B -S31A500075FBE1D4119FE50380A0E100409EE50C60A0E100009CE5A6 -S31A500076100EA0A0E1003091E5840080E0043043E2940301E09CE9 -S31A500076251200EB005050E20D00000A48401BE50500A0E13E1305 -S31A5000763A00EB0410A0E10030A0E190019FE50520A0E1D50A001A -S31A5000764FEB040000EA84019FE570619FE570A19FE5D00A00EB3F -S31A5000766448804BE274919FE50010A0E3004099E5012CA0E30438 -S31A5000767900A0E1670B00EB60319FE5030093E8030084E8003096 -S31A5000768E96E5103084E5012CA0E3143084E50050A0E318508451 -S31A500076A3E50510A0E1024084E00400A0E15A0B00EB30C19FE511 -S31A500076B80F009CE80F0084E8003096E500209AE5023083E0106A -S31A500076CD3084E5143084E50510A0E1185084E5012CA0E30240B3 -S31A500076E284E00400A0E14C0B00EBFCC09FE50F009CE804E0A0BB -S31A500076F7E10700AEE8F0609FE50130CEE42324A0E10120CEE458 -S31A5000770C2338A0E10030CEE500209AE5003096E5823043E01024 -S31A500077213084E5182084E50510A0E1143084E5012CA0E302408E -S31A5000773684E00400A0E1370B00EBB0C09FE50F009CE804E0A0C7 -S31A5000774BE10700AEE80130CEE42334A0E10030CEE5017087E2DD -S31A50007760003096E5017087E200109AE5017087E2036061E0101C -S31A500077756084E5017087E2146084E50820A0E1181084E50600E9 -S31A5000778AA0E1421200EB005050E21800000A48401BE50500A003 -S31A5000779FE1E41200EB0410A0E10030A0E128009FE50520A0E125 -S31A500077B47B0A00EB200000EA98040150C0020150C4040150F4E3 -S31A500077C90401500005015058B2000060B2000064B2000024054F -S31A500077DE01504C05015068B20000940501509C050150AC0501A5 -S31A500077F3505CB20000BC0501500600A0E10724A0E1001099E5FA -S31A500078080830A0E1721200EB005050E20900000A48401BE505CB -S31A5000781D00A0E1C41200EB0410A0E10030A0E108009FE50520C7 -S31A50007832A0E15B0A00EB000000EACC050150F0AF1BE90DC0A0FE -S31A50007847E170D82DE96C309FE56C009FE508D04DE268409FE554 -S31A5000785C001093E5002094E504B04CE2015062E04D0A00EB00E9 -S31A500078713094E50060A0E3230456E11400002A0030D5E5FF009B -S31A5000788653E30700000A102085E20C1092E800C08DE51C109530 -S31A5000789BE504108DE524009FE50510A0E13E0A00EB016086E2DD -S31A500078B0003094E5015C85E2230456E1030000EA5CB20000FCAB -S31A500078C505015060B2000040060150EAFFFF3A70A81BE90DC04E -S31A500078DAA0E170D82DE9B4309FE5B4109FE504B04CE2B0C09FC3 -S31A500078EFE5002093E5005091E500009CE50C60A0E1804082E05B -S31A500079040410A0E1050054E11C00002A003094E5010073E315EE -S31A5000791900000A040051E10200000A7C009FE50420A0E11D0AEB -S31A5000792E00EB0410A0E1050054E10B00002A003094E5010073E2 -S31A50007943E30800000A54309FE5002093E50320C2E3021081E009 -S31A50007958050051E10200002A003091E5010073E3F9FFFF1A0152 -S31A5000796D40A0E1E4FFFFEA003096E50330C3E3034084E0E0FF18 -S31A50007982FFEA040051E10200000A14009FE50420A0E1030A0025 -S31A50007997EB70A81BE958B200005CB2000060B200006C06015091 -S31A500079AC0DC0A0E130D82DE9BC309FE5BC409FE5002093E5007C -S31A500079C1E094E504B04CE2B0C09FE58E2082E000E09CE500506B -S31A500079D6A0E102C0A0E10E005CE11A00002A0400A0E1003092AC -S31A500079EBE5010073E31100000A02005CE10200000A02306CE011 -S31A50007A00430151E11600009A02C0A0E10E005CE10700002A0036 -S31A50007A153090E50320C3E302C08CE00E005CE10200002A0030C3 -S31A50007A2A9CE5010073E3F9FFFF1A0C20A0E1020000EA003090AF -S31A50007A3FE50330C3E3032082E00E0052E1E5FFFF3A02005CE1FC -S31A50007A540500000A02306CE0430151E10200008A00C085E5010D -S31A50007A6900A0E330A81BE90000A0E330A81BE958B2000060B2D8 -S31A50007A7E00005CB200000DC0A0E1F0DF2DE904B04CE2B8D04DA5 -S31A50007A93E20040A0E3A8400BE5B0400BE50080A0E1B8400BE542 -S31A50007AA8A0604BE2C0400BE50600A0E1C8400BE5A4304BE200D6 -S31A50007ABD308DE5A8204BE204208DE50170A0E144339FE56210D2 -S31A50007AD2A0E308308DE50120A0E30430A0E1DEF9FFEBAC304BDB -S31A50007AE7E200308DE5B0204BE204208DE588004BE21C339FE595 -S31A50007AFC7210A0E308308DE50120A0E30430A0E1D3F9FFEBB4AD -S31A50007B11304BE200308DE5B8204BE204208DE570004BE2F432AC -S31A50007B269FE56510A0E308308DE50120A0E30430A0E1C8F9FFB5 -S31A50007B3BEB58004BE2C0304BE204308DE5BC504BE2D0329FE5ED -S31A50007B506610A0E308308DE50120A0E300508DE50430A0E1BD4F -S31A50007B65F9FFEBC4304BE200308DE5C8204BE204208DE5400024 -S31A50007B7A4BE2A4329FE56C10A0E308308DE50120A0E30430A0F8 -S31A50007B8FE1B2F9FFEB0530A0E300308DE5CC204BE204208DE50C -S31A50007BA4043043E208308DE50800A0E174329FE50710A0E10C1C -S31A50007BB9308DE50220A0E30630A0E1B1F9FFEB040050E1020098 -S31A50007BCE001A58029FE54AFEFFEB0D0100EAA8301BE5000053FF -S31A50007BE3E30500000AC8301BE5000053E30200000ACC301BE50F -S31A50007BF8000053E30200001A2C029FE53EFEFFEB010100EAC04C -S31A50007C0D301BE5000053E31800000ABC001BE5E91000EB006084 -S31A50007C2250E20600001ABC001BE5C4301BE5030080E001004051 -S31A50007C37E2E21000EB006050E20D00000ABC401BE50600A0E1F7 -S31A50007C4CB91100EB0020A0E1DC019FE50410A0E1510900EBD468 -S31A50007C61019FE5D4319FE5D4C19FE5001093E500209CE54B0914 -S31A50007C7600EBE50000EAC4619FE5A4101BE5003096E5BC419F45 -S31A50007C8BE5030051E10400003AC4301BE5002094E5033081E015 -S31A50007CA0020053E10600003AA0019FE53D0900EB84019FE500A4 -S31A50007CB51096E5002094E5390900EBD30000EACC001BE54B0936 -S31A50007CCA00EB0F0050E30300009A78019FE51010A0E3310900AB -S31A50007CDFEBCB0000EAC0301BE5000053E30800001AC4101BE57E -S31A50007CF40500A0E12BFFFFEB000050E30300001A4C019FE5C4A6 -S31A50007D09101BE5250900EBBF0000EA28319FE53C519FE53C41D2 -S31A50007D1E9FE5001093E5002095E50080A0E3000094E5019062E5 -S31A50007D33E00910A0E1980700EB003095E50860A0E1007094E565 -S31A50007D48230458E11700002A0030D7E5FF0053E30F00000ACC29 -S31A50007D5D001BE50710A0E1310900EB000050E30A00001A102077 -S31A50007D7297E5BC301BE5030052E18900001ADC009FE5CC101B0E -S31A50007D87E53D0B00EB000050E39F00000A0180A0E3040000EAAB -S31A50007D9C016086E2003095E5017C87E2230456E1E7FFFF3ABCEA -S31A50007DB1101BE5C4201BE5000058E30C00001A003095E59400D4 -S31A50007DC69FE50860A0E1007090E5020000EA016086E200309586 -S31A50007DDBE5017C87E2230456E10200002A0030D7E5FF0053E3C7 -S31A50007DF0F7FFFF1A0100A0E1021081E0011041E2701300EB0082 -S31A50007E058050E21700000A54009FE5E40800EB7E0000EA84069E -S31A50007E1A015098060150AC060150C0060150DC060150E4060185 -S31A50007E2F50F006015004070150200701504007015058B20000DB -S31A50007E445CB200008C420100F44101005C07015078070150A894 -S31A50007E5907015060B2000068B20000FC0701501808015001A0D4 -S31A50007E6EA0E3BC001BE5D0404BE2C4101BE50420A0E18510001F -S31A50007E83EB006050E20800000A0600A0E1D0401BE508A0A0E145 -S31A50007E98261100EB0410A0E10030A0E108019FE50620A0E1BD26 -S31A50007EAD0800EB00005AE30E00000ABC001BE5A4101BE5C420CE -S31A50007EC21BE5D0304BE2C31000EB006050E20700000AD0401B9C -S31A50007ED7E50600A0E1151100EB0410A0E10030A0E1C8009FE531 -S31A50007EEC0620A0E1AC0800EB0700A0E10010A0E3012CA0E346D4 -S31A50007F010900EBCC101BE50700A0E1D70800EBBC301BE5B02037 -S31A50007F161BE5103087E5000052E30500001AC0301BE5000053BD -S31A50007F2BE3BC201B150200001AA4201BE5000000EAAC201BE566 -S31A50007F40B8301BE5142087E5000053E30200001A64309FE500E4 -S31A50007F553093E5000000EAB4301BE51C3087E5C4301BE5183057 -S31A50007F6A87E50900A0E1001095E5D0204BE2471000EB0060501D -S31A50007F7FE21000000AD0401BE50600A0E1E91000EB0410A0E18B -S31A50007F940030A0E120009FE50620A0E1800800EB1A0000EA14FB -S31A50007FA9009FE57D0800EB170000EA4C08015070080150904238 -S31A50007FBE010094080150D00701503C309FE5001093E50900A021 -S31A50007FD3E1002095E5D0304BE27E1000EB006050E20A00000A7C -S31A50007FE8D0401BE50600A0E1D01000EB0410A0E10030A0E10C7A -S31A50007FFD009FE50620A0E1670800EB010000EA68B20000B408D3 -S31A500080120150F0AF1BE90DC0A0E1F0D82DE904B04CE254D04D90 -S31A50008027E20040A0E30070A0E14C504BE254400BE50500A0E185 -S31A5000803C5C400BE550304BE200308DE554204BE204208DE501C6 -S31A5000805160A0E128319FE56610A0E308308DE50120A0E304308B -S31A50008066A0E17CF8FFEB58304BE200308DE55C204BE204208D1F -S31A5000807BE534004BE200319FE56C10A0E308308DE50120A0E352 -S31A500080900430A0E171F8FFEB0220A0E314008DE8E4309FE507B0 -S31A500080A500A0E10C308DE50610A0E108408DE50530A0E174F8CE -S31A500080BAFFEB040050E10200001AC4009FE50DFDFFEB4600009E -S31A500080CFEA54301BE5000053E30200000A5C301BE5000053E3D4 -S31A500080E40200001AA4009FE504FDFFEB3D0000EA50001BE5B2D9 -S31A500080F90F00EB005050E20600001A50001BE558301BE50300A5 -S31A5000810E80E0010040E2AB0F00EB005050E20D00000A50401B9A -S31A50008123E50500A0E1821000EB0020A0E160009FE50410A0E1EF -S31A500081381A0800EB58009FE558309FE558C09FE5001093E500C3 -S31A5000814D209CE5140800EB240000EA50101BE558301BE5010028 -S31A50008162A0E1031081E0011041E2951200EB000050E30C0000B8 -S31A500081770A28009FE5090800EB190000EAC0060150DC0601509E -S31A5000818CC0020150F0060150D808015020070150400701505895 -S31A500081A1B200005CB200001808015050001BE558101BE560200A -S31A500081B64BE2B70F00EB005050E20900000A60401BE50500A0A6 -S31A500081CBE1591000EB0410A0E10030A0E108009FE50520A0E19C -S31A500081E0F00700EB000000EA94080150F0A81BE90DC0A0E1F0A1 -S31A500081F5DF2DE904B04CE218D04DE20060A0E300608DE52C3020 -S31A5000820A4BE204308DE50120A0E308208DE548319FE50C308D32 -S31A5000821FE5022082E00630A0E118F8FFEB060050E10200001A87 -S31A5000823430019FE5B1FCFFEB660000EA28319FE528519FE52841 -S31A50008249419FE5001093E5002095E50680A0E1000094E501A0C2 -S31A5000825E62E00A10A0E14D0600EB006094E50270A0E3026C86D8 -S31A50008273E2010000EA017087E2016C86E2EC909FE5003099E576 -S31A50008288230457E10D00002A0030D6E5FF0053E3F6FFFF0A2CAB -S31A5000829D001BE50610A0E1E10700EB000050E3F1FFFF1AC4000C -S31A500082B29FE52C101BE5F10900EB000050E34500000A0180A019 -S31A500082C7E3000058E30300001AA8009FE52C101BE5B20700EB05 -S31A500082DC3E0000EA100096E530704BE2181096E50720A0E16903 -S31A500082F10F00EB005050E20700000A30401BE50500A0E10B1084 -S31A5000830600EB0410A0E10030A0E16C009FE50520A0E1A207009C -S31A5000831BEB0600A0E1FF10A0E3012CA0E33C0800EB0A00A0E189 -S31A50008330001099E50720A0E1570F00EB005050E21000000A308F -S31A50008345401BE50500A0E1F90F00EB0410A0E10030A0E12400AA -S31A5000835A9FE50520A0E1900700EB1C0000EAEC080150F00601CA -S31A5000836F505CB2000060B2000068B20000F80801500C09015062 -S31A500083849408015040309FE5001093E53C309FE5002093E50A93 -S31A5000839900A0E10730A0E18D0F00EB005050E20B00000A3040B2 -S31A500083AE1BE50500A0E1DF0F00EB0410A0E10030A0E110009F10 -S31A500083C3E50520A0E1760700EB020000EA68B2000060B2000044 -S31A500083D8B4080150F0AF1BE90DC0A0E1F0D82DE904B04CE21468 -S31A500083EDD04DE20060A0E300608DE520304BE204308DE501202D -S31A50008402A0E308208DE5D4309FE50C308DE5022082E00630A062 -S31A50008417E19CF7FFEB060050E10200001ABC009FE535FCFFEBEE -S31A5000842C3D0000EAB4309FE5B4409FE5B4509FE5001093E500CE -S31A500084412094E50670A0E1000095E5011062E0D20500EB005061 -S31A5000845695E5010000EA016086E2015C85E2003094E5230456A3 -S31A5000846BE10800002A0030D5E5FF0053E3F7FFFF0A20001BE555 -S31A500084800510A0E1690700EB000050E3F2FFFF1A0170A0E3006F -S31A500084950057E30300001A54009FE520101BE53F0700EB1E00CE -S31A500084AA00EA48209FE5140095E5003092E5030050E105000023 -S31A500084BF3A38309FE518C095E5001093E50C2080E0010052E192 -S31A500084D40B00003A24009FE5310700EB100000EAEC080150F0FE -S31A500084E90601505CB2000060B2000068B200000C0901508C4263 -S31A500084FE0100F441010024090150101095E50C20A0E1A2050070 -S31A50008513EB08209FE51C3095E5003082E5000000EA904201004C -S31A50008528F0A81BE90DC0A0E1F0D92DE944209FE504D04DE20034 -S31A5000853D4092E504B04CE2000054E32700001A30809FE5011875 -S31A50008552A0E3000098E50130A0E3003082E5010840E2820E00B8 -S31A50008567EB001050E20600000A10009FE50B0700EB0400A0E156 -S31A5000857C1B0000EA58830000F44101003C09015060709FE56034 -S31A50008591609FE50100A0E15C409FE50710A0E10620A0E19B0E11 -S31A500085A600EB50509FE50400A0E10510A0E1A80E00EB44009FBC -S31A500085BBE5001097E5002096E500C094E5003095E500C08DE534 -S31A500085D0F40600EB003094E5002098E524109FE5013883E202BD -S31A500085E52063E0002081E50100A0E3050000EA58B200005CB2B7 -S31A500085FA000060B2000064B200006409015068B20000F0A91B62 -S31A5000860FE90DC0A0E130D82DE904B04CE20050A0E1010055E3BF -S31A500086240140A0E1020000CA48009FE5B3FBFFEB30A81BE9BB62 -S31A50008639FFFFEB000050E30C00000A34009FE534109FE5042000 -S31A5000864E94E5AFF6FFEB003050E20400000A0500A0E10410A00F -S31A50008663E10FE0A0E10CF093E530A81BE910009FE5A2FBFFEBF0 -S31A5000867830A81BE9900901501484000084840000A40901500D26 -S31A5000868DC0A0E1F0DD2DE904B04CE264D04DE20080A0E10140D7 -S31A500086A2A0E1080098E502A0A0E1000050E30D00000A80104B1F -S31A500086B7E20120A0E3AE0100EB0C2098E5000052E30200000A4E -S31A500086CC80301BE5000053E35400000A000052E30200001A802E -S31A500086E1301BE5000053E34F00001A28039FE528339FE50410BD -S31A500086F698E5036084E0A90600EB103098E5013043E2050053D0 -S31A5000870BE303F19F97410000EA2C8700504C870050B08700501E -S31A50008720B88700505C87005074870050F0229FE5003096E5ECB4 -S31A50008735129FE5EC029FE5000053E30210A001970600EB33002D -S31A5000874A00EADC029FE5001096E5930600EB2F0000EA0600A0AA -S31A5000875FE1BF0C00EB0010A0E1BC029FE58D0600EB290000EAB4 -S31A500087740050A0E3B4429FE50510D6E70400A0E1870600EB047A -S31A500087890055E30100008AA0029FE5830600EB015085E205006B -S31A5000879E55E3F5FFFF9A90029FE57E0600EB1A0000EA88029FF9 -S31A500087B3E51B0000EA84029FE50650A0E1780600EB0030D6E53C -S31A500087C80640A0E1000053E31100000A6C729FE50030D5E50AD8 -S31A500087DD0053E30200000A0130F4E50A0053E3FCFFFF1A07008A -S31A500087F2A0E10030A0E30030C4E50510A0E1680600EB0A30A046 -S31A50008807E30130C4E40450A0E10030D5E5000053E3EEFFFF1A4F -S31A5000881C00005AE30300000A18029FE55E0600EB0200A0E38AAB -S31A500088310000EA103098E5040053E31300000A74404BE20400F9 -S31A50008846A0E15010A0E30A20A0E1BC0700EB000050E30000E0F7 -S31A5000885BE30470A0E17E0000BA0700A0E1630600EB000050E393 -S31A50008870EDFFFF0A74305BE52E0053E30A00A0017600000A5ED7 -S31A500088850053E30300A0037300000A103098E5013043E2050017 -S31A5000889A53E303F19F976D0000EABC880050D0880050548A00A2 -S31A500088AF5080890050EC8800501C89005074004BE2004096E5A0 -S31A500088C40610A0E183F7FFEB0A0000EA74004BE20610A0E10022 -S31A500088D920A0E3004096E50230A0E124F7FFEB030000EA7400BD -S31A500088EE4BE2004096E50610A0E10B0C00EB000050E30400A0C7 -S31A50008903E35500000A000096E5000054E10100A0130200A003BE -S31A50008918500000EA7C404BE20400A0E10610A0E10620A0E39B71 -S31A5000892D0400EB0050A0E304A0A0E184404BE274304BE288307E -S31A500089420BE588704BE2E8809FE50410A0E10720A0E188001BE9 -S31A50008957E50830A0E106F7FFEB000050E32600000A84305BE5D9 -S31A5000896C0530C6E7015085E2050055E3F3FFFF9A360000EAC45A -S31A50008981009FE50650A0E1060600EB74704BE2B8609FE50A0082 -S31A5000899600EA74305BE50740A0E1000053E30400000A0030D498 -S31A500089ABE50130C5E40120F4E5000052E3FAFFFF1A0A30A0E3A4 -S31A500089C00130C5E40040A0E30040C5E50600A0E1F40500EB0753 -S31A500089D500A0E15010A0E30420A0E1580700EB040050E10000AF -S31A500089EAE0E31B0000BA0700A0E1000600EB040050E1E5FFFFF9 -S31A500089FF1A150000EA0600A0E10A10A0E10620A0E3620400EBD8 -S31A50008A140400A0E3100000EA240A01506CB20000380A01503016 -S31A50008A290A01502C0A0150400A0150440A01504C0A0150500AC5 -S31A50008A3E0150540A0150580A01505C0A0150640A0150900A0109 -S31A50008A535008009FE5D20500EB0100A0E3000000EA540A0150FD -S31A50008A68F0AD1BE90DC0A0E100D82DE9031081E22111A0E1019C -S31A50008A7D30A0E1011041E204B04CE200E0A0E10000A0E300C023 -S31A50008A92A0E1000053E1090000DA0120A0E1011041E204309E39 -S31A50008AA7E40F005CE3133C83E1030020E001C08C1200C0A003BA -S31A50008ABC000052E3F5FFFFCA00A81BE90DC0A0E100D82DE90174 -S31A50008AD10040E204B04CE2050050E300F19F970C0000EAFC8A5B -S31A50008AE60050FC8A00500C8B0050148B0050FC8A0050048B00C4 -S31A50008AFB500400A0E300A81BE90800A0E300A81BE90000A0E3D3 -S31A50008B1000A81BE9020CA0E300A81BE90DC0A0E1F0DF2DE904DA -S31A50008B25B04CE243DE4DE208D04DE24C040BE50080A0E3501409 -S31A50008B3A0BE504A0A0E379FEFFEBB4919FE5080050E10970A03D -S31A50008B4FE18800000A426E4BE2086046E20600A0E19C519FE5E3 -S31A50008B64012BA0E30510A0E10B0400EB433E4BE2083043E20C50 -S31A50008B793043E200308DE5434E4BE204808DE5084044E27431D3 -S31A50008B8E9FE5084044E2008083E50400A0E168319FE56C10A0E4 -S31A50008BA3E308308DE50820A0E10230A0E3AAF5FFEB0120A0E34F -S31A50008BB804018DE84C041BE548319FE508808DE550141BE50C21 -S31A50008BCD308DE50430A0E1ADF5FFEB080050E16500000A1E0094 -S31A50008BE200EA0700A0E144241BE50A10A0E1A5FEFFEB010080A5 -S31A50008BF7E2050050E300F19F97160000EA1C8C00506C8C005092 -S31A50008C0C308C0050348C0050488C0050588C00500500A0E106FD -S31A50008C2110A0E1012BA0E3DC0300EB510000EA0180A0E310008F -S31A50008C3697E5A2FFFFEB00A08AE0147087E2050000EA09005786 -S31A50008C4BE1147047120970A001010000EAB4009FE5510500EB82 -S31A50008C60B0309FE5030057E1DDFFFF1A000058E34000000AA0F0 -S31A50008C75309FE5A0209FE50540A0E1003084E50400A0E1F8239D -S31A50008C8A84E5FF1FA0E375FFFFEBFC0384E584309FE584409F14 -S31A50008C9FE5002093E5001094E57C009FE5817042E0730700EBEC -S31A50008CB4000050E32E00000A001094E50700A0E1114D4BE20846 -S31A50008CC94044E20420A0E1F10C00EB006050E21500000A484410 -S31A50008CDE1BE50600A0E1930D00EB0410A0E10030A0E138009FFC -S31A50008CF3E50620A0E12A0500EB1D0000EAF48400006CB20000D3 -S31A50008D0894420100940A0150C0020150AC0A015094850000CE39 -S31A50008D1DFAAD0BADDEADDE5CB2000060B20000C00A01502405BF -S31A50008D3201500700A0E10510A0E1012BA0E30430A0E1240D00D2 -S31A50008D47EB006050E20900000A48441BE50600A0E1760D00EBB0 -S31A50008D5C0410A0E10030A0E108009FE50620A0E10D0500EB0036 -S31A50008D710000EAEC0A0150F0AF1BE90DC0A0E1F0DF2DE904B0DC -S31A50008D864CE20480A0E30070A0E10150A0E10290A0E1D8609FA0 -S31A50008D9BE5E2FDFFEBD4A09FE5000050E33100000A0A0056E118 -S31A50008DB02C00000AC4309FE50710A0E1000096E5034088E019D3 -S31A50008DC50500EB000050E31F00001A100096E5090050E118000A -S31A50008DDA001A013040E2050053E303F19F97130000EA048E00CD -S31A50008DEF50048E0050748E0050388E0050108E0050248E00508F -S31A50008E04003094E5003085E5F0AF1BE90500A0E10410A0E104FE -S31A50008E1920A0E35F0300EBF0AF1BE90500A0E10410A0E106201A -S31A50008E2EA0E35A0300EBF0AF1BE9004085E5F0AF1BE93C009F43 -S31A50008E43E50710A0E1D60400EBF0AF1BE9100096E51BFFFFEB50 -S31A50008E58008088E0146086E20A0056E1D2FFFF1A18009FE5071D -S31A50008E6D10A0E1CC0400EBF0AF1BE9F4840000948500006CB2FC -S31A50008E820000180B0150440B01500DC0A0E130D82DE90030A035 -S31A50008E97E304B04CE294509FE504D04DE2003085E59FFDFFEB20 -S31A50008EAC000050E33F00000A80309FE580009FE580409FE50063 -S31A50008EC11090E5012BA0E300C093E50400A0E18C1041E0310364 -S31A50008ED600EB0400A0E1FF1FA0E3E1FEFFEBFC3394E50300505C -S31A50008EEBE10700001A002094E54C309FE5030052E10300001A2E -S31A50008F00F82394E540309FE5030052E11100000A38009FE5A3CE -S31A50008F150400EB0400A0E130209FE50030A0E3003082E503104C -S31A50008F2AA0E1012BA0E33A0500EB1E0000EA8442010060B200A1 -S31A50008F3F005CB200006CB20000CEFAAD0BADDEADDE640B015045 -S31A50008F549442010018104BE23C009FE50120A0E384FFFFEB189D -S31A50008F69301BE5000053E30700000A28009FE528109FE504209A -S31A50008F7EA0E37DFFFFEB20009FE520109FE50220A0E379FFFF2B -S31A50008F93EB0130A0E3003085E5040000EAD0090150E8090150E0 -S31A50008FA894420100100A0150F841010030A81BE90DC0A0E100B8 -S31A50008FBDD82DE9803260E0030180E0000180E014209FE50002EA -S31A50008FD2A0E1483092E504B04CE20FE0A0E103F0A0E100A81B3B -S31A50008FE7E9500000000DC0A0E1F0DF2DE904B04CE206DD4DE2BF -S31A50008FFC98010BE5041090E59C110BE50020A0E3A4210BE50003 -S31A500090117091E5A0210BE549F3FFEB51F3FFEB47F3FFEB0430B1 -S31A5000902697E5010053E3A200001A0700A0E10410A0E3C30B0083 -S31A5000903BEB043097E5040053E30200000AD4029FE5550400EB4B -S31A50009050F1FFFFEA0700A0E12010A0E3632F4BE2013CA0E39092 -S31A50009065310BE500C0A0E394C10BE5654F4BE200408DE5193E0D -S31A5000907A4BE28C0A00EB000050E363AF4BE20700000A94329FF5 -S31A5000908FE528104BE2F32091E1410F52E30200000A84029FE50C -S31A500090A43F0400EBDBFFFFEA0700A0E10030A0E394310BE5156B -S31A500090B910A0E3653F4BE200308DE50A20A0E1193E4BE2780A95 -S31A500090CE00EB000050E31B00000A628F4BE20840A0E10130D408 -S31A500090E3E444929FE5000053E30200000A0130D4E4000053E383 -S31A500090F8FCFFFF1A0460A0E10130D4E4000053E3FCFFFF1A04DD -S31A5000910D50A0E10130D4E4000053E3FCFFFF1AA4111BE500003E -S31A5000912251E30100000A04029FE51D0400EB0900A0E10610A0CD -S31A50009137E10820A0E100408DE50530A0E1170400EB0700A0E14D -S31A5000914C1A10A0E30050A0E394510BE5653F4BE200308DE50AE6 -S31A5000916120A0E1193E4BE2510A00EB050050E10800000A0A00E6 -S31A50009176A0E190111BE58C204BE2260B00EB8C301BE5A0111BEF -S31A5000918BE5050050E10310A011A0110BE5A0211BE5000052E303 -S31A500091A00200001A8C019FE5FE0300EB9AFFFFEA0510A0E180B3 -S31A500091B5519FE507CDA0E30500A0E1083097E5813083E00C20A9 -S31A500091CAD3E70120C0E7011081E2050051E3F8FFFFDA0700A094 -S31A500091DFE10030A0E394310BE51B10A0E3653F4BE200308DE5BB -S31A500091F40A20A0E1193E4BE22C0A00EB000050E32900000A0A50 -S31A5000920900A0E190111BE574204BE2C70A00EB000050E3200008 -S31A5000921E000A9C111BE570201BE5003091E5101093E50240819D -S31A50009233E09C211BE5044082E5A0111BE574205BE50700A0E17B -S31A50009248450A00EB1F30D4E51F30C4E50720D4E5800012E3022A -S31A5000925D00001A0730D4E5800013E3FCFFFF0A98111BE5003049 -S31A5000927291E50100A0E1202093E50510A0E10FE0A0E100F09259 -S31A50009287E59C211BE5343092E50140A0E30C4083E5B2F2FFEBF9 -S31A5000929C0400A0E12B0000EA94009FE5BE0300EB5AFFFFEA8C3B -S31A500092B1009FE5BB0300EB57FFFFEA050053E30200001A7C0013 -S31A500092C69FE5B60300EB52FFFFEAA4F2FFEB3200A0E336FFFF72 -S31A500092DBEBA4311BE5000053E30100001A5C009FE5AD0300EB9C -S31A500092F0A4111BE554009FE5011081E2A4110BE5A80300EBA433 -S31A50009305211BE50000A0E30A0052E30F00000A0700A0E1CD01AB -S31A5000931A00EB88F2FFEB3DFFFFEAA80B01509EFEFFFFC40B0106 -S31A5000932F50E00B0150DC0B0150F00B01509C8300000C0C01503B -S31A50009344200C01503C0C01505C0C01507C0C0150F0AF1BE90D66 -S31A50009359C0A0E170D82DE90040A0E1086094E5045096E504B0E5 -S31A5000936E4CE2E70A00EB0000A0E3D80A00EB000085E5344085D7 -S31A50009383E50600A0E117FFFFEB70A81BE90DC0A0E100D82DE9BB -S31A5000939804B04CE204C090E504109CE52130A0E30030C1E5FF11 -S31A500093AD20A0E30720C1E5213043E20F30C1E530308CE500A811 -S31A500093C21BE90DC0A0E110D82DE904E090E504B04CE204C09E53 -S31A500093D7E52130A0E30030CCE54820A0E30E20CCE50000A0E344 -S31A500093EC0B00CCE50A00CCE5013043E20C30CCE5462042E20DC5 -S31A5000940120CCE5203083E20430CCE518008EE514008EE508304B -S31A500094168EE50140A0E12C008EE56010A0E30110CCE53F308370 -S31A5000942BE20330CCE57E2082E20220CCE5203043E210308EE513 -S31A500094407F2082E20720CCE5203043E20F30CCE50C20A0E101D3 -S31A5000945510C2E40710CCE50030D4E70030C2E7010080E2050002 -S31A5000946A50E3FAFFFFDA2230A0E30030CCE50020A0E30D20CC40 -S31A5000947FE51E3043E20C30CCE5012082E230208EE510A81BE939 -S31A500094940DC0A0E100D82DE9010C51E20100A01304B04CE2005B -S31A500094A9A81BE90DC0A0E100D82DE9042090E504B04CE21430B1 -S31A500094BE92E50000A0E3000053E10200000A183092E5000053F7 -S31A500094D3E10000001A0100A0E300A81BE90DC0A0E100D82DE9C7 -S31A500094E804B04CE204C090E504009CE52230A0E30030C0E505CA -S31A500094FD20C0E54224A0E10620C0E50410C0E5043083E200300B -S31A50009512C0E50120A0E32C208CE500A81BE90DC0A0E1F0DF2DF2 -S31A50009527E904B04CE20090A0E10380A0E13F0058E3044099E5BD -S31A5000953C0850A0C14050A0D304309BE50160A0E1087094E5027F -S31A50009551A0A0E1040094E5400057E30400001A147084E51C3040 -S31A5000956684E5245084E55030A0E3030000EA187084E52030849F -S31A5000957BE5285084E54030A0E3083084E52230A0E30030C0E581 -S31A500095900A50C0E54534A0E10B30C0E50020A0E30820C0E50225 -S31A500095A5E0A0E10970C0E54030A0E30730C0E5122082E2002057 -S31A500095BAC0E50A005EE10F0000AA8E31A0E1062083E004C09280 -S31A500095CFE501E08EE2061093E70C20A0E101C04CE2000052E39A -S31A500095E4F4FFFFDA0C20A0E10130D1E401C04CE21030C0E500E9 -S31A500095F90052E3F9FFFFCAEDFFFFEA050058E1040000AA003020 -S31A5000960EA0E305E068E01030C0E501E05EE2FCFFFF1A2C209447 -S31A50009623E50730D0E5400013E3FCFFFF0A000052E30800001A7A -S31A50009638143094E5030057E10130A0030230A0130C3084E50968 -S31A5000964D00A0E10710A0E10520A0E1A0FFFFEBF0AF1BE90DC0FA -S31A50009662A0E170D82DE904D04DE20060A0E1045096E504409532 -S31A50009677E50C20D4E56230A0E30030C4E50710D4E5403043E26B -S31A5000968C0030C4E504B04CE22A0000EA0430A0E30000A0E30A60 -S31A500096A130C4E50B00C4E5800052E30800C4E56020A00309201F -S31A500096B6C4E5103095E5020053E10200001A013041E20330C449 -S31A500096CBE5210000EA0010A0E11C004BE2102085E54030A0E3DD -S31A500096E00730C4E50A20A0E30020C4E51030D4E50130C0E701F7 -S31A500096F51081E2030051E3FAFFFF9A19305BE51A105BE50600D5 -S31A5000970AA0E1002096E5031481E120C092E5041041E20FE0A042 -S31A5000971FE104F09CE51B305BE5013043E20330C4E56220A0E3C7 -S31A500097340020C4E50710D4E52230A0E30030C4E50320D4E5FFA8 -S31A500097491001E2012082E2010052E1CFFFFF1A70A81BE90DC039 -S31A5000975EA0E170D82DE904B04CE200C0A0E30C40A0E10260A0CD -S31A50009773E1040090E5060054E104E090E50150A0E1060000AA1B -S31A500097880520A0E106C0A0E1043092E501C05CE2034084E00830 -S31A5000979D2082E2FAFFFF1A2230A0E30030CEE50A40CEE544349E -S31A500097B2A0E10B30CEE50420A0E30820CEE51010D0E500C0A026 -S31A500097C7E30910CEE54030A0E30730CEE5062082E20020CEE54E -S31A500097DC06005CE10D0000AA8C21A0E1053082E0041093E505D2 -S31A500097F10092E7000051E301208CE20300000A1030DEE5013090 -S31A50009806C0E4011051E2FBFFFF1A02C0A0E106005CE1F1FFFF87 -S31A5000981BBA70A81BE90DC0A0E170D82DE90050A0E1044095E5D1 -S31A50009830043094E50C2094E504B04CE20410D3E5010052E30394 -S31A5000984500001A1C6094E50030A0E3143084E5020000EA2060DD -S31A5000985A94E50030A0E3183084E5141094E50030A0E32C308496 -S31A5000986FE5030051E10500000A242094E50500A0E116FFFFEB23 -S31A500098840130A0E30C3084E5090000EA181094E5000051E30553 -S31A5000989900000A282094E50500A0E10DFFFFEB0230A0E30C302C -S31A500098AE84E5000000EA0C1084E50500A0E1003095E50610A091 -S31A500098C3E120C093E50020A0E30FE0A0E108F09CE570A81BE959 -S31A500098D80DC0A0E100D82DE90C009FE50C109FE504B04CE22DAA -S31A500098ED0200EB00A81BE9800C0150840C01500DC0A0E1F0D8A3 -S31A500099022DE90050A0E1047095E5046097E52230A0E30030C67A -S31A50009917E50720D6E504B04CE2FF4002E2000054E31600000AC2 -S31A5000992C0740C6E5303097E5000053E31400000A0A0014E302AB -S31A5000994100000A0500A0E10410A0E1B3FFFFEB050014E30200FC -S31A50009956000A0500A0E10410A0E13EFFFFEB300014E302000031 -S31A5000996B0A0500A0E10410A0E1D7FFFFEB0730D6E5FF4003E296 -S31A50009980000054E3E8FFFF1A000097E5730900EBF0A81BE90DB9 -S31A50009995C0A0E100D82DE9043090E5002093E504B04CE22000F5 -S31A500099AA92E500A81BE90DC0A0E130D82DE98C209FE58C309F38 -S31A500099BFE504B04CE2001092E50040A0E1005093E5000051E332 -S31A500099D40400001A0130A0E3003082E53500A0E30120A0E1F76E -S31A500099E9F0FFEB0E33A0E3083084E5022CA0E30C2084E53E331D -S31A500099FE83E2103084E50123A0E3142084E5033383E218308445 -S31A50009A13E58300A0E31C2084E53530A0E3203084E58010A0E3A4 -S31A50009A2854DDFFEB010515E30200001A0130A0E3043084E5301D -S31A50009A3DA81BE90030A0E3043084E530A81BE9A48300000000BF -S31A50009A5204900DC0A0E100D82DE924309FE5002093E504B04C69 -S31A50009A67E2010512E30200001A0130A0E3043080E500A81BE9A2 -S31A50009A7C0030A0E3043080E500A81BE9000004900DC0A0E100A5 -S31A50009A91D82DE9803260E0030180E0000180E014209FE500020B -S31A50009AA6A0E1483092E504B04CE20FE0A0E103F0A0E100A81B5C -S31A50009ABBE9500000000DC0A0E170D82DE9040051E304B04CE241 -S31A50009AD04CD04DE20040A0E12900001A045094E5010055E326B0 -S31A50009AE500001A8300A0E38110A0E322DDFFEB1E00A0E3E3FF76 -S31A50009AFAFFEB8300A0E30310A0E30230A0E3043084E50060A029 -S31A50009B0FE31ADDFFEB0500A0E1DBFFFFEB8300A0E30330A0E321 -S31A50009B24043084E50510A0E113DDFFEB0500A0E3D4FFFFEB0282 -S31A50009B390000EA0A00A0E3D1FFFFEB016086E2090056E30C0079 -S31A50009B4E00CA0400A0E12010A0E30030A0E360300BE560204BAC -S31A50009B63E200208DE55C304BE258204BE2CF0700EB000050E3D1 -S31A50009B78EFFFFF0A0430A0E3043084E570A81BE90DC0A0E100CD -S31A50009B8DD82DE93500A0E304B04CE286F0FFEB00A81BE90DC00C -S31A50009BA2A0E100D82DE904B04CE202C0A0E100E0A0E103005C04 -S31A50009BB7E30200009A003081E1030013E30A00000A0C30A0E168 -S31A50009BCC01C04CE2000053E30500000A0C20A0E10130D1E40166 -S31A50009BE1C04CE20130CEE4000052E3F9FFFF1A00A81BE900E076 -S31A50009BF6A0E10F005CE30E00009A043091E404308EE404209189 -S31A50009C0BE404208EE4043091E404308EE4042091E410C04CE28E -S31A50009C2004208EE40F005CE3F4FFFF8A020000EA043091E404E0 -S31A50009C35C04CE204308EE403005CE3FAFFFF8A0C30A0E101C0EE -S31A50009C4A4CE2000053E30500000A0C20A0E10130D1E401C04C9C -S31A50009C5FE20130CEE4000052E3F9FFFF1A00A81BE90DC0A0E195 -S31A50009C74F0DF2DE904B04CE250D04DE20170A0E178404BE20098 -S31A50009C89A0A0E3005050E20260A0E10380A0E10490A0E10300CC -S31A50009C9E001A3030A0E378304BE577404BE2090000EA0500A00A -S31A50009CB3E10610A0E1241700EB0030D8E70610A0E10130C4E449 -S31A50009CC80500A0E1C31500EB005050E2F5FFFF1A090054E10516 -S31A50009CDD00000A0920A0E1013074E501A08AE20130C7E40200F3 -S31A50009CF254E1FAFFFF1A0A00A0E10030A0E30030C7E5F0AF1BEC -S31A50009D07E90DC0A0E1F0DF2DE904B04CE234D04DE24C200BE564 -S31A50009D1C0180A0E148204BE250200BE50060A0E30140D8E40005 -S31A50009D3170A0E158600BE5060054E1FE00000A250054E3ED00A2 -S31A50009D46001A0030A0E354300BE50140D8E40350A0E12D00541F -S31A50009D5BE30200001A0120A0E354200BE50140D8E4300054E332 -S31A50009D700200001A0140D8E40190A0E3060000EA0390A0E10453 -S31A50009D850000EA053185E08330A0E1303043E2045083E001403D -S31A50009D9AD8E4303044E2090053E3F7FFFF9A2E0054E3060000E3 -S31A50009DAF1A0140D8E4019089E2000000EA0140D8E4303044E2C9 -S31A50009DC4090053E3FBFFFF9A00A0A0E36C0054E30140D8045827 -S31A50009DD94044E2200054E304F19F97720000EA8C9E0050B49F0E -S31A50009DEE0050B49F0050B49F0050B49F0050B49F0050B49F00DB -S31A50009E0350B49F0050B49F0050B49F0050B49F0050909F005099 -S31A50009E188C9E0050B49F0050B49F0050B49F0050B49F0050B425 -S31A50009E2D9F0050B49F0050B49F0050B49F0050B49F0050B49FFC -S31A50009E420050B49F00506C9E0050B49F0050B49F0050709F0013 -S31A50009E5750B49F0050B49F0050B49F0050B49F00508C9E00504A -S31A50009E6C3000A0E30FE0A0E107F0A0E17800A0E30FE0A0E1077E -S31A50009E81F0A0E10190A0E30850A0E34C301BE5040093E44C30A3 -S31A50009E960BE5200054E304F19F972F0000EA509F0050649F0094 -S31A50009EAB50649F0050649F0050649F0050649F0050649F00505D -S31A50009EC0649F0050649F0050649F0050649F0050649F00502870 -S31A50009ED59F0050649F0050649F0050649F0050649F0050649FE4 -S31A50009EEA0050649F0050649F0050649F0050649F0050649F006E -S31A50009EFF50649F0050449F0050649F0050649F0050649F005029 -S31A50009F14649F0050649F0050649F0050649F0050449F00500063 -S31A50009F290050E32DA0A0B3000060B248104BE2B4319FE50A2050 -S31A50009F3EA0E3050000EA48104BE2A8319FE5010000EA48104BD6 -S31A50009F53E2A0319FE51020A0E343FFFFEB58000BE548204BE2B0 -S31A50009F6850200BE5140000EA4C301BE5042093E450200BE54C6D -S31A50009F7D300BE50200A0E19C0000EB58000BE50C0000EA4C3095 -S31A50009F921BE5043083E24C300BE5016086E2040053E501908841 -S31A50009FA7E20FE0A0E107F0A0E15D0000EA3F00A0E30FE0A0E10C -S31A50009FBC07F0A0E1016086E258201BE5055062E000005AE301AC -S31A50009FD1504512000059E30800000A3040A0E300005AE30600FA -S31A50009FE6000A0A00A0E10FE0A0E107F0A0E1016086E200A0A08A -S31A50009FFBE3000000EA2040A0E358201BE5019088E254301BE554 -S31A5000A010012042E25C200BE5000053E30800001A030000EA04EB -S31A5000A02500A0E10FE0A0E107F0A0E1016086E20530A0E1015097 -S31A5000A03A45E2000053E3F7FFFFCA00005AE30300000A0A00A0AB -S31A5000A04FE10FE0A0E107F0A0E1016086E25C201BE558301BE510 -S31A5000A0640F0000EA50301BE50140D3E4016086E250300BE504E3 -S31A5000A07900A0E10FE0A0E107F0A0E10A0054E30300001A0D00A8 -S31A5000A08EA0E30FE0A0E107F0A0E1016086E258301BE50320A0E8 -S31A5000A0A3E1012042E258200BE5000053E3ECFFFFCA54301BE556 -S31A5000A0B8000053E31A00000A0530A0E1015045E2000053E31669 -S31A5000A0CD0000DA2000A0E30FE0A0E107F0A0E1016086E20530C5 -S31A5000A0E2A0E1015045E2000053E3F7FFFFCA0D0000EA940C018D -S31A5000A0F750A00C0150B40C01500400A0E10FE0A0E107F0A0E133 -S31A5000A10C016086E20A0054E3019088E20300001A0D00A0E30F27 -S31A5000A121E0A0E107F0A0E1016086E20040D8E50980A0E100002A -S31A5000A13654E300FFFF1A0600A0E1F0AF1BE90DC0A0E100D82DF2 -S31A5000A14BE918309FE5002093E50100C2E40010A0E3002083E59A -S31A5000A16004B04CE20010C2E500A81BE96CB600000DC0A0E10ED1 -S31A5000A175002DE900D82DE918309FE5000083E510B04CE2041045 -S31A5000A18A9BE50C009FE508208BE2DBFEFFEB010000EA6CB600F5 -S31A5000A19F0044A1005000A81BE90DC0A0E10F002DE900D82DE913 -S31A5000A1B410009FE514B04CE204109BE508208BE2CFFEFFEB00DA -S31A5000A1C90000EA48A4005000A81BE90DC0A0E100D82DE90030ED -S31A5000A1DEA0E10120A0E10310A0E108009FE504B04CE2C4FEFF30 -S31A5000A1F3EB00A81BE948A400500DC0A0E100D82DE90020A0E34F -S31A5000A2080130D0E404B04CE2020053E10300000A0130D0E401FB -S31A5000A21D2082E2000053E3FBFFFF1A0200A0E100A81BE90DC00D -S31A5000A232A0E100D82DE90130D1E40020A0E10100D2E404B04C14 -S31A5000A247E2030050E10500001A000050E30400000A0100D2E47F -S31A5000A25C0130D1E4030050E1F9FFFF0A000063E000A81BE90D80 -S31A5000A271C0A0E100D82DE90130D1E4000053E304B04CE2030052 -S31A5000A286000A0130C0E40130D1E4000053E3FBFFFF1A0030A08F -S31A5000A29BE30030C0E500A81BE90DC0A0E100D82DE900E0A0E157 -S31A5000A2B00120DEE404B04CE2020000EA000050E30F00000A0145 -S31A5000A2C520DEE401C0D1E4200082E2FF0000E2413042E21900C3 -S31A5000A2DA53E30200A08120308CE2FF2003E241304CE2190053F3 -S31A5000A2EFE30C30A0810230A091030050E1EEFFFF0A000063E0F4 -S31A5000A30400A81BE90DC0A0E100D82DE9000052E304B04CE200EF -S31A5000A319C0A0E10300001A0200A0E100A81BE9000063E000A861 -S31A5000A32E1BE90100DCE40130D1E4030050E1F9FFFF1A00005084 -S31A5000A343E30100000A012052E2F7FFFF1A0000A0E300A81BE92E -S31A5000A3580DC0A0E110D82DE9000052E304B04CE20040A0E10571 -S31A5000A36D00001A0200A0E110A81BE9000063E010A81BE901200C -S31A5000A38252E21000000A01C0D4E401E0D1E420008CE2FF000086 -S31A5000A397E241304CE2190053E30C00A08120308EE2FFC003E2FA -S31A5000A3AC41304EE2190053E30E30A0810C30A091030050E1EC6A -S31A5000A3C1FFFF1A000050E3ECFFFF1A0000A0E310A81BE90DC0D6 -S31A5000A3D6A0E100D82DE904B04CE202C0A0E1070000EA0120D0A6 -S31A5000A3EBE40130D1E4030052E10300000A013050E5010051E55D -S31A5000A400030060E000A81BE90C30A0E101C04CE2000053E3F32D -S31A5000A415FFFFCA0000A0E300A81BE90DC0A0E100D82DE9012088 -S31A5000A42A52E2FF1001E204B04CE20200004A0110C0E40120524B -S31A5000A43FE2FCFFFF5A00A81BE90DC0A0E1F0D92DE9BC309FE533 -S31A5000A45404B04CE2004093E5FF6000E2000054E31900001AA8B0 -S31A5000A469309FE50000E0E30380A0E1342093E50850A0E10FE079 -S31A5000A47EA0E102F0A0E10070A0E1343095E50400A0E10FE0A09C -S31A5000A493E103F0A0E1143095E5000093E5014084E20C3093E578 -S31A5000A4A80610A0E10FE0A0E103F0A0E1000054E3F2FFFFDA3499 -S31A5000A4BD3098E50700A0E10FE0A0E103F0A0E1F0A91BE940201E -S31A5000A4D29FE5143092E5000053E30500000A000093E50C309354 -S31A5000A4E7E50610A0E10FE0A0E103F0A0E1F0A91BE9183092E54E -S31A5000A4FC000093E50C3093E50610A0E10FE0A0E103F0A0E1F05E -S31A5000A511A91BE9F0410100500000000DC0A0E110D82DE9302014 -S31A5000A5269FE504B04CE2143092E50040A0E1000053E3050000AD -S31A5000A53B0A000093E5103093E50FE0A0E103F0A0E10000C4E5EE -S31A5000A55010A81BE9183092E5F7FFFFEA500000000DC0A0E1F0B8 -S31A5000A565DF2DE9E0309FE504B04CE20060A0E1004093E50390F4 -S31A5000A57AA0E1000054E31C00001A0000E0E3C4309FE50450A059 -S31A5000A58FE10380A0E1342093E50870A0E10FE0A0E102F0A0E1D4 -S31A5000A5A400A0A0E1343097E50500A0E10FE0A0E103F0A0E114CD -S31A5000A5B93097E5000093E51C3093E50610A0E10FE0A0E103F055 -S31A5000A5CEA0E1004050E20C00001A015085E2000055E3F0FFFF2B -S31A5000A5E3DA343098E50A00A0E10FE0A0E103F0A0E1130000EAE6 -S31A5000A5F854209FE5143092E5000053E30800000A080000EA010A -S31A5000A60D30A0E3003089E5302098E50500A0E10FE0A0E102F0DC -S31A5000A622A0E10400A0E1F0AF1BE9183092E5000093E51C30930E -S31A5000A637E50610A0E10FE0A0E103F0A0E10040A0E10400A0E112 -S31A5000A64CF0AF1BE9F0410100500000000DC0A0E1F0D92DE9D879 -S31A5000A661309FE504B04CE2004093E50060A0E1000054E31C000C -S31A5000A676001AC4309FE50000E0E30380A0E1342093E50850A05C -S31A5000A68BE10FE0A0E102F0A0E10070A0E1343095E50400A0E14C -S31A5000A6A00FE0A0E103F0A0E114C095E500005CE30500000A00CF -S31A5000A6B5009CE50710A0E314309CE50620A0E10FE0A0E103F050 -S31A5000A6CAA0E1014084E2000054E3EFFFFFDA343098E50700A077 -S31A5000A6DFE10FE0A0E103F0A0E10A0000EA50309FE514C093E507 -S31A5000A6F40380A0E100005CE30500000A00009CE50710A0E3147A -S31A5000A709309CE50620A0E10FE0A0E103F0A0E118C098E5000054 -S31A5000A71E5CE30500000A00009CE50710A0E314309CE50620A0DC -S31A5000A733E10FE0A0E103F0A0E1F0A91BE9F041010050000000D7 -S31A5000A7480DC0A0E1F0DD2DE904B04CE204D04DE20250A0E100BD -S31A5000A75D60A0E10640A0E10070A0E3B4819FE5002098E50000A0 -S31A5000A77252E30600000A0030D2E5000053E30300000A0130D20A -S31A5000A787E425304BE5002088E5160000EA060054E10030A01353 -S31A5000A79C0130A003000055E30030A0D3000053E30D00000A3224 -S31A5000A7B100A0E3A7FFFFEB000000EA325045E2000055E303005C -S31A5000A7C600DA25004BE263FFFFEB007050E2F8FFFF0A000057B7 -S31A5000A7DBE30300001A0000E0E3510000EA25004BE24AFFFFEB90 -S31A5000A7F025205BE50030A0E30D0052E30030C4E50200A0E11B0D -S31A5000A80500000A080000CA080050E32C00000A020000CA0300CC -S31A5000A81A50E30C00000A380000EA0A0050E31200000A350000DA -S31A5000A82FEA2B0050E32E00000A020000CA240050E32B00000AE6 -S31A5000A8442F0000EA7F0050E31D00000A2C0000EA060054E10363 -S31A5000A85900001AC4009FE550FEFFEB0100E0E3300000EA01001B -S31A5000A86EC4E4B4A09FE5270000EA25205BE5A8A09FE50A005241 -S31A5000A883E30200001A0030DAE50D0053E32000000A0D0052E3CD -S31A5000A8980200001A0030DAE50A0053E31B00000A0D00A0E3E570 -S31A5000A8ADFEFFEB0A00A0E3E3FEFFEB25305BE50030CAE501008B -S31A5000A8C2A0E3190000EA5CA09FE5060054E11000000A0800A028 -S31A5000A8D7E3DAFEFFEB2000A0E3D8FEFFEB0800A0E3D6FEFFEBC5 -S31A5000A8EC014044E2080000EA060054E10200001A33DFFFEB0055 -S31A5000A90100A0E3090000EACEFEFFEB25305BE514A09FE50130C1 -S31A5000A916C4E425305BE50030CAE591FFFFEA94420100C80C0195 -S31A5000A92B50A8830000F0AD1BE90DC0A0E1F0DF2DE904B04CE290 -S31A5000A9400060A0E1060051E1067041800170A091000057E3027E -S31A5000A95590A0E13B0000DA000059E30300000AE4009FE50610AA -S31A5000A96A69E00DFEFFEB020000EAD4009FE50610A0E109FEFF63 -S31A5000A97FEB0050A0E3108047E210A086E2070055E1030000AAF4 -S31A5000A994B8009FE50510D6E701FEFFEB010000EAAC009FE5FE48 -S31A5000A9A9FDFFEBC54FA0E1053064E00130C3E3053063E00100FE -S31A5000A9BE53E30100001A90009FE5F6FDFFEBA43EA0E1033085D1 -S31A5000A9D3E00730C3E3053063E0070053E30100001A70009FE598 -S31A5000A9E8EEFDFFEB015085E20F0055E3E4FFFFDA60009FE5E9A7 -S31A5000A9FDFDFFEB0050A0E3070055E1040000AA0510D6E7203028 -S31A5000AA1241E25E0053E32E10A083000000EA2010A0E338009F4D -S31A5000AA27E5DEFDFFEB015085E20F0055E3F2FFFFDA28009FE5A5 -S31A5000AA3CD9FDFFEB0A60A0E1007058E2C3FFFFCAF0AF1BE9CC60 -S31A5000AA510C0150D80C0150E00C0150E40C0150E80C0150EC0C4D -S31A5000AA660150F00C01500DC0A0E100D82DE90020A0E304B04C08 -S31A5000AA7BE2ACFFFFEB00A81BE90DC0A0E10F002DE930D82DE9BC -S31A5000AA9014B04CE208D04DE248409FE504009BE5005094E50801 -S31A5000AAA5108BE2C9FDFFEB38009FE5BCFDFFEB1C004BE2002051 -S31A5000AABAA0E3002084E50810A0E31FFFFFEB1C305BE55900534A -S31A5000AACFE30000A0130100A003790053E30100A003005084E5D6 -S31A5000AAE4010000EA94420100F40C015030A81BE90DC0A0E1F0DA -S31A5000AAF9DF2DE904B04CE20050A0E10170A0E14C419FE50260E5 -S31A5000AB0EA0E12CC014E503A0A0E100005CE30300000A0A30A02C -S31A5000AB23E300308AE50000E0E3F0AF1BE90100A0E3710C00EBF3 -S31A5000AB380000C4E52004A0E10100C4E50500A0E10030D0E5024D -S31A5000AB4D2084E2000053E30300000A0130C2E40130F0E50000F7 -S31A5000AB6253E3FBFFFF1A0030A0E30130C2E4030056E1E4009FF8 -S31A5000AB77050200000A010056E3E6FFFF1AD8009FE50030D0E5E9 -S31A5000AB8CD4809FE5D4609FE5000053E30300000A0130C2E401B3 -S31A5000ABA130F0E5000053E3FBFFFF1A0840A0E10400A0E100505D -S31A5000ABB6A0E30050C2E50510A0E10C20A0E315FEFFEB144044E0 -S31A5000ABCBE20190A0E3BA91C4E10500A0E13D0C00EB140084E502 -S31A5000ABE0003096E5B000D6E1093083E0003086E5420C00EBB8D0 -S31A5000ABF501C4E1B430D7E1050053E10200001A4500A0E33C0C4E -S31A5000AC0A00EBB400C7E1180088E20720A0E150109FE50830A0B2 -S31A5000AC1FE11F0A00EB000050E3070000BA149008E50C5084E58B -S31A5000AC340030E0E3103084E5085084E5045084E50500A0E1F025 -S31A5000AC49AF1BE90000E0E30930A0E300308AE5F0AF1BE99CB6DA -S31A5000AC5E00000C0D0150180D015084B60000B083000005020037 -S31A5000AC73000DC0A0E100D82DE90000A0E308309FE504B04CE219 -S31A5000AC88000083E500A81BE970B600000DC0A0E1F0DF2DE904F0 -S31A5000AC9DB04CE218D04DE234000BE50030A0E33C300BE53810DC -S31A5000ACB20BE50280A0E10C629FE5010053E1870000AA2C50462A -S31A5000ACC7E20C3095E5000053E3150000DA34001BE538C01BE539 -S31A5000ACDC3C201BE5341295E50C4062E0040053E10340A0B10493 -S31A5000ACF120A0E1A9FBFFEB34C01BE5343295E504C08CE034C0D1 -S31A5000AD060BE50C2095E5043083E0343285E5022064E00C2085CE -S31A5000AD1BE53C101BE5041081E03C100BE5690000EA103095E5DE -S31A5000AD30020C53E36A00003A0530A0E388019FE50020A0E33038 -S31A5000AD45300BE5209085E22C200BE514A085E274119FE53030AC -S31A5000AD5A4BE200308DE50920A0E10A30A0E1140A00EB004050C1 -S31A5000AD6FE20470A0E31C0000AA043095E5013083E2043085E5F8 -S31A5000AD84050053E3020000CA083095E5000053E30100001A0852 -S31A5000AD9930A0E3470000EA0700A0E1D50B00EB0000C6E5200449 -S31A5000ADAEA0E10100C6E5B800D5E1D00B00EB0200C6E50710A075 -S31A5000ADC3E12004A0E10300C6E50920A0E1F4009FE50A30A0E114 -S31A5000ADD8B10900EB000050E33B0000AA0930A0E3340000EA0079 -S31A5000ADED30D6E50100D6E5000483E1C00B00EB030050E32000E0 -S31A5000AE02001A0230D6E50300D6E5000483E1BA0B00EB0830953B -S31A5000AE17E5013083E2030050E10500001A044044E2104085E5DE -S31A5000AE2C0C4085E5043086E2343285E5080085E50700A0E1AEF1 -S31A5000AE410B00EB0000C6E52004A0E10100C6E5B800D5E1A90B92 -S31A5000AE5600EB0200C6E50710A0E12004A0E10300C6E50920A045 -S31A5000AE6BE158009FE50A30A0E18A0900EB000050E3140000AA95 -S31A5000AE800930A0E30D0000EA0030D6E50100D6E5000483E1990C -S31A5000AE950B00EB050050E30600001A0230D6E50300D6E5000455 -S31A5000AEAA83E1930B00EB000088E50000E0E30A0000EA0B30A051 -S31A5000AEBFE3003088E50000E0E3060000EA9CB60000050200009C -S31A5000AED43C201BE538301BE5030052E178FFFFBA3C001BE5F0BD -S31A5000AEE9AF1BE90DC0A0E100D82DE9010040E204B04CE20B00FF -S31A5000AEFE50E300F19F97230000EA38AF005040AF005048AF0015 -S31A5000AF135050AF005058AF005060AF005068AF005070AF0050A8 -S31A5000AF2878AF005080AF005088AF005090AF005060009FE500CE -S31A5000AF3DA81BE95C009FE500A81BE958009FE500A81BE9540095 -S31A5000AF529FE500A81BE950009FE500A81BE94C009FE500A81B51 -S31A5000AF67E948009FE500A81BE944009FE500A81BE940009FE5E6 -S31A5000AF7C00A81BE93C009FE500A81BE938009FE500A81BE934B6 -S31A5000AF91009FE500A81BE930009FE500A81BE9300D0150400DEA -S31A5000AFA60150540D0150780D0150900D0150A40D0150B80D01B1 -S31A5000AFBB50C80D0150DC0D0150F80D01500C0E0150200E01503B -S31A5000AFD0200D01500DC0A0E170D82DE9AC309FE504B04CE201A9 -S31A5000AFE560A0E1004093E50350A0E1000054E31800001AD50D49 -S31A5000AFFA00EB90009FE5043090E5050053E30500001AB831D031 -S31A5000B00FE1000053E30000001AFD0D00EB0400A0E170A81BE90F -S31A5000B024000053E30400001A2D0100EB0A30A0E30030C6E501BB -S31A5000B03900A0E370A81BE950409FE58020A0E30410A0E10F0E24 -S31A5000B04E00EB44309FE5000085E5004083E5000095E5000050D8 -S31A5000B063E30800000A2CC09FE500109CE50130D1E40030C6E5CB -S31A5000B078002095E50100A0E300108CE5012042E2002085E5708F -S31A5000B08DA81BE9B8830000B4B8000008BF000088BF00000DC02A -S31A5000B0A2A0E170D82DE904B04CE204D04DE26440A0E30060A058 -S31A5000B0B7E119504BE2090000EA014054E20200001A0F0000EB37 -S31A5000B0CC6440A0E3040000EA28309FE5482093E56400A0E30F52 -S31A5000B0E1E0A0E102F0A0E10600A0E10510A0E1B7FFFFEB000073 -S31A5000B0F650E3F0FFFF0A19005BE5000000EA5000000070A81BFE -S31A5000B10BE90DC0A0E1F0DD2DE99C709FE504B04CE20760A0E165 -S31A5000B12094509FE594A09FE594809FE50A0000EA0400A0E10093 -S31A5000B1352095E50610A0E10F0E00EB000050E3030000DA003036 -S31A5000B14A95E5006086E0033060E0003085E57D0D00EB00309513 -S31A5000B15FE5000053E30900000A58409FE5043094E5050053E353 -S31A5000B1740100001A0400A0E1A40D00EB043094E5000053E3E869 -S31A5000B189FFFF1AD50000EB00708AE5443098E50040A0E30040B0 -S31A5000B19E85E5040053E10200000A0400A0E172E4FFEB444088C7 -S31A5000B1B3E5F0AD1BE98CBF0000BC8300008CC000005000000085 -S31A5000B1C8B4B800000DC0A0E110D82DE9A8209FE5A8409FE500AC -S31A5000B1DD3092E5FF1001E20110C3E4240051E3003082E504B013 -S31A5000B1F24CE20130A00300308405002094E5230051E30030A077 -S31A5000B207130130A003000052E30030A003000053E30500000AA8 -S31A5000B21C68209FE50130A0E3003082E560109FE5013043E20026 -S31A5000B2313081E558209FE5003092E5013083E2003082E5010C3F -S31A5000B24653E30900000A38309FE5002093E5000052E308000093 -S31A5000B25B0A2C209FE5003092E5013083E2003082E5030053E3A1 -S31A5000B2700200001AA4FFFFEB0030A0E3003084E510A81BE98C36 -S31A5000B285C00000A8B80000ACB80000B0B80000BC8300000DC066 -S31A5000B29AA0E110D82DE904B04CE2760000EB0040A0E114009F13 -S31A5000B2AFE514109FE5EE20A0E3BAFBFFEB0400A0E17F0000EB88 -S31A5000B2C410A81BE9FC0E0150040F01500DC0A0E110D82DE90454 -S31A5000B2D9B04CE2680000EB0040A0E114009FE514109FE5012CAB -S31A5000B2EEA0E3ACFBFFEB0400A0E1710000EB10A81BE9FC0E0139 -S31A5000B30350140F01500DC0A0E1F0D82DE904B04CE20060A0E12C -S31A5000B3180150A0E17AFFFFEB44209FE5003092E540709FE503CF -S31A5000B32D3183E08340A0E1030000EA483097E56400A0E30FE026 -S31A5000B342A0E103F0A0E10600A0E10510A0E11FFFFFEB00005036 -S31A5000B357E30200001A014044E2010074E3F3FFFF1AF0A81BE926 -S31A5000B36CB4830000500000000DC0A0E10E002DE930D82DE9104F -S31A5000B381B04CE204309BE50050A0E3043043E2030053E303F176 -S31A5000B3969F97200000EADCB30050ACB30050FCB3005010B400BB -S31A5000B3AB5054409FE554309FE5001094E50120A0E3002083E512 -S31A5000B3C0000051E30100001A830500EB000084E5000094E5B3CB -S31A5000B3D5D5FFEB100000EA28309FE520209FE5005093E50000EC -S31A5000B3EA92E50010A0E3001083E59FD5FFEB080000EA04309F53 -S31A5000B3FFE5005093E5050000EAC0830000C483000010209FE509 -S31A5000B41408309BE5005092E5003082E50500A0E1000000EAB493 -S31A5000B42983000030A81BE90DC0A0E130D82DE904B04CE204D037 -S31A5000B43E4DE20040A0E10200A0E10150A0E159EAFFEB0400A08D -S31A5000B453E10030A0E3003085E515104BE2DBFEFFEB000050E318 -S31A5000B4680300000A15305BE5030053E30130A00300308505011F -S31A5000B47D00A0E330A81BE90DC0A0E130D82DE92C409FE50000A9 -S31A5000B492E0E3343094E504B04CE20FE0A0E103F0A0E10050A0F9 -S31A5000B4A7E1343094E50000A0E30FE0A0E103F0A0E10500A0E18F -S31A5000B4BC30A81BE9500000000DC0A0E100D82DE910309FE534C5 -S31A5000B4D12093E504B04CE20FE0A0E102F0A0E100A81BE95000B7 -S31A5000B4E600000DC0A0E110D82DE938109FE538209FE50030A037 -S31A5000B4FBE3003081E530409FE5000092E5343094E504B04CE243 -S31A5000B5100FE0A0E103F0A0E11C209FE5303094E5000092E50FCD -S31A5000B525E0A0E103F0A0E110A81BE9F041010000BF00005000E9 -S31A5000B53A000004BF00000DC0A0E170D82DE964309FE50150A02E -S31A5000B54FE3005083E504B04CE258409FE50060E0E3342094E508 -S31A5000B5640600A0E10FE0A0E102F0A0E144309FE5000083E5347E -S31A5000B5792094E50500A0E10FE0A0E102F0A0E1301094E50600A6 -S31A5000B58EA0E10FE0A0E101F0A0E120309FE5000083E5302094CF -S31A5000B5A3E50500A0E10FE0A0E102F0A0E170A81BE9F0410100A1 -S31A5000B5B85000000000BF000004BF00000DC0A0E170D82DE9ACFE -S31A5000B5CD609FE5003096E504B04CE2000053E31E00001A9C4058 -S31A5000B5E29FE5343094E50000E0E30FE0A0E103F0A0E10050A006 -S31A5000B5F7E1343094E50100A0E30FE0A0E103F0A0E1141094E526 -S31A5000B60C74309FE574209FE5043081E570309FE5082081E50C3B -S31A5000B6213081E568209FE568309FE5102081E5143081E5602040 -S31A5000B6369FE560309FE5182081E51C3081E5342094E50500A04F -S31A5000B64BE10FE0A0E102F0A0E10130A0E3003086E540309FE58D -S31A5000B66040409FE5B010D3E10400A0E13E0C00EB34209FE50471 -S31A5000B6753094E5003082E570A81BE9C88300005000000098B229 -S31A5000B68A0050D0B20050CCB10050A0B0005074B3005030B4006B -S31A5000B69F5008B3005080420100B4B80000FCBE00000DC0A0E1AE -S31A5000B6B430D82DE904B04CE2240C00EB78309FE578109FE500D8 -S31A5000B6C92093E50350A0E1040091E50140A0E1000052E1140027 -S31A5000B6DE000A040050E30E00001A94FFFFEB54309FE554009F20 -S31A5000B6F3E5000083E550109FE50130A0E3003081E548109FE595 -S31A5000B70848309FE50D20A0E30020C0E5003081E53C209FE500EF -S31A5000B71D30A0E3003082E5043094E5000053E30000001AA3FFD8 -S31A5000B732FFEB043094E5003085E530A81BE9FCBE0000B4B80079 -S31A5000B7470088BF000008BF0000B88300008CC000008CBF0000B7 -S31A5000B75CBC8300000DC0A0E1F0D92DE968319FE5001093E5046D -S31A5000B771B04CE2000051E30900001A58019FE558219FE501302D -S31A5000B786A0E3003080E5001082E54C319FE54C119FE500308136 -S31A5000B79BE50080A0E1150000EA40019FE530119FE50120A0E330 -S31A5000B7B071F5FFEB34019FE528119FE50220A0E314419FE56C7E -S31A5000B7C5F5FFEB0410A0E120019FE50120A0E368F5FFEB1801FC -S31A5000B7DA9FE518119FE50520A0E364F5FFEB10019FE50480A02F -S31A5000B7EFE10C119FE50520A0E35FF5FFEB04419FE50030A0E30B -S31A5000B804003084E5FC509FE5110300EB480800EBF4309FE5048A -S31A5000B81960A0E1030055E10370A0E10900000A0140A0E30500DA -S31A5000B82EA0E10FE0A0E104F095E5000050E30C4085150C0085A6 -S31A5000B84305105085E2070055E1F6FFFF1ABC309FE5002093E57B -S31A5000B858000052E30200001AB0009FE54FFAFFEBF0A91BE90030 -S31A5000B86D3098E5000053E30600000A9C009FE5C80500EB0000A5 -S31A5000B88250E30200000A90009FE545FAFFEB010000EA0130A023 -S31A5000B897E3003086E5003096E5000053E30A00000A4C009FE503 -S31A5000B8AC6C0000EB0010A0E168009FE53AFAFFEB40009FE56714 -S31A5000B8C10000EB0010A0E158009FE535FAFFEB3BFFFFEBF0A9EE -S31A5000B8D61BE984420100FC410100384401002823000080420173 -S31A5000B8EB00780E0150500E0150A80E0150C40E0150D8830000E7 -S31A5000B900EC0E0150B4420100CC4301009C850000AC8500003CFC -S31A5000B915440100200F0150A0420100400F01506C0F0150740F30 -S31A5000B92A01500DC0A0E1F0DF2DE904B04CE20040A0E10190A05A -S31A5000B93FE100A0A0E30A80A0E10160A0E30070A0E301C0D4E43E -S31A5000B9540A50A0E307005CE13500000A30005CE30030A01301D5 -S31A5000B96930A003030016E10A00000A0030D4E5411043E22020F3 -S31A5000B97E83E2FF2002E2190051E30230A091780053E302000096 -S31A5000B9931A1050A0E3014084E201C0D4E400E0A0E30E60A0E1DA -S31A5000B9A830104CE2FF0001E241204CE2FF3002E2050053E309FE -S31A5000B9BD0050830200009A61304CE2050053E30000008A01E04B -S31A5000B9D2A0E300005EE31200000A0000A0E3FF3001E209005339 -S31A5000B9E7E30100A0910600009A61304CE2050053E357004C9211 -S31A5000B9FC0200009AFF3002E2050053E337004C92050050E104A7 -S31A5000BA110000AA01C0D4E4950727E000005CE3CEFFFF1A0300DC -S31A5000BA2600EA2E005CE30100000A0000A0E3F0AF1BE903306892 -S31A5000BA3BE28331A0E117A38AE1018088E2030058E3BDFFFFDAA6 -S31A5000BA500A00A0E19E0800EB000089E50100A0E3F0AF1BE90DCD -S31A5000BA65C0A0E110D82DE90010A0E108D04DE20230D1E528404F -S31A5000BA7A9FE500308DE50320D1E504208DE50020D1E50130D1F4 -S31A5000BA8FE504B04CE210109FE50400A0E1B3F9FFEB0400A0E141 -S31A5000BAA4010000EA90C000008C0F015010A81BE90DC0A0E1F016 -S31A5000BAB9D82DE904B04CE200E0A0E108C09EE5FF1001E2046050 -S31A5000BACE9BE50250A0E1000096E50370A0E108208EE21400920D -S31A5000BAE3E8044082E000C08CE0140000EA010052E10E00001AE4 -S31A5000BAF80230DCE508009EE502E093E20500000A0E10A0E10060 -S31A5000BB0D30DCE5011051E20130C5E402C08CE2FAFFFF1A00E09C -S31A5000BB2287E50C3060E0003086E50100A0E3F0A81BE90230DC07 -S31A5000BB37E58330A0E1043083E203C08CE004005CE10300002A54 -S31A5000BB4C0020DCE5FF3002E2FF0053E3E4FFFF1A0000A0E3F0F6 -S31A5000BB61A81BE90DC0A0E100D82DE9083090E5FF2002E20120C0 -S31A5000BB76C3E704B04CE200A81BE90DC0A0E100D82DE90610A03A -S31A5000BB8BE3002090E504B04CE201C0D2E45C31A0E1010013E379 -S31A5000BBA00100000A0130D2E4A32382E0011051E2F8FFFF5A008C -S31A5000BBB52080E500A81BE90DC0A0E100D82DE9002090E50130F2 -S31A5000BBCAD2E404B04CE21C1003E21C0051E3012082120330032C -S31A5000BBDFE2030053E301208212002080E500A81BE90DC0A0E1AC -S31A5000BBF4F0DF2DE904B04CE20040A0E30090A0E100C099E50409 -S31A5000BC0960A0E10120DCE401E0A0E1603002E2A332A0E144306E -S31A5000BC1ECEE5800012E34100000A0120DCE40470A0E10F300231 -S31A5000BC33E2013083E240308EE5030057E13A0000AA303002E2E8 -S31A5000BC4823A2A0E12283A0E10750A0E103005AE30AF19F9713C9 -S31A5000BC5D0000EAB0BC005070BC005078BC00508CBC00500160DD -S31A5000BC72DCE40D0000EA0120DCE50030DCE5026483E102C08CC5 -S31A5000BC87E2080000EA0300DCE50020DCE50230DCE50110DCE514 -S31A5000BC9C002C82E10338A0E1013483E1036082E104C08CE20E53 -S31A5000BCB16085E7030058E308F19F97130000EA10BD0050D0BC49 -S31A5000BCC60050D8BC0050ECBC00500140DCE40D0000EA0120DCF2 -S31A5000BCDBE50030DCE5024483E102C08CE2080000EA0300DCE598 -S31A5000BCF00020DCE50230DCE50110DCE5002C82E10338A0E101F7 -S31A5000BD053483E1034082E104C08CE2014084E220308EE20540B7 -S31A5000BD1A83E7017087E240309EE5045085E2030057E1C8FFFFCB -S31A5000BD2FBA00C089E5F0AF1BE90DC0A0E130D82DE904B04CE2D0 -S31A5000BD4404D04DE200C0A0E118000BE50C10A0E10130D1E402C3 -S31A5000BD5950A0E1FF3003E218100BE51B0053E30800000A18C047 -S31A5000BD6E0BE510009FE510109FE50020DCE560E3FFEB0000A094 -S31A5000BD83E3240000EA980F0150BC0F0150010081E218000BE5E4 -S31A5000BD980120D1E5011080E218100BE53F3002E20030C5E58031 -S31A5000BDAD0012E30300000A0130D0E50130C5E5012081E21820AC -S31A5000BDC20BE518301BE50140D3E40240C5E518300BE5010014AD -S31A5000BDD7E30100000A18004BE266FFFFEB020014E30100000A7B -S31A5000BDEC18004BE262FFFFEB040014E30100000A18004BE26DA4 -S31A5000BE01FFFFEB080014E30200000A18004BE2041085E275FFAE -S31A5000BE16FFEB0100A0E330A81BE90DC0A0E100D82DE904B04C3B -S31A5000BE2BE200C0A0E10130DCE402E0A0E11A0053E30500000AD6 -S31A5000BE4090009FE590109FE501205CE52CE3FFEB0000A0E30081 -S31A5000BE55A81BE901C08CE20100DCE40030A0E301C08CE20030D4 -S31A5000BE6A8EE5031010E20500004A0320A0E10130DCE702248365 -S31A5000BE7FE1011051E2FBFFFF5A00208EE5033000E2013083E2A2 -S31A5000BE9403C08CE00010A0E33C3000E22331A0E1013083E204C4 -S31A5000BEA9308EE5030051E1060000AA08008EE20130DCE401300C -S31A5000BEBEC0E704209EE5011081E2020051E1F9FFFFBA0100A0D1 -S31A5000BED3E300A81BE9980F0150D00F01500DC0A0E100D82DE911 -S31A5000BEE8001050E204B04CE20300000A10009FE501E3FFEB005C -S31A5000BEFD00A0E300A81BE904009FE500A81BE9E00F0150B0C0C7 -S31A5000BF1200000DC0A0E130D82DE904B04CE20050A0E31C409FA8 -S31A5000BF27E5005084E50400A0E19EF6FFEB2C4084E2015085E284 -S31A5000BF3C000055E3F8FFFFDA30A81BE9B0C000000DC0A0E100F8 -S31A5000BF51D82DE904B04CE2D8F6FFEB00A81BE90DC0A0E100D82B -S31A5000BF662DE904B04CE205F7FFEB00A81BE90DC0A0E110D82D83 -S31A5000BF7BE940409FE51C3094E504B04CE2000053E30100000A86 -S31A5000BF900000A0E310A81BE9030084E8980200EB000050E305DB -S31A5000BFA500001A083094E50120A0E31C2084E5003063E2103068 -S31A5000BFBA84E510A81BE910A81BE9104401000DC0A0E100D82D93 -S31A5000BFCFE93C209FE50010A0E11C3092E504B04CE2000053E3D2 -S31A5000BFE40100001A0700A0E300A81BE9143092E5030051E103AE -S31A5000BFF900003A183092E50000A0E3030051E10000003A0100F1 -S31A5000C00EA0E300A81BE9104401000DC0A0E100D82DE930009F38 -S31A5000C023E504B04CE21C3090E502C0A0E1000053E30500000AA2 -S31A5000C038143090E5003081E5182090E500208CE50000A0E3008D -S31A5000C04DA81BE90700A0E300A81BE9104401000DC0A0E100D82B -S31A5000C0622DE92C209FE51C3092E504B04CE2000053E3050000AD -S31A5000C0770A083092E5003080E50C2092E5002081E50000A0E364 -S31A5000C08C00A81BE90700A0E300A81BE9104401000DC0A0E1F0D4 -S31A5000C0A1DF2DE904B04CE200A0A0E30050A0E10180A0E108C19E -S31A5000C0B69FE50290A0E11C309CE50C70A0E10A0053E10100007F -S31A5000C0CB1A0700A0E3F0AF1BE9006097E5E8109FE5E8209FE5DF -S31A5000C0E00600A0E1022061E0ACF6FFEB0E02A0E3021A80E2204E -S31A5000C0F52090E4000031E1FCFFFF1A160F07EE9A0F07EE00006E -S31A5000C10AA0E10000A0E10000A0E10000A0E10000A0E10000A0A5 -S31A5000C11FE1101F11EE011AC1E3101F01EE151F07EE0000A0E11F -S31A5000C1340000A0E10000A0E10000A0E10000A0E10000A0E1100B -S31A5000C1493097E5034005E00410A0E1085085E070009FE505204C -S31A5000C15EA0E110F8FFEB68809FE5040000EA083097E560009FF6 -S31A5000C173E50130C3E3034084E009F8FFEB050054E10600002AA9 -S31A5000C1880400A0E10FE0A0E106F0A0E1730200EB00A050E2F2BC -S31A5000C19DFFFF0A004089E5101F11EE011A81E3031081E3101F2E -S31A5000C1B201EE0800A0E1FAF7FFEB0A00A0E1F0AF1BE91044014C -S31A5000C1C70014CC005034CD0050FC0F0150181001501410015042 -S31A5000C1DC0DC0A0E1F0DF2DE904B04CE204D04DE20270A0E100ED -S31A5000C1F190A0E30050A0E1A4C09FE50160A0E11C209CE50CA0CC -S31A5000C206A0E12C300BE5090052E10700A0034300000A00809AB3 -S31A5000C21BE584109FE584209FE50800A0E1022061E05BF6FFEB6C -S31A5000C2300E02A0E3021A80E2202090E4000031E1FCFFFF1A16A2 -S31A5000C2450F07EE9A0F07EE0000A0E10000A0E10000A0E1000069 -S31A5000C25AA0E10000A0E10000A0E1101F11EE011AC1E3101F01D9 -S31A5000C26FEE151F07EE0000A0E10000A0E10000A0E10000A0E149 -S31A5000C2840000A0E10000A0E11C009FE50610A0E1072086E00584 -S31A5000C29930A0E1C1F7FFEB090000EA1044010034CD005074CE0C -S31A5000C2AE00501C10015070009FE5077064E0B9F7FFEB0130C41A -S31A5000C2C3E3035085E0036086E0000057E30D0000DA0500A0E105 -S31A5000C2D808309AE50610A0E1030057E10740A0B10340A0A10452 -S31A5000C2ED20A0E10FE0A0E108F0A0E11A0200EB009050E2EBFFA9 -S31A5000C302FF0A2C301BE5005083E5101F11EE011A81E303108172 -S31A5000C317E3101F01EE0C009FE5A0F7FFEB0900A0E1010000EA34 -S31A5000C32C1410015018100150F0AF1BE90DC0A0E100D82DE904D5 -S31A5000C341B04CE2070050E300F19F97170000EA70C3005078C393 -S31A5000C356005080C3005088C3005090C3005098C30050A0C3004D -S31A5000C36B50A8C3005040009FE500A81BE93C009FE500A81BE980 -S31A5000C38038009FE500A81BE934009FE500A81BE930009FE500D2 -S31A5000C395A81BE92C009FE500A81BE928009FE500A81BE92400B9 -S31A5000C3AA9FE500A81BE920009FE500A81BE93C1001505C10019E -S31A5000C3BF50741001508C100150A8100150C0100150D0100150A6 -S31A5000C3D4F4100150181101500DC0A0E100D82DE9003090E5004E -S31A5000C3E90053E104B04CE20500000A043090E5001083E504306F -S31A5000C3FE90E5090081E8041080E500A81BE9041083E5001083B9 -S31A5000C413E5043081E5003081E500A81BE90DC0A0E100D82DE9C1 -S31A5000C4280010A0E1000091E504B04CE2010050E10400000A0080 -S31A5000C43D3090E5003081E5002090E5041082E500A81BE900009D -S31A5000C452A0E300A81BE90DC0A0E170D82DE93C309FE53C209FB9 -S31A5000C467E53C509FE5043083E504B04CE2003083E50F40A0E38D -S31A5000C47C042082E50260A0E1002082E50600A0E10510A0E1D172 -S31A5000C491FFFFEB615E85E2014054E2F9FFFF5A70A81BE9E4C0A9 -S31A5000C4A60000DCC00000ECC000000DC0A0E130D82DE90620A0B1 -S31A5000C4BBE304B04CE20050A0E1100085E20140A0E1B3F5FFEBB5 -S31A5000C4D00410A0E118009FE50620A0E3AFF5FFEB10309FE500D5 -S31A5000C4E55083E50500A0E1020000EB30A81BE9304401003C44F0 -S31A5000C4FA01000DC0A0E100D82DE90030A0E1101080E204B04C67 -S31A5000C50FE200C093E50020A0E30FE0A0E100F09CE500A81BE977 -S31A5000C5240DC0A0E1F0DF2DE944319FE504B04CE288D04DE23CDB -S31A5000C539C19FE50540A0E34C8093E50090A0E100509CE50270F2 -S31A5000C54EA0E1AC100BE5000058E31000000A0850A0E100C095D2 -S31A5000C563E514219FE520309CE524308CE50C3095E520208CE5D2 -S31A5000C578000053E30700001A0500A0E1F8109FE50320A0E10F3C -S31A5000C58DE0A0E100F09CE50C3095E5013083E30C3085E5D0604E -S31A5000C5A29FE50A0000EA003095E50500A0E10FE0A0E118F0937B -S31A5000C5B7E5C8009FE5483096E5014044E20FE0A0E103F0A0E1AA -S31A5000C5CC000054E33E0000DA003095E50500A0E10FE0A0E10C09 -S31A5000C5E1F093E5000050E3EEFFFF0AA8900BE50EA0A0E3A4A0C1 -S31A5000C5F60BE5AC301BE59C700BE5A0300BE50500A0E17C409F71 -S31A5000C60BE50030A0E3003084E5A8104BE200C095E50220A0E3CF -S31A5000C62000408DE50A3087E00FE0A0E110F09CE558309FE5005F -S31A5000C6352093E50460A0E1000052E31800000A8EFBFFEB004013 -S31A5000C64AA0E140009FE5D4F6FFEB0900A0E10A10A0E102F9FF6D -S31A5000C65FEBAC001BE50710A0E1FFF8FFEB0400A0E193FBFFEB63 -S31A5000C6740B0000EA500000003C440100CC830000304401004091 -S31A5000C6890D0300F02701003844010028110150002095E5050078 -S31A5000C69EA0E10FE0A0E118F092E5003096E5000053E3F8FFFFEA -S31A5000C6B30A000058E30400000A003095E5242093E5202083E5BB -S31A5000C6C80010A0E3241083E5F0AF1BE90DC0A0E100D82DE930C9 -S31A5000C6DD309FE5030051E104B04CE200C0A0E10200001A013099 -S31A5000C6F2A0E3003081E500A81BE900309CE50C00A0E124C09363 -S31A5000C707E50FE0A0E108F09CE500A81BE9F02701000DC0A0E1E7 -S31A5000C71CF0D92DE9DC309FE5DC209FE504B04CE20070A0E14CA4 -S31A5000C7316093E50180A0E1005092E5000056E31000000A065053 -S31A5000C746A0E100C095E5B8209FE520309CE524308CE50C30950A -S31A5000C75BE520208CE5000053E30700001A0500A0E19C109FE5D0 -S31A5000C7700320A0E10FE0A0E100F09CE50C3095E5013083E30C80 -S31A5000C7853085E5003095E50500A0E10FE0A0E118F093E574001B -S31A5000C79A9FE51FFFFFEB004050E20D00000A0700A0E10C1084F7 -S31A5000C7AFE20E20A0E3F9F4FFEB0800A0E1082094E51A1084E2FB -S31A5000C7C40E2042E2F4F4FFEB44009FE50410A0E100FFFFEB0898 -S31A5000C7D90094E5000000EA0400A0E1000056E30400000A003096 -S31A5000C7EE95E5242093E5202083E50010A0E3241083E5F0A91B1F -S31A5000C803E9500000003C440100CC83000030440100E4C00000A8 -S31A5000C818DCC000000DC0A0E1F0D92DE904B04CE20050A0E30235 -S31A5000C82D80A0E1080055E10160A0E10D0000AA34709FE58541DA -S31A5000C842A0E1060094E7001097E5064084E0042094E5D1F4FFF2 -S31A5000C857EB003097E5042094E5015085E2023083E0003087E559 -S31A5000C86C080055E1F2FFFFBAF0A91BE9F42701000DC0A0E1F082 -S31A5000C881D92DE904B04CE280D04DE20060A0E10C019FE5017019 -S31A5000C896A0E1E0FEFFEB008050E20C5088120800001AF5FAFF36 -S31A5000C8ABEB0040A0E1F0009FE5F0109FE50720A0E1EC509FE516 -S31A5000C8C038F6FFEB0400A0E1FDFAFFEBA0500BE50600A0E19C8C -S31A5000C8D5700BE5A0104BE2003096E50120A0E30FE0A0E114F0F8 -S31A5000C8EA93E5C0209FE5003092E5000053E30B00000AE0FAFF3C -S31A5000C8FFEB0040A0E1AC009FE526F6FFEB0500A0E10E10A0E3C5 -S31A5000C91454F8FFEB0E0085E20E1047E251F8FFEB0400A0E1E529 -S31A5000C929FAFFEB003096E5242093E5000052E31200000A1E10D9 -S31A5000C93E85E274009FE50420A0E3A1F6FFEB000050E30C0000C8 -S31A5000C9530A64309FE5002096E5005083E5144092E524C092E5DE -S31A5000C96854309FE50600A0E1143082E50710A0E10FE0A0E1041E -S31A5000C97DF09CE5003096E5144083E5000058E30E00000A0870AC -S31A5000C99288E52C009FE50810A0E18EFEFFEB0C0000EADCC0007C -S31A5000C9A7003811015058110150EC21010038440100681101507C -S31A5000C9BCD8830000F42701001CC80050E4C00000A0001BE59C85 -S31A5000C9D1101BE524F8FFEBF0A91BE90DC0A0E100D82DE91430C8 -S31A5000C9E69FE5000093E5002090E504B04CE20FE0A0E11CF09265 -S31A5000C9FBE500A81BE93C4401000DC0A0E1F0D82DE9F8209FE5F7 -S31A5000CA10F8109FE5022061E004B04CE2F0709FE55CD04DE200AB -S31A5000CA254097E50400A0E15BF4FFEB0E02A0E3021A80E22020DB -S31A5000CA3A90E4000031E1FCFFFF1A160F07EE9A0F07EE0000A09F -S31A5000CA4FE10000A0E10000A0E10000A0E10000A0E10000A0E116 -S31A5000CA64101F11EE011AC1E3101F01EE151F07EE0000A0E100B2 -S31A5000CA7900A0E10000A0E10000A0E10000A0E10000A0E150502D -S31A5000CA8E4BE20500A0E10FE0A0E104F0A0E1101F11EE011A81DB -S31A5000CAA3E3031081E3101F01EE0560A0E140404BE20400A0E198 -S31A5000CAB858109FE50320A0E310F6FFEB000050E31400000A48F8 -S31A5000CACD009FE5B4F5FFEB3430A0E324308DE504E0A0E10F00C6 -S31A5000CAE2BEE80DC0A0E10F00ACE80F00BEE80F00ACE800309E2C -S31A5000CAF7E500308CE50F0096E866E0FFEB0800A0E3150000EA07 -S31A5000CB0C3CCF005074CE005010440100781101507C11015005BF -S31A5000CB2132A0E3143087E530C0D5E52F10D5E52EE0D5E52D208C -S31A5000CB36D5E50C1481E18134A0E10E2482E1012082E208308749 -S31A5000CB4BE50114A0E10C2087E5910203E08330A0E1053283E226 -S31A5000CB60183087E5F0A81BE90DC0A0E110D82DE944309FE504D2 -S31A5000CB75B04CE20040A0E1033004E0000053E30A00000A300025 -S31A5000CB8A9FE50410A0E184F5FFEB28309FE5033004E00000537E -S31A5000CB9FE30100000A0400A0E310A81BE90200A0E310A81BE9B9 -S31A5000CBB40300A0E110A81BE97E007E009C110150100010000DAF -S31A5000CBC9C0A0E100D82DE934309FE50020A0E3030050E104B05F -S31A5000CBDE4CE20100008A030051E10400008A1C309FE50300504D -S31A5000CBF3E10200008A030051E10000009A0120A0E30200A0E174 -S31A5000CC0800A81BE94400005008FA00500DC0A0E130D82DE904BF -S31A5000CC1DB04CE20040A0E1103F11EE2351A0E1015015E2100072 -S31A5000CC32000A0E02A0E3021A80E2202090E4000031E1FCFFFFBC -S31A5000CC471A160F07EE9A0F07EE0000A0E10000A0E10000A0E12D -S31A5000CC5C0000A0E10000A0E10000A0E1101F11EE0C10C1E310EC -S31A5000CC711F01EE161F07EE98C09FE598E09FE598309FE5A41B3D -S31A5000CC86A0E194209FE5811BA0E1003081E58C309FE5002081F6 -S31A5000CC9BE5003084E5000091E50E3000E00E0053E10100000ACF -S31A5000CCB001C05CE2F9FFFF1A6C309FE56C209FE5033000E000C6 -S31A5000CCC52081E5000053E30B00000A043094E40128A0E30100DA -S31A5000CCDA73E30500001A042042E2000052E3020000DA04309459 -S31A5000CCEFE4010073E3F9FFFF0A000052E30000A003000055E38E -S31A5000CD040200000A101F11EE0F1081E3101F01EE30A81BE940CD -S31A5000CD194B4C00800080005000500020002000D000D0007E001A -S31A5000CD2E7E00FF00FF000DC0A0E1F0D82DE904B04CE20040A030 -S31A5000CD43E10160A0E102E0A0E100C0A0E3103F11EE2351A0E1D9 -S31A5000CD58015015E21000000A0E02A0E3021A80E2202090E40049 -S31A5000CD6D0031E1FCFFFF1A160F07EE9A0F07EE0000A0E10000FC -S31A5000CD82A0E10000A0E10000A0E10000A0E10000A0E1101F1181 -S31A5000CD97EE0C10C1E3101F01EE161F07EEAC309FE5A40BA0E1AB -S31A5000CDACA8709FE5800BA0E1003080E5070000EA9C309FE5009E -S31A5000CDC13080E5042094E4043096E4030052E18CC09F151600DC -S31A5000CDD6001A04E04EE200005EE3130000DA7C309FE5003080B6 -S31A5000CDEBE5002096E5002084E500C090E56C109FE507300CE07C -S31A5000CE00070053E10600000A4C209FE5011051E20700000A0037 -S31A5000CE15C090E502300CE0020053E1F9FFFF1A44309FE50330ED -S31A5000CE2A0CE0000053E3E1FFFF0A24309FE5003080E5000055D0 -S31A5000CE3FE30200000A101F11EE0F1081E3101F01EE0C00A0E13D -S31A5000CE54F0A81BE95000500080008000FF00FF001099109910D7 -S31A5000CE69001000404B4C007E007E000DC0A0E100D82DE904B08B -S31A5000CE7E4CE200E0A0E1103F11EE23C1A0E101C01CE210000038 -S31A5000CE930A0E02A0E3021A80E2202090E4000031E1FCFFFF1A3F -S31A5000CEA8160F07EE9A0F07EE0000A0E10000A0E10000A0E100E4 -S31A5000CEBD00A0E10000A0E10000A0E1101F11EE0C10C1E3101F6A -S31A5000CED201EE161F07EE50209FE550309FE50512A0E300308199 -S31A5000CEE7E5012042E2000052E3FCFFFFCA0020A0E3043091E471 -S31A5000CEFC012082E20130CEE4330052E3FAFFFF9A24309FE50091 -S31A5000CF113081E500005CE30200000A101F11EE0F1081E3101FF4 -S31A5000CF2601EE0000A0E300A81BE9400D030098009800FF00FF04 -S31A5000CF3B000DC0A0E110D82DE94C309FE504B04CE2000093E5E5 -S31A5000CF500140A0E1000050E30000000A0FF3FFEB0030D4E502A0 -S31A5000CF650053E30900001A1C0084E224109FE50620A0E315F51B -S31A5000CF7AFFEB000050E30300001A101084E210009FE50420A034 -S31A5000CF8FE302F3FFEB10A81BE9F827010030440100D8830000C9 -S31A5000CFA40DC0A0E1F0DF2DE90010A0E34B2FA0E36C319FE5043A -S31A5000CFB9B04CE252DF4DE2000083E5165E4BE20500A0E113F538 -S31A5000CFCEFFEB54419FE554119FE50030A0E30030C4E50130C48B -S31A5000CFE3E50230C4E50330C4E50100A0E33C219FE528304BE25D -S31A5000CFF80200C3E734319FE528204BE20300C2E72CC19FE506A1 -S31A5000D00D20A0E328304BE20C20C3E720319FE55C310BE5510F08 -S31A5000D0224BE2DDF2FFEBFFC0A0E3053DE0E328104BE203C0C18D -S31A5000D037E74F2FE0E30130A0E102C0C3E7F8309FE503C0C1E731 -S31A5000D04CF4109FE528304BE201C0C3E7EC309FE528104BE203F9 -S31A5000D061C0C1E7E4109FE528304BE201C0C3E70270A0E3D83097 -S31A5000D0769FE528104BE203C0C1E70590A0E1CC109FE528304BE2 -S31A5000D08BE201C0C3E70480A0E1C0309FE528104BE203C0C1E7A4 -S31A5000D0A00850A0E1013083E203C0C1E734004BE2A8209FE5445A -S31A5000D0B510A0E3390000EB5BAF4BE2790700EB0060A0E10900CD -S31A5000D0CAA0E14B1FA0E34430A0E300308DE50A20A0E1013043D5 -S31A5000D0DFE2A90000EBA00200EB0030D5E5000053E30800001AA1 -S31A5000D0F40130D8E5000053E30500001A0230D5E5000053E3026A -S31A5000D10900001A0340D5E5000054E31200000A4400A0E3410049 -S31A5000D11E00EB0000A0E31B0000EAF8270100D883000030440143 -S31A5000D13300C8FEFFFFC9FEFFFFCAFEFFFF55553412BCFEFFFF9A -S31A5000D148BDFEFFFFBEFEFFFFC0FEFFFFC1FEFFFFC2FEFFFFC40E -S31A5000D15DFEFFFF3CCF0050500700EB000066E07D0E50E3DBFFF0 -S31A5000D172FF3A0730A0E1017047E2000053E3CEFFFFCA4400A017 -S31A5000D187E3260000EB08309FE50000E0E3004083E5000000EA38 -S31A5000D19C38440100F0AF1BE90DC0A0E170D82DE90118A0E16C56 -S31A5000D1B1309FE504B04CE20040A0E10250A0E14108A0E100C05F -S31A5000D1C693E50360A0E100005CE30900000A0038A0E12328A0AC -S31A5000D1DBE1B430DCE1020053E10100001A0000E0E370A81BE937 -S31A5000D1F000C09CE500005CE3F7FFFF1A0008A0E12008A0E1BD56 -S31A5000D2050200EBB400C4E1085084E5003096E5003084E5000073 -S31A5000D21AA0E3004086E570A81BE9FC2701000DC0A0E1F0D92DF7 -S31A5000D22FE90008A0E14008A0E15C309FE504B04CE20060A0E384 -S31A5000D244005093E50380A0E1060055E11000000A0078A0E1B4B0 -S31A5000D25940D5E12708A0E1A60200EB000054E10600001A0000DC -S31A5000D26E56E30200000A003095E5003086E5010000EA0030951B -S31A5000D283E5003088E50560A0E1005095E5000055E3EFFFFF1ACF -S31A5000D298F0A91BE9FC2701000DC0A0E1F0D92DE9BC309FE504C9 -S31A5000D2ADD04DE20070A0E1086097E504B04CE2B620D6E1018052 -S31A5000D2C2A0E1045097E5030052E10030A003B630C601B430D640 -S31A5000D2D7E1B230C5E1B400D6E1860200EB0040A0E10500A0E15E -S31A5000D2EC0A0200EB0020A0E10600A0E10410A0E1E30100EB0054 -S31A5000D30108B0E11D00001A60309FE5005093E5000055E31900C4 -S31A5000D316000AB420D5E1B230D6E1030052E11200001AB400D693 -S31A5000D32BE1730200EB084040E2B000D6E1700200EB0038A0E16F -S31A5000D3400500A0E1081086E22338A0E100308DE50420A0E10851 -S31A5000D35530A0E10FE0A0E108F095E50700A0E1BB0100EB0600A5 -S31A5000D36A00EAFFFF0000FC270100005095E5000055E3E5FFFF67 -S31A5000D37F1A0700A0E1B30100EBF0A91BE90DC0A0E1F0DF2DE932 -S31A5000D3940338A0E104B04CE20160A0E100A0A0E10290A0E1E892 -S31A5000D3A9C09FE54378A0E1F450DBE10C0056E13500008AD800BF -S31A5000D3BE9FE5840100EB008050E23100000A083086E2BC30C8CF -S31A5000D3D3E1084098E50508A0E1045098E52008A0E1450200EB0F -S31A5000D3E8B000C4E10708A0E12008A0E1410200EBB200C4E1BC0B -S31A5000D3FD00D8E13E0200EB0030A0E30A10A0E1B400C4E1062014 -S31A5000D412A0E1B630C4E1080084E2DFF1FFEB0C0085E274109FE5 -S31A5000D427E50420A0E3DBF1FFEB100085E20910A0E10420A0E3A0 -S31A5000D43CD7F1FFEB1170A0E30970C5E5B430D4E1B230C5E1BCCF -S31A5000D45160D8E10500A0E1AF0100EB0020A0E10400A0E10610FA -S31A5000D466A0E1880100EB0008A0E12008A0E1210200EB0710A06F -S31A5000D47BE1B600C4E10920A0E10800A0E1F10000EB0800A0E172 -S31A5000D490700100EBF0AF1BE9BE050000EA050000D88300000D18 -S31A5000D4A5C0A0E1F0D92DE904B04CE210D04DE20080A0E10240C8 -S31A5000D4BAA0E10400A0E10170A0E12C604BE20610A0E10350A0CC -S31A5000D4CFE1440600EB000050E30F0000BAB400D4E1060200EB84 -S31A5000D4E40048A0E1B400D5E12448A0E1020200EB0038A0E1080D -S31A5000D4F900A0E10710A0E12338A0E100308DE50620A0E1043056 -S31A5000D50EA0E19DFFFFEB0000A0E3030000EA0C009FE50C109FF0 -S31A5000D523E51FF3FFEB0000E0E3010000EAA8110150CC110150D6 -S31A5000D538F0A91BE90DC0A0E1F0D92DE964009FE50240A0E10013 -S31A5000D54D4080E55C809FE504B04CE2000098E50370A0E1F450D7 -S31A5000D562DBE14C609FE58CF1FFEB003096E5000053E309000021 -S31A5000D5770A0508A0E12008A0E1DE0100EB001096E5B400C1E15D -S31A5000D58C003097E5003081E50020A0E3002088E5F0A91BE91411 -S31A5000D5A1009FE50410A0E1FEF2FFEBF0A91BE90428010000283A -S31A5000D5B6010008280100DC1101500DC0A0E1F0DF2DE904B04C67 -S31A5000D5CBE20CD04DE20050A0E1B400D3E10160A0E104909BE5D9 -S31A5000D5E00270A0E1C50100EB0048A0E134004BE214209FE52436 -S31A5000D5F518A0E1E9FEFFEB000050E3020000AA0000E0E31F00A0 -S31A5000D60A00EA3CD5005078109FE578009FE578309FE504109989 -S31A5000D61FE8005081E50480A0E1006080E501A0A0E1007083E53E -S31A5000D6340060E0E30070A0E1821262E054009FE5012182E090B5 -S31A5000D6491C83E02333A0E1825183E0140600EB0040A0E112060C -S31A5000D65E00EB000064E0050050E10400002A3E0100EB00309ADA -S31A5000D673E5000053E3F7FFFF1A006097E52808A0E1E7FEFFEBC6 -S31A5000D6880600A0E1030000EA002801000428010008280100D369 -S31A5000D69D4D6210F0AF1BE90DC0A0E110D82DE90030D0E504B0DB -S31A5000D6B24CE2FF0053E30A00001A0130D0E5FF0053E307000064 -S31A5000D6C71A0230D0E5FF0053E30400001A0330D0E5FF0053E387 -S31A5000D6DC0100001A0100A0E310A81BE94C409FE50420A0E304CD -S31A5000D6F110A0E136F3FFEB000050E3F7FFFF0A0030D4E500000F -S31A5000D70653E30900001A0130D4E5000053E30600001A0230D419 -S31A5000D71BE5000053E30300001A0330D4E50100A0E3000053E3C5 -S31A5000D7300000000A0000A0E310A81BE9D88300000DC0A0E1F0AC -S31A5000D745D82DE904B04CE20CD04DE20050A0E1044095E50160AE -S31A5000D75AA0E1100084E2CFFFFFEB000050E30700000A0400A0CD -S31A5000D76FE10010D4E50020A0E30F1001E20111A0E1C20000EBC0 -S31A5000D7840008B0E10200000A0500A0E1B00000EB2D0000EA2835 -S31A5000D799704BE20700A0E10C1084E20420A0E3FCF0FFEB2400DD -S31A5000D7AE4BE20610A0E10620A0E3F8F0FFEB0030D4E5B200D462 -S31A5000D7C3E10F3003E20361A0E14B0100EB000066E0BC00C5E132 -S31A5000D7D80930D4E5060053E30C00000A020000CA010053E3039C -S31A5000D7ED00000A140000EA110053E30C00000A110000EA05006C -S31A5000D802A0E1063084E0083085E50710A0E1420100EB0D00002B -S31A5000D817EA0500A0E1063084E0083085E50710A0E1B90200EBBC -S31A5000D82C070000EA0500A0E1063084E0083085E50710A0E196B0 -S31A5000D841FEFFEB010000EA0500A0E1810000EBF0A81BE90DC04E -S31A5000D856A0E1F0DF2DE90060A0E1083086E2080113E8038048B1 -S31A5000D86BE004B04CE2045096E54801A0E1BC30D6E10F0000E263 -S31A5000D880083083E0BC30C6E1400080E30000C5E50070A0E301CE -S31A5000D89570C5E501A0A0E1BC00D6E10290A0E1150100EB8040A5 -S31A5000D8AA9FE5B200C5E1B000D4E1110100EBB400C5E1B030D4C7 -S31A5000D8BFE16C109FE5013083E2B030C4E1B670C5E14030A0E343 -S31A5000D8D40830C5E509A0C5E50420A0E3BA70C5E10C0085E2AC1E -S31A5000D8E9F0FFEB100085E20910A0E10420A0E3A8F0FFEB0500BB -S31A5000D8FEA0E10810A0E10720A0E1600000EB0008A0E12008A061 -S31A5000D913E1F90000EB041089E2BA00C5E1022BA0E30600A0E1CE -S31A5000D928CB0000EBF0AF1BE90C280100D88300000DC0A0E1F06D -S31A5000D93DD82DE97C209FE5003092E504B04CE2000053E31A0098 -S31A5000D952001A03E0A0E10130A0E3003082E50E40A0E15C709F67 -S31A5000D967E504C0A0E158509FE503E0A0E354609FE50500A0E1DB -S31A5000D97C001096E507208CE0023002E2022083E05ECE8CE210DD -S31A5000D9913085E2042083E70CC08CE2001080E501E05EE22830DE -S31A5000D9A69FE50010A0E1BE30C0E1144084E2140081E2F0FFFF53 -S31A5000D9BB5A001086E5F0A81BE9E8830000602801001028010063 -S31A5000D9D010400100EA0500000DC0A0E100D82DE960309FE50458 -S31A5000D9E5B04CE200C093E500005CE31200000A00209CE50020A5 -S31A5000D9FA83E510309CE504308CE540109FE5143083E208308CB3 -S31A5000DA0FE538E09FE50030A0E3BC30CCE1003091E52C209FE569 -S31A5000DA24013083E2003081E5001092E500009EE5033061E000ED -S31A5000DA390053E100308EC50C00A0E100A81BE910400100E083DE -S31A5000DA4E0000DC830000E48300000DC0A0E100D82DE920209F8C -S31A5000DA63E5003092E51C109FE5013043E2003082E5003091E589 -S31A5000DA78003080E504B04CE2000081E500A81BE9E08300001047 -S31A5000DA8D4001000DC0A0E100D82DE9021051E204B04CE202C0C8 -S31A5000DAA2A0E10300004AB230D0E0021051E203C08CE0FBFFFF4C -S31A5000DAB75A010071E30500001A0030D0E5FF20CEE302E083E13B -S31A5000DACCFFECCEE30E38A0E123C88CE00C08A0E12C28A0E1309B -S31A5000DAE1109FE520C882E00C3061E001005CE103C0A0C10C0011 -S31A5000DAF6E0E10008A0E12E0880E160E8A0E1200CA0E10008A0C6 -S31A5000DB0BE10E0C80E12008A0E100A81BE9FFFF00000DC0A0E1B2 -S31A5000DB2000D82DE90020A0E304D04DE2BC30D0E104B04CE21077 -S31A5000DB35204BE50910D0E50F104BE5BE20D0E1B011D0E1B2C1A4 -S31A5000DB4AD0E1023083E0013083E0B0215BE10C3083E0B200D068 -S31A5000DB5FE1023083E0000083E000A81BE90DC0A0E110D82DE98A -S31A5000DB7404B04CE210D04DE2B4009FE594FFFFEB004050E2022C -S31A5000DB8900001AA8009FE584F1FFEBFEFFFFEA101094E5942059 -S31A5000DB9E9FE520004BE2DBFAFFEBBC00C4E10008B0E12600006C -S31A5000DBB30A84209FE5003092E5B4015BE1013083E2003082E510 -S31A5000DBC84C0000EB020B50E30500000A68309FE5030050E10C10 -S31A5000DBDD00000A0400A0E19BFFFFEBE3FFFFEA54309FE50020D7 -S31A5000DBF293E5101094E5012082E2002083E5041084E50400A089 -S31A5000DC07E11A104BE2CBFEFFEBD9FFFFEA30309FE5002093E58A -S31A5000DC1C101094E5012082E2002083E5041084E50400A0E1C72E -S31A5000DC310300EBD0FFFFEAEA05000008120150F4830000060803 -S31A5000DC460000EC830000F08300000400A0E17FFFFFEB10A81BD1 -S31A5000DC5BE90DC0A0E170D82DE904B04CE210D04DE20050A0E107 -S31A5000DC7028604BE20600A0E10240A0E10620A0E3C6EFFFEB22E0 -S31A5000DC85004BE238109FE50620A0E3C2EFFFEB0448A0E12408FE -S31A5000DC9AA0E1170000EBBC014BE1101095E5BC20D5E10600A0E1 -S31A5000DCAFE11BFAFFEB10209FE5003092E5013083E2003082E5A2 -S31A5000DCC4010000EA30440100F883000070A81BE90DC0A0E12090 -S31A5000DCD93CA0E1003C83E1FF2800E200D82DE9FF0C00E200049B -S31A5000DCEEA0E1220480E1000083E104B04CE200A81BE90DC0A064 -S31A5000DD03E100D82DE90008A0E1FF3800E2200CA0E1230480E10F -S31A5000DD1804B04CE200A81BE90DC0A0E130D82DE90040A0E108DD -S31A5000DD2D0094E504B04CE2B030D0E10150A0E1080053E3160079 -S31A5000DD42001ABC10D4E10020A0E34FFFFFEB0008A0E120C8B0DF -S31A5000DD57E11000001A083094E500C0C3E5082094E5B2C0C2E187 -S31A5000DD6C080094E5BC10D4E10C20A0E144FFFFEB0008A0E120C7 -S31A5000DD8108A0E1DDFFFFEB083094E50110A0E3B200C3E1052028 -S31A5000DD96A0E10400A0E1ACFEFFEB0400A0E12BFFFFEB30A81BFC -S31A5000DDABE90DC0A0E1F0DF2DE904B04CE204D04DE20060A0E12B -S31A5000DDC00140A0E1307086E2048097E5020014E3085097E5025F -S31A5000DDD590A0E10F00000A1830A0E3BC30C7E10C30D5E5500113 -S31A5000DDEA9FE59030C3E3603083E30C30C5E5B5FFFFEB2C104BE3 -S31A5000DDFFE22C000BE50420A0E3140085E263EFFFEB0030A0E3AA -S31A5000DE14B831C6E1060000EAB831D6E1143083E2BC30C7E10C3A -S31A5000DE2920D5E5A020C2E3502082E30C20C5E50C30D5E50F306F -S31A5000DE3EC3E30C30C5E5580096E5A1FFFFEB040085E554009638 -S31A5000DE53E59EFFFFEB0030A0E3B031C5E1000059E3080085E510 -S31A5000DE6808A086E21800001AB401D6E1A1FFFFEBB000C5E1B60B -S31A5000DE7D01D6E19EFFFFEBB200C5E10D40C5E5B831D6E100000C -S31A5000DE9253E3083084130D30C515A0009FE596FFFFEBBE00C5E3 -S31A5000DEA7E1B291C5E10420A0E390109FE50C0088E238EFFFEBF4 -S31A5000DEBC100088E20A10A0E10420A0E334EFFFEB0630A0E30970 -S31A5000DED130C8E5BC00D7E188FFFFEBB200C8E1BC40D7E108000D -S31A5000DEE6A0E10BFFFFEB0020A0E10500A0E10410A0E1E4FEFFBF -S31A5000DEFBEB0008A0E12008A0E17DFFFFEB0610A0E3B001C5E149 -S31A5000DF100A20A0E10700A0E14DFEFFEB043096E50A0053E30A45 -S31A5000DF2500001A1C109FE51C0086E218209FE50630A0E1B2021C -S31A5000DF3A00EB110000EAB2050402B2050000D8830000C0D40132 -S31A5000DF4F0054E100500D30D5E5030013E30200001AB831D6E136 -S31A5000DF64000053E30600000A1C0086E2FA1FA0E308209FE5063A -S31A5000DF7930A0E1A10200EB000000EA38E10050F0AF1BE90DC03B -S31A5000DF8EA0E1F0DF2DE904B04CE208D04DE22C000BE52C301B46 -S31A5000DFA3E5089090E5046093E5080099E530100BE546FFFFEB60 -S31A5000DFB800A0A0E1040099E543FFFFEB0080A0E1B200D9E14B77 -S31A5000DFCDFFFFEB0058A0E1B000D9E14558A0E147FFFFEB1490CB -S31A5000DFE286E20048A0E12C301BE51470A0E3BC70C3E10A00A0C6 -S31A5000DFF7E15030A0E30C30C9E54448A0E132FFFFEB040089E557 -S31A5000E00C0800A0E12FFFFFEB080089E5010BA0E337FFFFEBBE25 -S31A5000E02100C9E10030A0E3B231C9E10558A0E1B031C9E1250814 -S31A5000E036A0E130FFFFEBB401C6E10448A0E12408A0E12CFFFFE5 -S31A5000E04BEBB200C9E10D70C9E50420A0E370109FE50C0086E2D9 -S31A5000E060CEEEFFEB100086E230101BE50420A0E3CAEEFFEB06A8 -S31A5000E07550A0E30950C6E52C301BE5BC00D3E11DFFFFEBB200E5 -S31A5000E08AC6E12C301BE5BC40D3E10600A0E19FFEFFEB0020A0AA -S31A5000E09FE10900A0E10410A0E178FEFFEB0008A0E12008A0E184 -S31A5000E0B411FFFFEBB001C9E130201BE52C001BE50510A0E1E1B9 -S31A5000E0C9FDFFEB000000EAD8830000F0AF1BE90DC0A0E100D8F7 -S31A5000E0DE2DE94C309FE50010A0E3002093E504B04CE201005261 -S31A5000E0F3E10D00000A03C0A0E1000052E10600001A000051E3FF -S31A5000E1080200000A003092E5003081E5010000EA003092E500D1 -S31A5000E11D308CE50210A0E1002092E5000052E3F2FFFF1A00A8E5 -S31A5000E1321BE9144001000DC0A0E100D82DE90010A0E30120A099 -S31A5000E147E304B04CE216FFFFEB00A81BE90DC0A0E100D82DE9C1 -S31A5000E15C0030A0E3043080E504B04CE2DAFFFFEB00A81BE90DAE -S31A5000E171C0A0E110D82DE90040A0E1440094E504B04CE20000A4 -S31A5000E18650E30500000A003090E5443084E52FFEFFEB4400947B -S31A5000E19BE5000050E3F9FFFF1A10A81BE90DC0A0E110D82DE9E8 -S31A5000E1B00030A0E304B04CE20040A0E1043084E51C0084E22966 -S31A5000E1C50200EB0400A0E1E7FFFFEB0400A0E1BFFFFFEB10A8C8 -S31A5000E1DA1BE90DC0A0E1F0D82DE90170A0E1082097E5BC10D771 -S31A5000E1EFE104B04CE20C30D2E50050A0E1040092E52332A0E1ED -S31A5000E2040331A0E1014063E0036082E0AFFEFFEB542095E5002C -S31A5000E2193062E0000053E3170000CA023060E0044063E00360B5 -S31A5000E22E86E0000054E3120000DA043082E0543085E54420957F -S31A5000E243E50030A0E3003087E5030052E10600000A000000EA0C -S31A5000E258002092E5003092E5000053E3FBFFFF1A007082E502FB -S31A5000E26D0000EA447085E54C4085E5486085E50100A0E3F0A81A -S31A5000E2821BE90000A0E3F0A81BE90DC0A0E130D82DE9083091D9 -S31A5000E297E50040A0E1080093E504B04CE28AFEFFEB583094E5A1 -S31A5000E2AC0050A0E1053063E0000053E3140000DA1C0084E2EA2E -S31A5000E2C10100EB582094E5B831D4E1051062E0030051E10310D8 -S31A5000E2D6A0A1000051E30B0000DAB831D4E1033061E0B831C4C4 -S31A5000E2EBE1012082E0582084E50338B0E10400000A380094E5F8 -S31A5000E300B821D4E1140080E2011080E023EEFFEB30A81BE90D59 -S31A5000E315C0A0E1F0DD2DE90080A0E1BC00D8E1086098E504B06A -S31A5000E32A4CE2044098E50170A0E171FEFFEBB200C4E100A0A0B7 -S31A5000E33FE3BC50D8E10400A0E1F3FDFFEB0020A0E10600A0E144 -S31A5000E3540510A0E1CCFDFFEB0008B0E1F600001AC4339FE500F1 -S31A5000E3695093E5000000EA005095E5000055E31200000AB200C7 -S31A5000E37ED6E1B441D5E15DFEFFEB000054E1F7FFFF1AB631D58D -S31A5000E393E1000053E30A00000AB000D6E10340A0E155FEFFEB8C -S31A5000E3A8000054E1EFFFFF1A0700A0E1081085E20420A0E3041C -S31A5000E3BDF0FFEB000050E3E9FFFF1A000055E3D800000A0C00C1 -S31A5000E3D285E2041087E20620A0E3EFEDFFEB043095E50200538A -S31A5000E3E7E30700000A0D30D6E5040013E30400000A0500A0E151 -S31A5000E3FC69FFFFEB0800A0E193FDFFEBF0AD1BE9043095E50111 -S31A5000E4113043E2090053E303F19F97C20000EA48E40050A8E42E -S31A5000E426005040E7005010E5005010E50050BCE5005000E60063 -S31A5000E43B5094E60050D8E600501CE700500D30D6E5020013E30B -S31A5000E4501000000A0230A0E3043085E5040096E51BFEFFEB0171 -S31A5000E4653080E2B000D6E1543085E522FEFFEBB601C5E10020DE -S31A5000E47A97E51210A0E3082085E50030A0E3B831C5E10500A09D -S31A5000E48FE1B035C5E18C0000EA0800A0E10710A0E1B9FEFFEB7E -S31A5000E4A4A50000EA1C0085E26F0100EB0D30D6E5041013E2029D -S31A5000E4B900000A0130A0E3043085E59D0000EA020013E303001A -S31A5000E4CE000A0500A0E10120A0E333FEFFEB970000EA100013F0 -S31A5000E4E3E39500000A080096E5F8FDFFEB583095E5013083E252 -S31A5000E4F8030050E18F00001A0430A0E3043085E5580085E58B3A -S31A5000E50D0000EA0D30D6E5544095E5100013E30200000A05009C -S31A5000E522A0E10810A0E157FFFFEB0500A0E10810A0E128FFFFEF -S31A5000E537EB0D30D6E500A0A0E1010013E30800000A040096E5ED -S31A5000E54CE0FDFFEB543095E5030050E10300001A013080E25467 -S31A5000E5613085E50520A0E3042085E5543095E5040053E1020047 -S31A5000E576001AB035D5E1000053E36E00000AB841D5E1000054D4 -S31A5000E58BE30700001A1C0085E2350100EB0500A0E11010A0E354 -S31A5000E5A00420A0E100FEFFEBB045C5E1630000EA0130A0E3B037 -S31A5000E5B535C5E1600000EA0D30D6E5100013E35D00000A05006C -S31A5000E5CAA0E10810A0E12DFFFFEB080096E5BDFDFFEB58309572 -S31A5000E5DFE5013083E2030050E15400001A0030A0E3043085E563 -S31A5000E5F40500A0E1B6FEFFEB4F0000EA0D30D6E5100013E3174A -S31A5000E60900000A0500A0E10810A0E11CFFFFEB080096E5ACFD4C -S31A5000E61EFFEB583095E5013083E2030050E10E00001A0D30D6A0 -S31A5000E633E5010013E30900000A0500A0E11010A0E3543095E566 -S31A5000E6480A20A0E3042085E5013083E2543085E50A2042E2D288 -S31A5000E65DFDFFEB010000EA0830A0E3043085E50D30D6E501002E -S31A5000E67213E33100000A1C0085E2FB0000EB0500A0E11110A05C -S31A5000E687E3543095E50920A0E30A0000EA0500A0E10810A0E188 -S31A5000E69CCEFEFFEB0D30D6E500A0A0E1010013E32300000A051B -S31A5000E6B100A0E11010A0E3543095E50A20A0E3042085E5013070 -S31A5000E6C683E2543085E50020A0E3B5FDFFEB190000EA0D30D641 -S31A5000E6DBE5100013E31600000A0500A0E10810A0E1E6FEFFEBDC -S31A5000E6F0080096E576FDFFEB583095E5013083E2030050E10D06 -S31A5000E70500001A1C0085E2D70000EB0A30A0E3043085E50800E7 -S31A5000E71A00EA0500A0E10010A0E30120A0E39FFDFFEB03000064 -S31A5000E72FEA144001000800A0E10710A0E112FEFFEB00005AE3E8 -S31A5000E7440100001A0800A0E1C1FCFFEBF0AD1BE90DC0A0E10030 -S31A5000E759D82DE904B04CE201FDFFEBD90000EB00A81BE90DC060 -S31A5000E76EA0E130D82DE954209FE504B04CE20040A0E10158A00D -S31A5000E783E14558A0E10010A0E323EFFFEB0130A0E3043084E54C -S31A5000E798B451C4E15C2084E2402084E5342084E524109FE52428 -S31A5000E7AD209FE5703084E2383084E5BE23C4E1003091E500302A -S31A5000E7C284E50000A0E3004081E530A81BE948060000144001DB -S31A5000E7D700EA0500000DC0A0E110D82DE90040A0E1043094E52E -S31A5000E7EC04B04CE2010000EAD6FFFFEB043094E5000053E30251 -S31A5000E80100000AB831D4E1000053E3F8FFFF1A10A81BE90DC035 -S31A5000E816A0E110D82DE904B04CE20040A0E1ECFFFFEB041094F8 -S31A5000E82BE5020051E30030A0130130A003040051E30320A011A4 -S31A5000E8400120A003000052E30600000A0400A0E11110A0E30734 -S31A5000E85530A0E3043084E50020A0E351FDFFEB060000EA050038 -S31A5000E86A51E30400001A0400A0E10630A0E3043084E51110A055 -S31A5000E87FE349FDFFEB0400A0E138FEFFEB10A81BE90DC0A0E16C -S31A5000E894F0D82DE904B04CE20160A0E1005052E20040A0E10230 -S31A5000E8A90000DA4C3094E5000053E30300001A0000A0E3F0A8C7 -S31A5000E8BE1BE94C0084E52B0000EA043094E5040053E30070A02A -S31A5000E8D3E3170000EA481094E50600A0E1AEECFFEB4C3094E525 -S31A5000E8E8440094E5037087E0002090E5036086E0442084E505FE -S31A5000E8FD5063E054FCFFEB440094E5000050E3EBFFFF0A0810E8 -S31A5000E91290E50C30D1E5BC20D0E12332A0E1032142E04C20849A -S31A5000E927E50C30D1E52332A0E1031181E0481084E5000055E36A -S31A5000E93C0D00000A4C2094E5020055E1E2FFFFAA0600A0E148E3 -S31A5000E9511094E50520A0E190ECFFEB483094E5057087E04C208D -S31A5000E96694E5053083E0483084E5022065E04C2084E50700A071 -S31A5000E97BE1F0A81BE90DC0A0E170D82DE904B04CE20040A0E165 -S31A5000E990380094E5005052E2010000CA0000A0E370A81BE90479 -S31A5000E9A53094E5043043E2010053E30100009A0000E0E370A858 -S31A5000E9BA1BE9B861D4E1000056E30C00001A34309FE514008045 -S31A5000E9CFE2030055E10350A0210520A0E16FECFFEB0400A0E13E -S31A5000E9E41010A0E3B851C4E10620A0E1EDFCFFEB0500A0E17007 -S31A5000E9F9A81BE90000A0E370A81BE9B20500000DC0A0E170D81B -S31A5000EA0E2DE904B04CE20060A0E10240A0E1041086E50350A08F -S31A5000EA23E1200100EB080086E50C4086E534309FE5002093E5F1 -S31A5000EA380310A0E1105086E5000052E30400000A060052E10593 -S31A5000EA4D00000A002092E5000052E3FAFFFF1A003091E50030A0 -S31A5000EA6286E5006081E570A81BE9184001000DC0A0E100D82D50 -S31A5000EA77E94C109FE50020A0E3003091E504B04CE2020053E10A -S31A5000EA8C0D00000A000053E10700001A000052E30200000A0072 -S31A5000EAA13093E5003082E500A81BE9003093E5003081E500A839 -S31A5000EAB61BE90320A0E1003093E5000053E3F1FFFF1A00A81BA3 -S31A5000EACBE9184001000DC0A0E170D82DE970309FE504B04CE2EC -S31A5000EAE00050A0E3004093E50360A0E1050054E11500000AEC17 -S31A5000EAF50000EB0C0094E9000063E0020050E10C00003A000086 -S31A5000EB0A55E30200000A003094E5003085E5010000EA0030946A -S31A5000EB1FE5003086E5100094E50FE0A0E10CF094E5004096E5E2 -S31A5000EB340050A0E3010000EA0450A0E1004094E5000054E3E90A -S31A5000EB49FFFF1A70A81BE9184001000DC0A0E1F0D92DE9007037 -S31A5000EB5EA0E1045097E5B200D5E104B04CE263FCFFEB0040A088 -S31A5000EB73E1B000D5E160FCFFEB010050E3020B54033B00001ABD -S31A5000EB88186085E20600A0E1EC809FE50420A0E30810A0E10C80 -S31A5000EB9DEEFFEB000050E33300001AB600D5E153FCFFEB01000F -S31A5000EBB250E31C00001A0200A0E34FFCFFEB0E4085E20410A06C -S31A5000EBC7E1B600C5E10420A0E30600A0E1F1EBFFEB126085E2D9 -S31A5000EBDC0600A0E1085085E20510A0E10620A0E3EBEBFFEB0485 -S31A5000EBF100A0E10810A0E10420A0E3E7EBFFEB0500A0E17C102A -S31A5000EC069FE50620A0E3E3EBFFEB1C30A0E3BC30C7E10700A0B4 -S31A5000EC1BE168209FE50610A0E10CFCFFEB120000EAB600D5E1B0 -S31A5000EC3032FCFFEB020050E30E00001A4C409FE5003094E5004B -S31A5000EC450053E30A00000A0E1085E2080094E50420A0E3DDEDA3 -S31A5000EC5AFFEB006050E20400001A081085E2040094E50620A0F3 -S31A5000EC6FE3CAEBFFEB006084E50700A0E175FBFFEBF0A91BE970 -S31A5000EC84D883000030440100060800001C4001000DC0A0E1F0AC -S31A5000EC99DF2DE904B04CE208D04DE20090A0E12C00A0E30180F1 -S31A5000ECAEA0E148FBFFEB007050E20400001A470000EA0700A0B5 -S31A5000ECC3E163FBFFEB0400A0E1440000EA044097E50100A0E3C6 -S31A5000ECD808FCFFEBB600C4E10100A0E305FCFFEBB000C4E102C2 -S31A5000ECED0BA0E302FCFFEBB200C4E10660A0E30460C4E50450A5 -S31A5000ED02A0E30550C4E50520A0E184109FE50E0084E2A1EBFF68 -S31A5000ED17EB080084E278109FE50620A0E19DEBFFEB180084E295 -S31A5000ED2C0910A0E10520A0E199EBFFEBFF30A0E330304BE52F5D -S31A5000ED41304BE52E304BE52D304BE52C304BE52B304BE5442071 -S31A5000ED569FE5016086E2048082E530A04BE2089082E5FE3043AD -S31A5000ED6BE2003082E50280A0E11C30A0E3BC30C7E10700A0E1D6 -S31A5000ED801C209FE50A10A0E1B3FBFFEB460000EB0050A0E1072C -S31A5000ED950000EAD8830000304401001C400100060800006FFB84 -S31A5000EDAAFFEB004098E5000054E3C1FFFF0A3B0000EB000065CC -S31A5000EDBFE0F90050E3F7FFFF9A0630A0E1016046E2000053E3D8 -S31A5000EDD4E6FFFFCA0700A0E11DFBFFEB0000E0E3F0AF1BE90D29 -S31A5000EDE9C0A0E1F0DD2DE904B04CE20080A0E10150A0E1A0A0A6 -S31A5000EDFE9FE50070A0E30A60A0E10800A0E10640A0E10410A044 -S31A5000EE13E10420A0E36DEDFFEB003050E20E00000A0C6084E27C -S31A5000EE28017087E20F0057E3F4FFFFDA0500A0E10810A0E1046D -S31A5000EE3D20A0E356EBFFEB0800A0E1041085E290FFFFEB00001F -S31A5000EE5250E3050000AA0000E0E3F0AD1BE9070096E8070085FE -S31A5000EE67E80300A0E1F0AD1BE930E09FE500C09EE5070095E8D8 -S31A5000EE7C8C308CE003318AE0070083E801C08CE200C08EE51081 -S31A5000EE91005CE30030A00300308E050000A0E3F0AD1BE92840B5 -S31A5000EEA60100FC8300000DC0A0E100D82DE928309FE5FA0FA0C0 -S31A5000EEBBE3482093E504B04CE20FE0A0E102F0A0E114109FE5BC -S31A5000EED0003091E5013083E20300A0E1003081E500A81BE95085 -S31A5000EEE5000000008400000DC0A0E1F0DF2DE904B04CE214D045 -S31A5000EEFA4DE20270A0E101A0A0E12C000BE5006053E2BF0000F9 -S31A5000EF0F1A0A0057E14200009A010857E30300002AFF0057E3B6 -S31A5000EF240800A0830000A093020000EA010457E31800A023100E -S31A5000EF3900A03340139FE53220A0E10230D1E7003083E0200053 -S31A5000EF4E73E20600000A1770A0E12C101BE5203060E23133A019 -S31A5000EF63E11AA083E11110A0E12C100BE50798A0E12998A0E114 -S31A5000EF780A00A0E12788A0E10810A0E1710200EB0040A0E10AB1 -S31A5000EF8D00A0E10810A0E1110100EB0060A0E1990602E02C1064 -S31A5000EFA21BE52138A0E1044883E1020054E10500002A0160466D -S31A5000EFB7E2074094E00200002A020054E101604632074084301B -S31A5000EFCC044062E00400A0E10810A0E15C0200EB0050A0E10418 -S31A5000EFE100A0E10810A0E1FC0000EB990002E02C101BE50138D4 -S31A5000EFF6A0E12338A0E1055883E1020055E10400002A010040EB -S31A5000F00BE2075095E00100002A020055E10100403206C880E1E7 -S31A5000F020E60000EA000057E30300001A0100A0E30210A0E1E95E -S31A5000F0350000EB0070A0E1010857E30720A0E10300002AFF007D -S31A5000F04A57E30800A0830000A093020000EA010457E31800A0E0 -S31A5000F05F231000A03318129FE53220A0E10230D1E7003083E042 -S31A5000F074200073E20130A00330300B050AA067003400000A2009 -S31A5000F0892060E21770A0E12C101BE53A52A0E13132A0E1111064 -S31A5000F09EA0E12C100BE51AA083E12788A0E10798A0E12998A08B -S31A5000F0B3E10500A0E10810A0E1230200EB0040A0E10500A0E19B -S31A5000F0C80810A0E1C30000EB0060A0E1990602E02A38A0E1044D -S31A5000F0DD4883E1020054E10500002A016046E2074094E0020070 -S31A5000F0F2002A020054E10160463207408430044062E00400A054 -S31A5000F107E10810A0E10F0200EB0050A0E10400A0E10810A0E138 -S31A5000F11CAF0000EB990002E00A38A0E12338A0E1055883E10211 -S31A5000F1310055E10500002A010040E2075095E00200002A0200F1 -S31A5000F14655E10100403207508530066880E105A062E030600B58 -S31A5000F15BE50798A0E12998A0E10A00A0E12788A0E10810A0E1AE -S31A5000F170F60100EB0040A0E10A00A0E10810A0E1960000EB00EC -S31A5000F18560A0E1990602E02C101BE52138A0E1044883E10200F5 -S31A5000F19A54E10500002A016046E2074094E00200002A020054E0 -S31A5000F1AFE10160463207408430044062E00400A0E10810A0E19C -S31A5000F1C4E10100EB0050A0E10400A0E10810A0E1810000EB991F -S31A5000F1D90002E02C101BE50138A0E12338A0E1055883E1020054 -S31A5000F1EE55E10400002A010040E2075095E00100002A020055E1 -S31A5000F203E10100403206C880E16D0000EA0A0056E10020A08342 -S31A5000F21830200B8502C0A0816800008A010856E30620A0E103EA -S31A5000F22D00002AFF0056E30800A0830000A093020000EA0104C5 -S31A5000F24256E31800A0231000A03330109FE53220A0E10230D1D0 -S31A5000F257E7003083E0200073E20800001A2C301BE506005AE19E -S31A5000F26C0700539101C0A0E300C0A0310010A0E330100BE55064 -S31A5000F2810000EA28120150202060E23732A0E1166083E11770E0 -S31A5000F296A0E12C101BE53A52A0E13132A0E11110A0E12C100B76 -S31A5000F2ABE51AA083E12698A0E10628A0E12228A0E10500A0E1B6 -S31A5000F2C034200BE50910A0E1A00100EB0040A0E10500A0E10929 -S31A5000F2D510A0E1400000EB34201BE50080A0E1980202E02A38DF -S31A5000F2EAA0E1044883E1020054E10500002A018048E20640949D -S31A5000F2FFE00200002A020054E10180483206408430044062E0E6 -S31A5000F3140400A0E10910A0E18B0100EB0050A0E10400A0E10999 -S31A5000F32910A0E12B0000EB34201BE5900202E00A38A0E12338EC -S31A5000F33EA0E1055883E1020055E10500002A010040E2065095AD -S31A5000F353E00200002A020055E1010040320650853008C880E15C -S31A5000F36805A062E02C08A0E12738A0E10018CCE10328C7E19195 -S31A5000F37D020EE0900202E0930101E0900303E0011092E001381A -S31A5000F392832201E89EE02138A3E00A0053E10500008A2C101B04 -S31A5000F3A7E50030A0130130A003000053E301005E110000009A1F -S31A5000F3BC01C04CE20020A0E330200BE53CC00BE530301BE54088 -S31A5000F3D1204BE238300BE5030092E9F0AF1BE9000051E31F00B8 -S31A5000F3E6000A0130A0E30020A0E3010050E11900003A01025182 -S31A5000F3FBE3000051310112A0310332A031FAFFFF3A020151E3EF -S31A5000F410000051318110A0318330A031FAFFFF3A010050E101C4 -S31A5000F42500402003208221A10050E1A1004020A32082212101FB -S31A5000F43A50E12101402023218221A10150E1A1014020A32182B2 -S31A5000F44F21000050E32332B0112112A011EFFFFF1A0200A0E17A -S31A5000F4640EF0A0E104E02DE5640100EB0000A0E30080BDE80DC3 -S31A5000F479C0A0E1F0DF2DE904B04CE224D04DE20260A0E1018099 -S31A5000F48EA0E138000BE530C04BE234C00BE5007053E29700002D -S31A5000F4A31A080056E11800009A010856E30300002AFF0056E34C -S31A5000F4B80800A0830000A093020000EA010456E31800A0231076 -S31A5000F4CD00A033D4129FE53220A0E10230D1E7003083E02030F7 -S31A5000F4E273E23C300BE55200000A1663A0E138101BE5203063BD -S31A5000F4F7E23C201BE53133A0E1188283E11112A0E138100BE5AD -S31A5000F50C490000EA000056E30300001A0100A0E30210A0E1AE46 -S31A5000F521FFFFEB0060A0E1010856E30620A0E10300002AFF00A0 -S31A5000F53656E30800A0830000A093020000EA010456E31800A0F1 -S31A5000F54B231000A03354129FE53220A0E10230D1E7003083E015 -S31A5000F560203073E23C300BE5088066003100000A3C201BE53C7E -S31A5000F575304BE2081093E83C101BE5202062E21663A0E13852E7 -S31A5000F58AA0E13C32A0E140200BE51CC1A0E138C00BE5188183F4 -S31A5000F59FE12678A0E106A8A0E12AA8A0E10500A0E10710A0E161 -S31A5000F5B4E50000EB0040A0E10500A0E10710A0E185FFFFEB9A35 -S31A5000F5C90002E02838A0E1044883E1020054E10300002A0640BA -S31A5000F5DE94E00100002A020054E106408430044062E00400A0C8 -S31A5000F5F3E10710A0E1D40000EB0050A0E10400A0E10710A0E187 -S31A5000F60874FFFFEB9A0002E00838A0E12338A0E1055883E1025E -S31A5000F61D0055E10300002A065095E00100002A020055E106509B -S31A5000F6328530058062E006A8A0E12AA8A0E10800A0E12678A0A8 -S31A5000F647E10710A0E1BF0000EB0040A0E10800A0E10710A0E153 -S31A5000F65C5FFFFFEB9A0002E038C01BE52C38A0E1044883E102F0 -S31A5000F6710054E10300002A064094E00100002A020054E106406A -S31A5000F6868430044062E00400A0E10710A0E1AD0000EB0050A03A -S31A5000F69BE10400A0E10710A0E14DFFFFEB9A0002E038101BE50C -S31A5000F6B00138A0E12338A0E1055883E1020055E10300002A062D -S31A5000F6C55095E00100002A020055E106508530055062E0385088 -S31A5000F6DA0BE534201BE5000052E39600000A38301BE53CC01B2D -S31A5000F6EFE5333CA0E148300BE50010A0E344100BE58B0000EA27 -S31A5000F704080057E10500009A48000BE544800BE540204BE20C36 -S31A5000F7190012E930C04BE2860000EA010857E30720A0E103000F -S31A5000F72E002AFF0057E30800A0830000A093020000EA01045767 -S31A5000F743E31800A0231000A03358109FE53220A0E10230D1E711 -S31A5000F758003083E0203073E23C300BE51100001A38301BE50718 -S31A5000F76D0058E1060053910200003A06C053E00780C8E038C0B2 -S31A5000F7820BE534101BE5000051E36C00000A38201BE548200B73 -S31A5000F797E544800BE540204BE20C0012E901C0A0E1640000EA4A -S31A5000F7AC281301503C301BE53CC01BE538201BE5203063E240D1 -S31A5000F7C1300BE540101BE53633A0E1177C83E1166CA0E1385100 -S31A5000F7D6A0E13231A0E1122CA0E138200BE5188C83E12798A0F5 -S31A5000F7EBE10738A0E12338A0E10500A0E14C300BE50910A0E1AA -S31A5000F800520000EB0040A0E10500A0E10910A0E1F2FEFFEB4C59 -S31A5000F815201BE500A0A0E19A0202E02838A0E1044883E1020036 -S31A5000F82A54E10500002A01A04AE2074094E00200002A02005405 -S31A5000F83FE101A04A3207408430044062E00400A0E10910A0E1C0 -S31A5000F8543D0000EB0050A0E10400A0E10910A0E1DDFEFFEB4C20 -S31A5000F869201BE5900202E00838A0E12338A0E1055883E1020040 -S31A5000F87E55E10500002A010040E2075095E00200002A02005548 -S31A5000F893E10100403207508530058062E00A3880E12308A0E194 -S31A5000F8A826C8A0E10018C3E10C28C6E191020EE0900202E09C5E -S31A5000F8BD0101E0900C0CE0011092E001C88C2201E89EE021C82C -S31A5000F8D2ACE008005CE10500008A38101BE50030A0130130A06F -S31A5000F8E703000053E301005E110200009A06205EE007C0CCE09A -S31A5000F8FC02E0A0E134301BE5000053E30D00000A38201BE50E27 -S31A5000F9111052E00C80C8E03CC01BE5313CA0E140101BE5183192 -S31A5000F92683E148300BE5388CA0E144800BE534C01BE540204B12 -S31A5000F93BE20C0012E90C008CE830304BE2030093E8F0AF1BE94A -S31A5000F950000051E32600000A0130A0E3010050E10EF0A0310132 -S31A5000F9650251E3000051310112A0310332A031FAFFFF3A020160 -S31A5000F97A51E3000051318110A0318330A031FAFFFF3A0020A094 -S31A5000F98FE3010050E101004020A10050E1A1004020E32082211E -S31A5000F9A4210150E12101402063218221A10150E1A1014020E344 -S31A5000F9B921822103C0A0E1000050E32332B0112112A011EEFFC1 -S31A5000F9CEFF1A0E2212E20EF0A001EC0112E1A10180106C011261 -S31A5000F9E3E121018010EC0012E1A10080100EF0A0E104E02DE5A1 -S3155000F9F8010000EB0000A0E30080BDE80EF0A0E196 -S31A5000FA0853707572696F757320496E74657272757074212121D9 -S31A5000FA1D202D20766563746F723A2025642C20646174613A205B -S31A5000FA3225780A000000303132333435363738396162636465C6 -S31A5000FA476600000000503031004F4B000065436F73204744422C -S31A5000FA5C207374756273202D206275696C74204175672032349E -S31A5000FA712032303030202F2030383A35383A31310000004530B9 -S31A5000FA863100453033004530320042303100303132333435368D -S31A5000FA9B37383961626364656600000000303132333435363767 -S31A5000FAB038394142434445460000000030313233343536373811 -S31A5000FAC539414243444546000000003C42616420666F726D6190 -S31A5000FADA7420737472696E673A2000000000203A00003E0A009A -S31A5000FAEF003C6E756C6C3E00003C4E6F74206120737472696E39 -S31A5000FB04673A2030780000003E000000253038583A200000258B -S31A5000FB19303258000000002020000020000000207C0000256343 -S31A5000FB2E00007C0A00003C746F7069633E0048656C70206162E1 -S31A5000FB436F75742068656C703F0000000068656C70000000004E -S31A5000FB585B2D77203C74696D656F75743E5D205B656E74727998 -S31A5000FB6D5D00004578656375746520636F6465206174206120AC -S31A5000FB826C6F636174696F6E0000676F00003C6C6F6361746931 -S31A5000FB976F6E3E205B3C6C656E6774683E5D0000004469737084 -S31A5000FBAC6C617920286865782064756D702920612072616E67D3 -S31A5000FBC165206F66206D656D6F72790000000064756D70000010 -S31A5000FBD600005B4F4E207C204F46465D00004D616E616765206F -S31A5000FBEB6D616368696E652063616368657300000063616368C4 -S31A5000FC00650000000A526564426F6F7428746D29206465627589 -S31A5000FC156720656E7669726F6E6D656E74202D206275696C74BB -S31A5000FC2A2025732C2025730A000030383A35383A323600000018 -S31A5000FC3F00417567203234203230303000436F70797269676890 -S31A5000FC54742028432920323030302C20526564204861742C204B -S31A5000FC69496E632E0A0A0052414D3A2025702D25700A003D3DBF -S31A5000FC7E20457865637574696E6720626F6F742073637269703A -S31A5000FC937420696E202564207365636F6E6473202D20656E742F -S31A5000FCA86572205E4320746F2061626F72740A00526564426F48 -S31A5000FCBD6F743E20000000496C6C6567616C20636F6D6D616E46 -S31A5000FCD2643A2025730A00000000556E62616C616E636564205A -S31A5000FCE7737472696E67210A00416D626967756F757320636F52 -S31A5000FCFC6D6D616E6420272573272C2063686F696365732061DF -S31A5000FD1172653A20257300202573000A00000055736167653ACD -S31A5000FD260A002020257325732025730A0000257320616C7265DA -S31A5000FD3B6164207365740A0000696E76616C6964206E756D6269 -S31A5000FD506572202725732720666F722025730A00696E76616C28 -S31A5000FD65696420666C616720272563270A0000257320616C72B5 -S31A5000FD7A65616479207365740A006E6F2064656661756C742FF4 -S31A5000FD8F6E6F6E2D666C616720617267756D656E7473207375F9 -S31A5000FDA470706F727465640A000000006F6E00006F666600498B -S31A5000FDB96E76616C6964206361636865206D6F64653A20257396 -S31A5000FDCE0A00636163686573203F0A00000025730A20202025C9 -S31A5000FDE3732025730A0000000044756D702077686174205B6C2F -S31A5000FDF86F636174696F6E5D3F0A0000496E76616C69642073B3 -S31A5000FE0D7461727420616464726573733A2025730A0000496E16 -S31A5000FE2276616C6964206C656E6774682F656E642061646472A2 -S31A5000FE376573733A2025730A00776169742074696D656F75743D -S31A5000FE4C000000007374617274696E67206164647265737300D9 -S31A5000FE6100000041626F757420746F2073746172742065786588 -S31A5000FE76637574696F6E206174202570202D2061626F72742040 -S31A5000FE8B77697468205E432077697468696E20256420736563D8 -S31A5000FEA06F6E64730A0000005B2D7261775D205B2D62203C6D37 -S31A5000FEB5656D5F616464723E5D5D004C6F616420612066696CC2 -S31A5000FECA65006C6F616400000000454C4620696D61676573203B -S31A5000FEDF6E6F7420737570706F727465640A000000496E7661C9 -S31A5000FEF46C696420532D7265636F7264206174206F6666736523 -S31A5000FF09742025702C20696E7075743A2025630A000000426159 -S31A5000FF1E6420532D7265636F726420636F756E74206174206F28 -S31A5000FF3366667365742025700A000000004164647265737320A6 -S31A5000FF486F6666736574203D2025700A00000000417474656DB0 -S31A5000FF5D707420746F206C6F616420532D7265636F72642064EF -S31A5000FF7261746120746F20616464726573733A202570205B6E0D -S31A5000FF876F7420696E2052414D5D0A00002A2A2A205761726E98 -S31A5000FF9C696E672120436865636B73756D206661696C75726540 -S31A5000FFB1202D20416464723A20256C782C202530326C58203CA7 -S31A5000FFC63E202530326C580A0000456E74727920706F696E74C1 -S31A5000FFDB3A2025702C20616464726573732072616E67653A2013 -S31A5000FFF025702D25700A0000496E76616C696420532D726563A4 -S31A500100056F7264206174206F6666736574203078256C782C2091 -S31A5001001A747970653A2025780A00256308000A000000757361D4 -S31A5001002F67653A206C6F6164203C66696C655F6E616D653E2045 -S31A500100445B2D725D205B2D765D205B2D68203C686F73743E5DB9 -S31A50010059205B2D6D207B54465450207C205A4D4F44454D7D5DEB -S31A5001006E205B2D62203C626173655F616464726573733E5D0A3B -S31A5001008300766572626F7365006C6F61642072617720646174B8 -S31A50010098610000006C6F61642061646472657373000000006491 -S31A500100AD6F776E6C6F6164206D6F6465202854465450206F72A7 -S31A500100C2205A4D4F44454D290000686F7374206E616D652028F6 -S31A500100D74950206164647265737329000066696C65206E616DF9 -S31A500100EC65000000496E76616C69642049502061646472657330 -S31A50010101733A2025730A007A6D6F64656D0000746674700000D9 -S31A50010116000054465450206D6F646520726571756972657320CA -S31A5001012B6120776F726B696E67206E6574776F726B0A000000B2 -S31A50010140496E76616C696420276D6F6465273A2025730A004637 -S31A50010155696C65206E616D65206D697373696E670A000043617B -S31A5001016A6E2774206C6F616420272573273A2025730A0000005E -S31A5001017F004572726F722072656164696E672068656164657287 -S31A500101942076696120544654503A2025730A0000536F72727926 -S31A500101A92C207A6D6F64656D20646F776E6C6F6164206E6F7429 -S31A500101BE2079657420617661696C61626C650A0000005261776E -S31A500101D3206C6F61642072657175697265732061206D656D6F21 -S31A500101E8727920616464726573730A005261772066696C6520A6 -S31A500101FD6C6F616465642025702D25700A0000454C4600556E12 -S31A500102127265636F676E697A656420696D616765207479706551 -S31A500102273A20256C780A0000007B636D64737D00004D616E61E2 -S31A5001023C676520464C41534820696D6167657300666973005BC9 -S31A500102512D6C5D000000004D616E61676520636F6E66696775F7 -S31A50010266726174696F6E206B65707420696E20464C4153482026 -S31A5001027B6D656D6F727900000066636F6E666967005B2D665D57 -S31A5001029000000000496E697469616C697A6520464C4153482042 -S31A500102A5496D6167652053797374656D205B4649535D00696ED4 -S31A500102BA69740000000000000000446973706C617920636F6EC5 -S31A500102CF74656E7473206F6620464C41534820496D61676520EF -S31A500102E453797374656D205B4649535D000000006C69737400B3 -S31A500102F9000000446973706C61792066726565205B61766169E5 -S31A5001030E6C61626C655D206C6F636174696F6E7320776974685E -S31A50010323696E20464C41534820496D6167652053797374656D61 -S31A50010338205B4649535D000066726565000000002D66203C66A8 -S31A5001034D6C6173685F616464723E202D6C203C6C656E677468CD -S31A500103623E00457261736520464C41534820636F6E74656E7458 -S31A50010377730000000065726173650000006E616D6500000000F6 -S31A5001038C446973706C617920616E20696D6167652066726F6D49 -S31A500103A120464C41534820496D6167652053797374656D205B3F -S31A500103B64649535D000064656C65746500004C6F616420696DB3 -S31A500103CB6167652066726F6D20464C41534820496D6167652014 -S31A500103E053797374656D205B4649535D20696E746F2052414D98 -S31A500103F50000006C6F6164000000002D62203C6D656D5F6261B0 -S31A5001040A73653E202D6C203C6C656E6774683E205B2D66203C31 -S31A5001041F666C6173685F616464723E5D205B2D65203C656E741E -S31A5001043472795F706F696E743E5D205B2D72203C72616D5F61D7 -S31A500104496464723E5D203C6E616D653E000000437265617465E3 -S31A5001045E20616E20696D6167650063726561746500002A2A2A2E -S31A5001047320696E76616C696420276669732720636F6D6D616ECB -S31A50010488643A2025730A0000666973200000000066756C6C2073 -S31A5001049D696E697469616C697A6174696F6E2C206572617365AF -S31A500104B27320616C6C206F6620666C6173680000000041626FDD -S31A500104C7757420746F20696E697469616C697A65205B666F72C9 -S31A500104DC6D61745D20464C41534820696D616765207379737471 -S31A500104F1656D002A2A2041626F727465640A002A2A2A20496E39 -S31A50010506697469616C697A6520464C41534820496D616765207D -S31A5001051B53797374656D0A0000202020696E697469616C697AB8 -S31A500105306174696F6E206661696C65642025703A2025782825C6 -S31A5001054573290A00000000202020205761726E696E673A206490 -S31A5001055A657669636520636F6E74656E7473206E6F7420657233 -S31A5001056F617365642C20736F6D6520626C6F636B73206D61797E -S31A50010584206E6F7420626520757361626C650A00526564426F41 -S31A500105996F7400526564426F6F745B6261636B75705D0052657F -S31A500105AE64426F6F7420636F6E66696700004649532064697212 -S31A500105C36563746F72790000004572726F722077726974696E6F -S31A500105D86720696D6167652064657363726970746F72732061DA -S31A500105ED742025703A202578282573290A00004E616D652020CE -S31A50010602202020202020202020202020464C4153482061646455 -S31A50010617722020204D656D2061646472202020204C656E677451 -S31A5001062C6820202020456E74727920706F696E740A00000025EF -S31A500106412D313673202030782530386C58202020307825303878 -S31A500106566C58202030782530366C58202030782530386C580AFA -S31A5001066B00202030782530386C58202E2E2030782530386C5855 -S31A500106800A0000006D656D6F7279206261736520616464726590 -S31A5001069573730072616D20626173652061646472657373000012 -S31A500106AA0000656E74727920706F696E74206164647265737362 -S31A500106BF00464C415348206D656D6F7279206261736520616408 -S31A500106D464726573730000006C656E677468000066696C652057 -S31A500106E96E616D65000000696E76616C696420617267756D657C -S31A500106FE6E7473000000726571756972656420706172616D6544 -S31A50010713746572206D697373696E670000496E76616C6964202E -S31A50010728464C41534820616464726573733A2025702028257322 -S31A5001073D290A0020202076616C69642072616E67652069732064 -S31A5001075225702D25700A00000000496E76616C69642052414D13 -S31A5001076720616464726573733A2025700A000000004E616D65A6 -S31A5001077C20697320746F6F206C6F6E672C206D757374206265D7 -S31A50010791206C657373207468616E2025642063686172730A0076 -S31A500107A6000043616E2774206C6F6361746520256C6420627992 -S31A500107BB746573206672656520696E20464C4153480A00000035 -S31A500107D0496D61676520666F756E642C2062757420464C4153C1 -S31A500107E548206164647265737320696E636F72726563740A0067 -S31A500107FA0000416E20696D616765206E616D6564202725732796 -S31A5001080F20657869737473000043616E27742070726F67726165 -S31A500108246D207468697320726567696F6E202D20636F6E7461FD -S31A50010839696E7320636F646520696E20757365210A000043611B -S31A5001084E6E277420657261736520726567696F6E206174202527 -S31A50010863703A202578282573290A00000043616E277420707220 -S31A500108786F6772616D20726567696F6E2061742025703A202531 -S31A5001088D78282573290A004572726F722065726173696E672061 -S31A500108A261742025703A202578282573290A000000004572724D -S31A500108B76F722070726F6772616D6D696E672061742025703A4D -S31A500108CC202578282573290A000000006D697373696E67206195 -S31A500108E17267756D656E7400000000696D616765206E616D65E5 -S31A500108F6000044656C65746520696D616765202725732700001A -S31A5001090B004E6F20696D616765202725732720666F756E640A54 -S31A50010920000000004E6F742061206C6F616461626C6520696D6F -S31A500109356167650A000000464C4153483A2064726976657220AB -S31A5001094A696E6974206661696C6564212C207374617475733ABD -S31A5001095F2025780A00464C4153483A202570202D2025702C20BA -S31A50010974256420626C6F636B73206F66202570206279746573FF -S31A500109892065612E0A0000746F6F2066657720617267756D658F -S31A5001099E6E7473000000756E7265636F676E697A656420636F99 -S31A500109B36D6D616E640000000052756E20736372697074206160 -S31A500109C87420626F6F740000626F6F745F736372697074004291 -S31A500109DD6F6F742073637269707400626F6F745F736372697073 -S31A500109F2745F6461746100000000426F6F7420736372697074E3 -S31A50010A072074696D656F757400626F6F745F7363726970745F55 -S31A50010A1C74696D656F75740025733A2000000000257320007449 -S31A50010A317275650000000066616C7365000000256420003078B1 -S31A50010A462530325800003A000000200000003F3F00000A000083 -S31A50010A5B002E2E2025730A0000456E746572207363726970745E -S31A50010A702C207465726D696E617465207769746820656D707453 -S31A50010A8579206C696E650A000000003E3E20006C6973742063DF -S31A50010A9A6F6E66696775726174696F6E206F6E6C79002A2A2085 -S31A50010AAF696E76616C696420656E7472790A000000557064610E -S31A50010AC4746520526564426F6F74206E6F6E2D766F6C617469F7 -S31A50010AD96C6520636F6E66696775726174696F6E000000457291 -S31A50010AEE726F722077726974696E6720636F6E666967206461AA -S31A50010B0374612061742025703A202578282573290A000000001D -S31A50010B185265717565737420666F7220636F6E66696720766194 -S31A50010B2D6C75652027257327202D2077726F6E67207479706594 -S31A50010B420A0043616E27742066696E6420636F6E6669672076A3 -S31A50010B57616C756520272573270A000000464C41534820636F1B -S31A50010B6C6E66696775726174696F6E20636865636B73756D20E4 -S31A50010B816572726F72206F7220696E76616C6964206B65790A63 -S31A50010B960000657468300000000073635F6C7065000043462063 -S31A50010BAB6361726420776F6E277420676F207265616479210ADF -S31A50010BC0000000004E6F742061205343204C50452C20736F72C0 -S31A50010BD572790A000000000A00000025733A2025732025732053 -S31A50010BEA25730A000000436F756C646E27742066696E642043D9 -S31A50010BFF4F5220706F696E746572210A0043616E2774207061FF -S31A50010C14727365204349530A0000000043616E27742066657415 -S31A50010C29636820636F6E66696720696E666F0A00000000436F76 -S31A50010C3E6D7061637420466C61736820636172642072656D6F9A -S31A50010C53766564210A000000002E2E2E2057616974696E67202E -S31A50010C68666F72206E6574776F726B20636172643A2000002E6D -S31A50010C7D00000025730A0073635F6C70655F4275664576656EE9 -S31A50010C9274003031323334353637383900003031323334353610 -S31A50010CA737383961626364656600000000303132333435363748 -S31A50010CBC3839414243444546000000005E430A003078253038E6 -S31A50010CD1583A20000000002530325800000000202000002000C6 -S31A50010CE60000207C0000256300007C0A0000202D206172652033 -S31A50010CFB796F7520737572652028792F6E293F20004E45544143 -S31A50010D1053434949000000004F43544554000000556E6B6E6FC5 -S31A50010D25776E206572726F7200000066696C65206E6F7420669C -S31A50010D3A6F756E6400006163636573732076696F6C6174696F9E -S31A50010D4F6E000000006469736B2066756C6C206F7220616C6CF2 -S31A50010D646F636174696F6E206578636565646564000000006976 -S31A50010D796C6C6567616C2054465450206F7065726174696F6E4E -S31A50010D8E0000756E6B6E6F776E207472616E73666572204944B7 -S31A50010DA30066696C6520616C7265616479206578697374730082 -S31A50010DB86E6F20737563682075736572000000006F7065726129 -S31A50010DCD74696F6E2074696D6564206F757400736F6D6520730E -S31A50010DE26F7274206F66206E6574776F726B206572726F7200E7 -S31A50010DF700696E76616C696420706172616D65746572000000C8 -S31A50010E0C70726F746F636F6C2076696F6C6174696F6E000066AD -S31A50010E21696C65206973206C6172676572207468616E206275D0 -S31A50010E3666666572000047444220636F6E6E656374696F6E2070 -S31A50010E4B706F7274006764625F706F7274000000004E65747787 -S31A50010E606F726B20646562756720617420626F6F742074696D80 -S31A50010E756500006E65745F646562756700000055736520424F21 -S31A50010E8A4F545020666F72206E6574776F726B20636F6E666949 -S31A50010E9F6775726174696F6E00626F6F74700000004C6F6361DB -S31A50010EB46C204950206164647265737300000000626F6F747083 -S31A50010EC95F6D795F69700044656661756C7420736572766572C4 -S31A50010EDE2049502061646472657373000000626F6F74705F73F3 -S31A50010EF365727665725F69700025732E25640A00006E65745F38 -S31A50010F08696F5F7772697465000000006E65745F696F5F726567 -S31A50010F1D6164004E6F206E6574776F726B20696E7465726661B3 -S31A50010F3263657320666F756E640A0000000043616E277420679E -S31A50010F47657420424F4F545020696E666F202D206E6574776F5B -S31A50010F5C726B2064697361626C6564210A00000049503A2025B1 -S31A50010F717300002C2044656661756C74207365727665723A207F -S31A50010F8625730A00000025642E25642E25642E256400257320F7 -S31A50010F9B2D2063616C6C6564207769746820696E76616C696455 -S31A50010FB0204349533A2025780A00000063665F70617273655F33 -S31A50010FC563667461626C650000000063665F70617273655F63EA -S31A50010FDA6F6E6669670050434D4349413A20496E76616C6964CA -S31A50010FEF20736C6F742025640A000000002E2E2E2045726173CC -S31A50011004652066726F6D2025702D25703A2000002E0000000A3E -S31A500110190000002E2E2E2050726F6772616D2066726F6D2025D0 -S31A5001102E702D25702061742025703A2000004E6F206572726F8B -S31A5001104372202D206F7065726174696F6E20636F6D706C65747D -S31A5001105865000000496E76616C696420464C4153482061646429 -S31A5001106D726573730000004572726F7220747279696E672074FF -S31A500110826F2065726173650000004572726F7220747279696E03 -S31A500110976720746F206C6F636B2F756E6C6F636B004572726F67 -S31A500110AC7220747279696E6720746F2070726F6772616D004747 -S31A500110C1656E65726963206572726F72000000446576696365B3 -S31A500110D62F726567696F6E2069732077726974652D70726F74C2 -S31A500110EB656374656400000000464C415348207375622D7379A3 -S31A500111007374656D206E6F7420696E697469616C697A656400A3 -S31A50011115000000556E6B6E6F776E206572726F7200000045747B -S31A5001112A6865726E65742073656E643A0A0025733A207061639F -S31A5001113F6B6574206F662025642062797465732064726F7070D6 -S31A5001115465640A006574685F6472765F7265637600000000451C -S31A50011169746865726E657420726563763A0A005152590043616C -S31A5001117E6E2774206964656E7469667920464C4153482C207333 -S31A500111936F7272790A00000000457272203D2025780A000000CD -S31A500111A825733A2043616E27742066696E6420616464726573E8 -S31A500111BD73206F66207365727665720A0000005F5F7564705F37 -S31A500111D273656E64746F000000007564705F7265637666726F85 -S31A500111E76D202D2064726F70706564207061636B6574206F6647 -S31A500111FC2025642062797465730A00005F5F656E65745F706FE5 -S31A500112116C6C3A206E6F206D6F726520627566666572730A0078 -S31A500112260000000102020303030304040404040404040505051C -S31A5001123B050505050505050505050505050606060606060606D6 -S31A50011250060606060606060606060606060606060606060606B4 -S31A500112650606060707070707070707070707070707070707078D -S31A5001127A07070707070707070707070707070707070707070775 -S31A5001128F07070707070707070707070707070707070707070760 -S31A500112A40707070708080808080808080808080808080808083A -S31A500112B908080808080808080808080808080808080808080821 -S31A500112CE0808080808080808080808080808080808080808080C -S31A500112E3080808080808080808080808080808080808080808F7 -S31A500112F8080808080808080808080808080808080808080808E2 -S31A5001130D080808080808080808080808080808080808080808CC -S31A5001132208080808080800010202030303030404040404040402 -S31A50011337040505050505050505050505050505050506060606DE -S31A5001134C060606060606060606060606060606060606060606B7 -S31A5001136106060606060606070707070707070707070707070794 -S31A5001137607070707070707070707070707070707070707070778 -S31A5001138B07070707070707070707070707070707070707070763 -S31A500113A007070707070707070808080808080808080808080841 -S31A500113B508080808080808080808080808080808080808080824 -S31A500113CA0808080808080808080808080808080808080808080F -S31A500113DF080808080808080808080808080808080808080808FA -S31A500113F4080808080808080808080808080808080808080808E5 -S31A50011409080808080808080808080808080808080808080808CF -S30F5001141E080808080808080808081D -S31A5001142800000000B4430050B4430050B4430050B4430050B488 -S31A5001143D430050B4430050B4430050B4430050B4430050B4439D -S31A500114520050B4430050B4430050B4430050B4430050B44300CB -S31A5001146750B4430050B4430050B4430050B4430050B443005066 -S31A5001147CB4430050B4430050B4430050B4430050B4430050B4ED -S31A50011491430050B4430050B4430050B4430050B4430050B44349 -S31A500114A60050B4430050B4430050B4430050B4430050B4430077 -S31A500114BB50B4430050B4430050B4430050B4430050B443005012 -S31A500114D0B4430050B4430050B4430050B4430050B4430050B499 -S31A500114E5430050B4430050B4430050B4430050B4430050B443F5 -S31A500114FA0050B4430050B4430050B4430050B4430050B4430023 -S31A5001150F50B4430050B4430050B443005000000000000000004B -S31A500115240000000000000000000000000000000000000000005B -S31A5001153900000000000000000000000000000000000000000046 -S31A5001154E00000000000000000000000000000000000000000031 -S31A500115630000000000000000000000000000000000000000001C -S31A5001157800000000000000000000000000000000000000000007 -S31A5001158D000000000000000000000000000000000000000000F2 -S31A500115A2000000000000000000000000000000000000000000DD -S31A500115B7000000000000000000000000000000000000000000C8 -S31A500115CC000000000000000000000000000000000000000000B3 -S31A500115E10000000000000000000000000000000000000000009E -S31A500115F600000000000000000000000000000000000000000089 -S31A5001160B00000000000000000000000000000000000000000073 -S31A500116200000000000000000000000000000000000000000005E -S31A5001163500000000000000000000000000000000000000000049 -S31A5001164A00000000000000000000000000000000000000000034 -S31A5001165F0000000000000000000000000000000000000000001F -S31A500116740000000000000000000000000000000000000000000A -S31A50011689000000000000000000000000000000000000000000F5 -S31A5001169E000000000000000000000000000000000000000000E0 -S31A500116B3000000000000000000000000000000000000000000CB -S31A500116C8000000000000000000000000000000000000000000B6 -S31A500116DD000000000000000000000000000000000000000000A1 -S31A500116F2000000000000000000002000000000000000502500F7 -S31A5001170750A0250050000000000000000000000000FFFFFFFF15 -S31A5001171C0000000000000000000000000C3300500000000000D2 -S31A500117310000000041010000000000000000000000000000000A -S31A500117460000FEFFFFFFFEFFFFFF000000000000000000000140 -S31A5001175B80E80300000F00000000000580E80300001100000027 -S31A5001177000000000000000007C2F2D5C7C2D000000000000C46C -S31A500117859300509093005094940050AC940050209500505C97A2 -S31A5001179A0050FC98005094990050CC830000000000005C830004 -S31A500117AF00D0430100980B0150000000000000000000000000C6 -S31A500117C408881234567800000000000000000000141E000014CF -S31A500117D91E0000F4010000000000000000000000000000000091 -S31A500117EE000000000000B0C400507CC80050D4C600500000004D -S31A5001180300000000000000000000000000000000000000000079 -S31A5001181800000000000000000000000000000000000000000064 -S31A5001182D00000000000000000000000000000068040150580436 -S31A50011842015000040150847A0050BC0301508C030150840301CE -S31A5001185750F08100507C03015064030150480301501880005008 -S31A5001186C40030150FC020150C0020150D8780050B802015094DB -S31A500118810201508C02015040750050F4020150C4020150C002A4 -S31A50011896015044780050F8030150C403015084030150E08300EA -S31A500118AB50FCFB0050E4FB0050D8FB005044670050D0FB0050D2 -S31A500118C0A8FB005090FB0050346900504C0201503802015030A7 -S31A500118D5020150108600508402015058020150500201501C8BA2 -S31A500118EA00508CFB005070FB005058FB0050E469005050FB0025 -S31A500118FF503CFB005034FB0050E4680050CCFE0050C0FE005063 -S31A50011914A8FE0050E8700050D0090150BC090150000000000188 -S31A5001192900000001000000E8090150DC090150D00901500100AE -S31A5001193E000004000000100A0150FC090150D00901500100004D -S31A500119530002000000A80E0150840E015000000000010000003B -S31A5001196801000000C40E0150B00E0150A80E01500000000005D4 -S31A5001197D000000EC0E0150D00E0150A80E015000000000050078 -S31A500119920000500E01503C0E015000000000010000000200009C -S31A500119A700780E01505C0E015000000000010000000100000040 -S31A500119BC8C8E005060B70050A00B0150589300508483000000B0 -S30C500119D1000000B84C005064 +S31A5000015512A0E398259FE5002081E5150000EA040000A07FAA17 +S31A5000016AAAAA080000A0AAAAAAAA0C0000A0AAAAAAAA1800001A +S31A5000017FA04A994A991C0000A02703FC49200000A07FAAAAAA47 +S31A50000194240000A0AAAAAAAA280000A0AAAAAAAA300000A0CC88 +S31A500001A9AFCCAF000000A0547254720000000000000000301550 +S31A500001BE9FE51020A0E3002081E52C159FE50321A0E302D0815A +S31A500001D3E1C01200EB1214A0E3E4249FE5022A82E30129C2E38E +S31A500001E8002081E50C259FE57110A0E3101F01EE02F0A0E100DC +S31A500001FD00A0E10000A0E10000A0E11214A0E3B4249FE5022AE3 +S31A50000212C2E30129C2E3002081E5E0149FE5002081E5DC149FFA +S31A50000227E5009081E50000A0E3D4149FE5082091E5082080E577 +S31A5000023C0000A0E364149FE5282091E5282080E5182091E518A7 +S31A500002512080E5382091E5382080E51C2091E51C2080E53C2083 +S31A5000026691E53C2080E50C2091E50C2080E52C2091E52C208035 +S31A5000027BE5102091E5102080E5302091E5302080E50000A0E3FA +S31A5000029014149FE5002091E5002080E56C249FE5202080E5E89B +S31A500002A5339FE5E8439FE5E8539FE5050054E10500000A04304C +S31A500002BA43E2044044E20400B3E50400A4E5050054E1FBFFFFEE +S31A500002CF1AA0D39FE5D200A0E300F029E19CD39FE5D100A0E31D +S31A500002E400F029E18CD39FE5DB00A0E300F029E184D39FE5D3CC +S31A500002F900A0E300F029E100F069E16CD39FE578139FE5782376 +S31A5000030E9FE50000A0E3020051E10200000A040081E402005181 +S31A50000323E1FCFFFF1A951100EBEB1900EB0000A0E3D8139FE508 +S31A50000338042091E5042080E5242091E5242080E5232100EB6D38 +S31A5000034D1100EB843700EBFEFFFFEAD300A0E300F029E1B1FFBD +S31A50000362FFEA0BB0ADDE14D39FE501582DE900004FE101002DC9 +S31A50000377E90DC0A0E100000FE11F00C0E3130080E300F029E1C2 +S31A5000038C0DB0A0E1DCD29FE50D005BE10300008ACC029FE5006E +S31A500003A1005BE10000009A0BD0A0E14CD04DE2FF0F8DE81F00D2 +S31A500003B69CE8200010E304404402024044123C008DE500108DD8 +S31A500003CBE52C208DE540308DE538408DE534E08DE54C008CE218 +S31A500003E030B08DE50140A0E34B0000EA5CD04DE2FF0F8DE80089 +S31A500003F5004FE1200010E304304E0202304E123C008DE540C096 +S31A5000040A8DE538308DE534E08DE55C008DE230008DE50240A066 +S31A5000041FE33D0000EA58D29FE504E04EE201582DE900004FE107 +S31A5000043401002DE90DC0A0E100000FE11F00C0E3130080E300D0 +S31A50000449F029E10DB0A0E11CD29FE50D005BE10300008A0C02BA +S31A5000045E9FE500005BE10000009A0BD0A0E14CD04DE2FF0F8D97 +S31A50000473E81F009CE83C008DE500108DE52C208DE540308DE5C3 +S31A5000048838408DE534E08DE54C008CE230B08DE50340A0E31EA9 +S31A5000049D0000EADCD19FE504E04EE201582DE900004FE1010025 +S31A500004B22DE90DC0A0E100000FE11F00C0E3130080E300F0293A +S31A500004C7E10DB0A0E1A0D19FE50D005BE10300008A90019FE5CB +S31A500004DC00005BE10000009A0BD0A0E14CD04DE2FF0F8DE81F96 +S31A500004F1009CE83C008DE500108DE52C208DE540308DE53840D4 +S31A500005068DE534E08DE54C008CE230B08DE50440A0E3FFFFFFC2 +S31A5000051BEA44408DE50D00A0E1D51000EB0DC0A0E100000FE1F9 +S31A50000530C00080E300F029E10000A0E10000A0E134E09CE5307C +S31A50000545D09DE51F00C0E3120080E300F029E10CD0A0E138E053 +S31A5000055A9DE53C009DE540C09DE500F069E1FF0F9DE80EF0B0F9 +S31A5000056FE104D19FE504E04EE201582DE900004FE101002DE91D +S31A50000584040000EAF0D09FE504E04EE201582DE900004FE10126 +S31A50000599002DE90DC0A0E100000FE11F00C0E3D30080E300F0BB +S31A500005AE29E10DB0A0E14CD04DE2FF0F8DE81F009CE83C008D60 +S31A500005C3E500108DE52C208DE540308DE538408DE534E08DE556 +S31A500005D830B08DE50D90A0E10900A0E1311100EB0040A0E104CC +S31A500005ED00A0E120219FE5009082E5A4109FE5041191E79820E9 +S31A500006029FE5046192E70920A0E10FE0A0E106F0A0E10DC0A02D +S31A50000617E100000FE1C00080E300F029E10000A0E10000A0E188 +S31A5000062C34E09CE530D09DE51F00C0E3120080E300F029E10C0F +S31A50000641D0A0E138E09DE53C009DE540C09DE500F069E1FF0FDB +S31A500006569DE80EF0B0E10EF0A0E100000FE10EF0A0E10D00A08A +S31A5000066BE10EF0A0E1808A0000808E0000809E00008089000085 +S31A50000680008A0000808A000000890000D0460100D04601008C38 +S31A50000695410150008000000089000004800000F4800000E48102 +S31A500006AA0000000000500080000065436F73203A20004A616EF8 +S31A500006BF203330203230303100E414A00004000490FCA7070888 +S31A500006D40800049000A407080000049014000290A086010064A7 +S31A500006E901005000000050600002800400029055725472809EE2 +S31A500006FE0000080200506001000064010000000000502C0200F3 +S31A500007135000000050B04401000DC0A0E170D82DE904B04CE258 +S31A50000728BCD04DE2BC304BE2C0204BE200308DE50040A0E1041E +S31A5000073D208DE530604BE2E4319FE50600A0E108308DE50150E7 +S31A50000752A0E1D8319FE57710A0E300C093E50120A0E3C4C00BB9 +S31A50000767E50030A0E3293500EB0120A0E300208DE5C4304BE2EF +S31A5000077C04308DE50400A0E1AC319FE50040A0E30C308DE50510 +S31A5000079110A0E108408DE50630A0E1293500EB040050E1670016 +S31A500007A6000AC0301BE5040053E10C00000A80019FE5C4101BAC +S31A500007BBE5BC201BE57C2400EB38004BE2BC201BE50810A0E3AB +S31A500007D0823262E0032182E08221A0E1D92500EB020070E35789 +S31A500007E500000A50C19FE550319FE50420A0E103306CE00300DE +S31A500007FA52E10600002AB8004BE20310A0E104309CE402318051 +S31A5000080FE7012082E2010052E1FAFFFF3A00300FE100400FE15C +S31A50000824C04084E304F029E10E02A0E3021A80E2202090E4003F +S31A500008390031E1FCFFFF1A0000A0E3160F07EE9A0F07EE101FC4 +S31A5000084E11EE011AC1E3101F01EE0010A0E3151F07EE0000A007 +S31A50000863E10000A0E10000A0E10000A0E10000A0E10000A0E1C4 +S31A50000878101F11EE0C10C1E3101F01EE0010A0E3161F07EE0E3E +S31A5000088D02A0E3021A80E2202090E4000031E1FCFFFF1A000023 +S31A500008A2A0E3160F07EE9A0F07EE0010A0E3151F07EE151F08B8 +S31A500008B7EE0000A0E10000A0E10000A0E10000A0E10000A0E163 +S31A500008CC0000A0E10010A0E3161F07EE171F08EEC4301BE5B8AB +S31A500008E1204BE2032182E20F32C3E3033183E20350A0E1021071 +S31A500008F6A0E101F0A0E100000FE100F069E11F00C0E312008026 +S31A5000090BE300F029E105E0A0E105D0A0E10010A0E3101F01EE37 +S31A500009200000A0E31910A0E30EF0B0E1050000EA382001509086 +S31A50000935450100482001505C200150FC0800504809005070A87E +S31A5000094A1BE90DC0A0E100D82DE908009FE504B04CE21524005B +S31A5000095FEB00A81BE9B42001500DC0A0E1F0D92DE904B04CE262 +S31A500009740150A0E10070A0E30530A0E1015045E2070053E100EA +S31A5000098980A0E10260A0E1470000DA0FE0A0E108F0A0E1FF40D6 +S31A5000099E00E20FE0A0E108F0A0E10010A0E3302044E241304465 +S31A500009B3E2050053E309005283FFE000E20200009A613044E2CA +S31A500009C8050053E30000008A0110A0E3000051E32F00000A00FE +S31A500009DDC0A0E330004EE2FF1000E241204EE2FF3002E2050072 +S31A500009F253E3090051830200009A61304EE2050053E3000000EF +S31A50000A078A01C0A0E300005CE32100000A0774A0E100C0A0E30D +S31A50000A1C301044E2FF3001E2090053E301C0A0910600009A61C5 +S31A50000A313044E2050053E357C044920200009A413044E20500A4 +S31A50000A4653E337C044920010A0E3FF3000E2090053E30010A0AF +S31A50000A5B910600009A61304EE2050053E357104E920200009A20 +S31A50000A70FF3002E2050053E337104E920C2281E1027087E1003C +S31A50000A850056E30500000A003096E5023083E0003086E50100E2 +S31A50000A9A00EA0000E0E3F0A91BE90530A0E1015045E200005326 +S31A50000AAFE3B7FFFFCA0700A0E1F0A91BE90DC0A0E1F0DF2DE922 +S31A50000AC40120A0E304B04CE268D04DE288200BE50070A0E38CC3 +S31A50000AD9700BE50030E0E390300BE50790A0E180100BE5008097 +S31A50000AEEA0E1980000EA530052E30300000A18029FE50710A0B0 +S31A50000B03E1AB2300EB960000EA0FE0A0E108F0A0E1027087E2A9 +S31A50000B1800C0A0E10800A0E10110A0E37C204BE20030A0E37C1C +S31A50000B2D300BE5FF600CE28BFFFFEB005050E27CA04BE20300AE +S31A50000B4200AAD4019FE50710A0E1992300EB840000EA017087A0 +S31A50000B57E2303046E2090053E303F19F97670000EA480D00506A +S31A50000B6C900B0050900B0050900B0050080D0050080D0050088B +S31A50000B810D0050C40C0050C40C0050C40C00500800A0E12F1084 +S31A50000B9646E20A20A0E171FFFFEB0040A0E12F3047E288201BBB +S31A50000BABE5067083E084400BE5000052E30A00000A80301BE574 +S31A50000BC0000053E30400000A039064E050019FE50910A0E177C9 +S31A50000BD52300EB000000EA80901BE50020A0E388200BE5383109 +S31A50000BEA9FE5001093E5094084E090301BE5042069E003005265 +S31A50000BFFE10230A03190300BE5010054E10300003A14319FE5BB +S31A50000C14002093E5020054E10300009A08019FE50410A0E16285 +S31A50000C292300EB4D0000EA2E3085E2035066E0057087E00530AC +S31A50000C3EA0E1015045E2000053E3080000DA0800A0E10110A000 +S31A50000C53E30A20A0E142FFFFEB0530A0E1015045E20100C4E4A6 +S31A50000C68000053E3F6FFFFCA0800A0E10110A0E30020A0E33934 +S31A50000C7DFFFFEB017087E20000E0E17C205BE5FF3000E27C20FF +S31A50000C920BE5020053E10300000A84101BE58C009FE5432300BA +S31A50000CA7EB2E0000EA8C201BE5043069E0020053E10320A0219C +S31A50000CBC8C200BE5200000EA0800A0E13B1066E20A20A0E1243C +S31A50000CD1FFFFEB5C309FE590201BE50040A0E154009FE5004036 +S31A50000CE683E58C301BE50410A0E1302300EB0FE0A0E108F0A0A4 +S31A50000CFBE1000050E3FBFFFFCA170000EA0710A0E12C009FE56E +S31A50000D100620A0E1272300EB120000EAD0200150FC20015020D2 +S31A50000D2521015088450100F44401003821015074210150904585 +S31A50000D3A0100B0210150D8210150017087E20FE0A0E108F0A0FF +S31A50000D4FE10A0050E3FAFFFF1A0FE0A0E108F0A0E1002050E2CE +S31A50000D6462FFFFCAF0AF1BE90DC0A0E130D82DE9D4309FE5045F +S31A50000D79B04CE2085193E50340A0E1000055E3010000AA0000B9 +S31A50000D8EE0E330A81BE92600001A143194E5000053E30900001E +S31A50000DA30A183194E5A4209FE50310D2E7A0009FE5013083E24B +S31A50000DB8183184E5FD2200EB183194E5060053E3185184850C98 +S31A50000DCD3194E5FF0053E3050000CA143194E5000053E3E9FF31 +S31A50000DE2FF0A70009FE5F22200EBE6FFFFEA043084E20300A09F +S31A50000DF7E1011CA0E3043184E5112E84E20FE0A0E100F094E5F4 +S31A50000E0C0C0184E5080184E5000050E3050000CA143194E500D3 +S31A50000E210053E3D8FFFF0A2C009FE5E12200EBD5FFFFEA0831BC +S31A50000E3694E5042194E5013043E2083184E50100D2E4042184E2 +S31A50000E4BE530A81BE960420100A08300000422015008220150C3 +S31A50000E600DC0A0E100D82DE920309FE504B04CE200C0A0E308EA +S31A50000E75C183E5012CA0E30C2183E5000083E5141183E518C1D6 +S31A50000E8A83E500A81BE9604201000DC0A0E100D82DE914309F27 +S31A50000E9FE5042083E2042183E50C1193E504B04CE2081183E5F5 +S31A50000EB400A81BE9604201000DC0A0E1F0DD2DE90C20A0E304A0 +S31A50000EC9B04CE2C0D04DE20080A0E130604BE20600A0E100409C +S31A50000EDEA0E3B8400BE50170A0E1D0400BE50410A0E13721005F +S31A50000EF3EB0150A0E3BA524BE1BC424BE1B0304BE200308DE5C4 +S31A50000F0804A0A0E104A08DE5D4339FE50C20A0E3B8224BE1768D +S31A50000F1D10A0E308308DE5AC404BE2C0339FE50400A0E114C043 +S31A50000F3293E50A20A0E130C00BE50230A0E3343300EBB4304B1B +S31A50000F47E200308DE594004BE29C339FE57210A0E308308DE5F8 +S31A50000F5C0A20A0E104A08DE50230A0E32A3300EBB8304BE20057 +S31A50000F71308DE5BC204BE204208DE57C004BE270339FE5621092 +S31A50000F86A0E308308DE50520A0E10A30A0E11F3300EBC0304BFA +S31A50000F9BE200308DE5C4204BE204208DE564004BE248339FE530 +S31A50000FB06D10A0E308308DE50520A0E10530A0E1143300EBC8D6 +S31A50000FC5304BE200308DE5CC204BE204208DE54C004BE2203347 +S31A50000FDA9FE56810A0E308308DE50520A0E10530A0E1093300EB +S31A50000FEFEB0530A0E300308DE5D0204BE224008DE90800A0E112 +S31A50001004F8329FE50710A0E10C308DE50520A0E10430A0E10A28 +S31A500010193300EB000050E3E500000ACC301BE5000053E30800F2 +S31A5000102E000AC8001BE50610A0E17E2C00EB000050E303000023 +S31A500010431ABC029FE5C8101BE5592200EBD90000EAC4301BE5F1 +S31A50001058000053E33400000AC0401BE5014084E20400A0E16627 +S31A5000106D2200EB0020A0E190129FE50400A0E1BD2200EB0000F5 +S31A5000108250E31900001AC0001BE50020D0E5411042E2203082C1 +S31A50001097E2FF3003E2190051E30230A081790053E30010A0E118 +S31A500010AC0800000A020000CA780053E30300000A080000EA7AD4 +S31A500010C10053E30400000A050000EA01A0A0E3170000EA02A0CA +S31A500010D6A0E3150000EA03A0A0E3130000EA24029FE53222000C +S31A500010EBEBB20000EAC0001BE518129FE5712200EB000050E3F4 +S31A500011000700001A0C329FE5002093E500A0A0E1000052E306AD +S31A5000111500001AFC019FE5252200EBA50000EAE4019FE5C010DA +S31A5000112A1BE5212200EBA10000EA00005AE30800001AD0301B27 +S31A5000113FE5000053E30500001AD0019FE5192200EBCC019FE53F +S31A50001154CC119FE5162200EB960000EABC301BE5000053E30BFF +S31A5000116900000AB8219FE5B8101BE5003092E5030051E103000D +S31A5000117E003AA8319FE5002093E5020051E10200009A9C019FCB +S31A50001193E5072200EB870000EA00005AE31000001A0610A0E189 +S31A500011A80120A0E3D4C04BE20C30A0E1D0001BE50C80A0E1D607 +S31A500011BD2A00EB005050E2030000AAD4001BE5D0401BE5DE2B96 +S31A500011D200EB0E0000EA58019FE5B0101BE51EFFFFEB12000019 +S31A500011E7EA0A10A0E1D4304BE20320A0E1D0001BE50380A0E16F +S31A500011FCC93600EB005050E2070000AAD4001BE5D0401BE5D9AE +S31A500012113700EB0020A0E11C019FE50410A0E1E42100EB640025 +S31A5000122600EA10019FE50010A0E30AFFFFEB0040A0E304719F81 +S31A5000123BE534604BE2010000EA0450C6E7014084E2030054E3D5 +S31A500012500400008AC4FEFFEB005050E2F8FFFFAA103197E5D446 +S31A50001265300BE5000055E3480000BA07FFFFEBB4301BE50000F0 +S31A5000127A53E31100000ABC301BE5000053E30200001AB4009F27 +S31A5000128FE5C82100EB3E0000EAB8401BE5A8609FE5000000EAA5 +S31A500012A40150C4E4AFFEFFEB005050E2FBFFFFAA0600A0E1B8EB +S31A500012B9101BE50420A0E1BC2100EB320000EA33004BE27C1045 +S31A500012CE9FE50320A0E3132200EB000050E31D00001A6C009FF6 +S31A500012E3E598FDFFEB290000EA0C220150A0450100142201503D +S31A500012F8242201503422015058220150702201507C220150941C +S31A5000130D2201509C220150B0220150CC460100B8220150E02290 +S31A500013220150F42201505083000088450100F4440100042301A6 +S31A5000133750F8BE00502C230150C8EE00506042010044230150F4 +S31A5000134C68230150802301506C0D005034305BE5530053E30868 +S31A5000136100001A33305BE5303043E2090053E30400008A08000A +S31A500013769FE5B8101BE5CEFDFFEB030000EA6C0D005028009F8E +S31A5000138BE534101BE5882100EB00005AE30100001A0800A0E159 +S31A500013A0CC2A00EB00005AE30300000A0800A0E1593700EB00B3 +S31A500013B50000EA84230150F0AD1BE90DC0A0E100D82DE90310FB +S31A500013CA81E22111A0E10130A0E1011041E204B04CE200C0A07A +S31A500013DFE10000A0E3000053E1050000DA0120A0E1011041E256 +S31A500013F404309CE4000052E3030020E0F9FFFFCA00A81BE90D28 +S31A50001409C0A0E1F0D82DE978309FE578409FE5001093E57450A5 +S31A5000141E9FE504B04CE2002094E50070A0E1000095E501106286 +S31A50001433E0B21F00EB003094E50060A0E3005095E5230456E1FE +S31A500014480E00002A0030D5E5FF0053E30600000A0700A0E10545 +S31A5000145D10A0E1782100EB000050E30100001A0500A0E1F0A8A3 +S31A500014721BE9016086E2003094E5015C85E2230456E1F0FFFF89 +S31A500014873A0000A0E3F0A81BE9849E0000889E0000909E00002B +S31A5000149C0DC0A0E100D82DE90010A0E118009FE504B04CE2405A +S31A500014B12100EB10009FE510109FE510209FE5BF3100EB00A855 +S31A500014C61BE980260150E486000074870000A02601500DC0A0D7 +S31A500014DBE1F0DF2DE904B04CE230D04DE20080A0E344304BE22B +S31A500014F00060A0E140504BE244800BE50500A0E100308DE50116 +S31A5000150540A0E14C329FE56610A0E308308DE50820A0E10480E8 +S31A5000151A8DE50230A0E3BC3100EB0130A0E308018DE80600A08F +S31A5000152FE128329FE50410A0E10C308DE50220A0E308808DE5B0 +S31A500015440530A0E1BE3100EB080050E1A800000A08029FE571C2 +S31A500015592300EB080050E10200001AFC019FE5122100EBA10084 +S31A5000156E00EAF4019FE50F2100EBF0119FE544201BE5EC319FEF +S31A50001583E500E091E50190A0E1006093E502085EE30E70A0A1CE +S31A500015980278A0B3000052E31500000A8740A0E1040086E048CD +S31A500015ADC04BE2C0119FE50C20A0E1003091E50CA0A0E10230DF +S31A500015C243E29E0301E0011064E0F52C00EB005050E20B000029 +S31A500015D70A48401BE50500A0E1292E00EB0410A0E10030A0E109 +S31A500015EC88019FE50520A0E1EF2000EB020000EA7C019FE5EC0E +S31A500016012000EB48A04BE274319FE50010A0E3004093E5012CBD +S31A50001616A0E30400A0E16C1F00EB60319FE5030093E8030084D1 +S31A5000162BE8106084E5146084E5187084E5012CA0E3024084E06F +S31A500016400400A0E10010A0E3611F00EB38C19FE50F009CE80F9D +S31A500016550084E8187084E5073086E0103084E50010A0E31430B0 +S31A5000166A84E5012CA0E3014C84E20400A0E1551F00EB0CC19FF9 +S31A5000167FE50F009CE804E0A0E10700AEE800519FE50130CEE4CE +S31A500016942324A0E10120CEE42338A0E10030CEE5002099E500F3 +S31A500016A93095E5823043E0103084E5182084E50010A0E3143036 +S31A500016BE84E5012CA0E3024084E00400A0E1401F00EBC0C09F14 +S31A500016D3E50F009CE804E0A0E10700AEE80130CEE42334A0E177 +S31A500016E80030CEE5018088E2003095E5018088E2001099E501A5 +S31A500016FD8088E2036061E0106084E5018088E2146084E50A2029 +S31A50001712A0E1181084E50600A0E18C2D00EB0600A0E1001099FF +S31A50001727E50A20A0E19D2C00EB005050E21800000A48401BE5E7 +S31A5000173C0500A0E1D12D00EB0410A0E10030A0E128009FE505DC +S31A5000175120A0E1972000EB1F0000EAA826015074240150D426DF +S31A5000176601500427015010270150889E0000809E00008C9E0055 +S31A5000177B00342701505C270150909E0000A4270150AC27015015 +S31A50001790BC270150849E0000CC2701504C309FE50600A0E100CD +S31A500017A51093E50824A0E10A30A0E1C82C00EB005050E2070081 +S31A500017BA000A48401BE50500A0E1B02D00EB0410A0E10030A07F +S31A500017CFE11C009FE50520A0E1762000EB0600A0E1001099E5F2 +S31A500017E40A20A0E10D2D00EB010000EA909E0000DC270150F06D +S31A500017F9AF1BE90DC0A0E1F0D82DE904B04CE22CD04DE2007029 +S31A5000180EA0E338304BE20060A0E134504BE238700BE50500A088 +S31A50001823E100308DE50140A0E1AC309FE56310A0E308308DE515 +S31A500018380720A0E104708DE50230A0E3F33000EB0130A0E388B8 +S31A5000184D008DE80600A0E188309FE50410A0E10C308DE5022093 +S31A50001862A0E308708DE50530A0E1F53000EB070050E12E000082 +S31A500018770A68E09FE568009FE568309FE568409FE538201BE5A4 +S31A5000188C64109FE500C093E5070052E1003094E50E10A0010C13 +S31A500018A15063E0432000EB003094E50760A0E1230456E11E00EE +S31A500018B6002A0030D5E5FF0053E31600000A30009FE538301B27 +S31A500018CBE5102095E5000053E30900000AFCC095E5080000EAB2 +S31A500018E010280150742401507028015024280150849E000088FB +S31A500018F59E0000642801507C28015014C095E5183095E50030D8 +S31A5000190A8DE51C3095E504308DE50510A0E10C30A0E1252000FC +S31A5000191FEB016086E2003094E5015C85E2230456E1E0FFFF3AC6 +S31A50001934F0A81BE90DC0A0E170D82DE9B4309FE5B4109FE5044C +S31A50001949B04CE2B0C09FE5002093E5005091E500009CE50C6016 +S31A5000195EA0E1804082E00410A0E1050054E11C00002A003094A2 +S31A50001973E5010073E31500000A040051E10200000A7C009FE56C +S31A500019880420A0E1092000EB0410A0E1050054E10B00002A0037 +S31A5000199D3094E5010073E30800000A54309FE5002093E503200A +S31A500019B2C2E3021081E0050051E10200002A003091E501007335 +S31A500019C7E3F9FFFF1A0140A0E1E4FFFFEA003096E50330C3E3AF +S31A500019DC034084E0E0FFFFEA040051E10200000A14009FE50453 +S31A500019F120A0E1EF1F00EB70A81BE9809E0000849E0000889E6F +S31A50001A060000A82801500DC0A0E130D82DE9BC309FE5BC409FDD +S31A50001A1BE5002093E500E094E504B04CE2B0C09FE58E2082E0A4 +S31A50001A3000E09CE50050A0E102C0A0E10E005CE11A00002A0443 +S31A50001A4500A0E1003092E5010073E31100000A02005CE102005B +S31A50001A5A000A02306CE0430151E11600009A02C0A0E10E005CC6 +S31A50001A6FE10700002A003090E50320C3E302C08CE00E005CE113 +S31A50001A840200002A00309CE5010073E3F9FFFF1A0C20A0E10203 +S31A50001A990000EA003090E50330C3E3032082E00E0052E1E5FFD0 +S31A50001AAEFF3A02005CE10500000A02306CE0430151E102000050 +S31A50001AC38A00C085E50100A0E330A81BE90000A0E330A81BE945 +S31A50001AD8809E0000889E0000849E00000DC0A0E1F0DF2DE90406 +S31A50001AEDB04CE2F8D04DE20040A0E3D8400BE5E0400BE5E840B6 +S31A50001B020BE5F0400BE50080A0E1F8400BE5D0604BE200410B96 +S31A50001B17E50600A0E104410BE5D4304BE200308DE5D8204BE2CA +S31A50001B2C04208DE50170A0E1B4339FE56210A0E308308DE501BB +S31A50001B4120A0E30430A0E1323000EBDC304BE200308DE5E020B9 +S31A50001B564BE204208DE5B8004BE28C339FE57210A0E308308D6F +S31A50001B6BE50120A0E30430A0E1273000EBE4304BE200308DE5AC +S31A50001B80E8204BE204208DE5A0004BE264339FE56510A0E30847 +S31A50001B95308DE50120A0E30430A0E11C3000EB88004BE2F030DE +S31A50001BAA4BE204308DE5EC504BE240339FE56610A0E308308DDF +S31A50001BBFE50120A0E300508DE50430A0E1113000EBF4304BE23E +S31A50001BD400308DE5F8204BE204208DE570004BE214339FE56C55 +S31A50001BE910A0E308308DE50120A0E30430A0E1063000EBFC30AE +S31A50001BFE4BE200308DE5012C4BE204208DE558004BE2EC329F7B +S31A50001C13E57310A0E308308DE50120A0E30430A0E1FB2F00EB63 +S31A50001C28413F4BE200308DE540004BE2CC329FE56E10A0E3080A +S31A50001C3D308DE50420A0E104408DE50230A0E3F12F00EB073048 +S31A50001C52A0E300308DE5422F4BE204208DE5063043E208308DAE +S31A50001C67E50800A0E198329FE50710A0E10C308DE50220A0E36B +S31A50001C7C0630A0E1F02F00EB040050E10570A0E10200001A787D +S31A50001C91029FE500FEFFEB4D0100EA04211BE5000052E30200E6 +S31A50001CA6001AD8301BE5000053E30A00000A000052E302000030 +S31A50001CBB0AF0301BE5000053E30500000AF8301BE5000053E3F1 +S31A50001CD00200000A08311BE5000053E30200001A2C029FE5EC74 +S31A50001CE5FDFFEB390100EA00311BE5F4001BE5000053E3FC0032 +S31A50001CFA0B0514529FE5004095E5040080E0010040E20410A090 +S31A50001D0FE12C3F00EB940003E0FC201BE50590A0E1F4300BE575 +S31A50001D24020053E10200002AE8019FE5201F00EB260100EAF05A +S31A50001D39301BE5000053E31800000AEC001BE5E12A00EB006075 +S31A50001D4E50E20600001AEC001BE5FC301BE5030080E00100401C +S31A50001D63E2DA2A00EB006050E20D00000AEC401BE50600A0E1E8 +S31A50001D78432C00EB0020A0E198019FE50410A0E10A1F00EB90AF +S31A50001D8D019FE590319FE590C19FE5001093E500209CE5041F00 +S31A50001DA200EB0A0100EA08011BE5161F00EB0F0050E303000088 +S31A50001DB79A70019FE51010A0E3FC1E00EB020100EA04311BE568 +S31A50001DCC000053E31C00001A58619FE5D4101BE5003096E55024 +S31A50001DE1419FE5030051E10400003AFC301BE5002094E5033067 +S31A50001DF681E0020053E10500003A34019FE5EB1E00EB14019F4B +S31A50001E0BE5001096E5002094E5E71E00EBF0301BE5000053E31D +S31A50001E200800001AF4101BE50700A0E1F6FEFFEB000050E30395 +S31A50001E3500001A00019FE5F4101BE5DC1E00EBE20000EADC30E2 +S31A50001E4A9FE5001099E5EC409FE50080A0E300C093E50120A06F +S31A50001E5FE1000094E50CC061E010C10BE50C10A0E1231D00EB28 +S31A50001E74003099E50860A0E1007094E5230458E13500002A00C4 +S31A50001E8930D7E5FF0053E32D00000A08011BE50710A0E1E91EEE +S31A50001E9E00EB000050E32800001AF0301BE5000053E303000020 +S31A50001EB30A102097E5EC301BE5030052E19E00001A181097E560 +S31A50001EC8F4201BE5020051E19D00001A6C009FE508111BE51097 +S31A50001EDD2100EB000050E3BA00000A0180A0E31B0000EAC028A6 +S31A50001EF20150D4280150E8280150FC2801501829015030290125 +S31A50001F07504C290150802901508C290150A0290150889E000019 +S31A50001F1CBC290150EC2901500C2A0150809E0000849E000028CF +S31A50001F312A015088450100F4440100582A0150842A0150909EC3 +S31A50001F460000102B0150016086E2003099E5017C87E2230456CA +S31A50001F5BE1C9FFFF3A04211BE5000058E30C00001A003099E505 +S31A50001F70E0119FE50860A0E1007091E5020000EA016086E2000D +S31A50001F853099E5017C87E2230456E10200002A0030D7E5FF00E8 +S31A50001F9A53E3F7FFFF1A000052E32C00001AEC101BE5FC301BD9 +S31A50001FAFE50100A0E1031081E0011041E2450D00EB008050E2C9 +S31A50001FC40200000A8C019FE5791E00EB7F0000EA01A0A0E3EC9A +S31A50001FD9001BE5435F4BE2F4101BE50520A0E16E2A00EB006041 +S31A50001FEE50E20800000A0600A0E10C411BE508A0A0E1A12B007B +S31A50002003EB0410A0E10030A0E14C019FE50620A0E1671E00EB59 +S31A5000201800005AE30E00000AEC001BE5D4101BE5FC201BE50517 +S31A5000202D30A0E1A82A00EB006050E20700000A0C411BE50600E4 +S31A50002042A0E1902B00EB0410A0E10030A0E10C019FE50620A06F +S31A50002057E1561E00EB0700A0E10010A0E3012CA0E3D91C00EB33 +S31A5000206C08111BE50700A0E1831E00EBEC301BE5E0201BE510B0 +S31A500020813087E5000052E30500001AF0301BE5000053E3EC20A2 +S31A500020961B150200001AD4201BE5000000EADC201BE5E8301B86 +S31A500020ABE5142087E5000053E30200001AA8309FE5003093E5EF +S31A500020C0000000EAE4301BE51C3087E5F4301BE5183087E5FC2B +S31A500020D5201BE5202087E5EC001BE5FC101BE5B5FCFFEBFC0045 +S31A500020EA87E510011BE5434F4BE2001099E50420A0E1142B00DD +S31A500020FFEB10011BE5001099E50420A0E1252A00EB006050E27B +S31A500021140450A0E11600000A0C411BE50600A0E1582B00EB0425 +S31A5000212910A0E10030A0E134009FE50620A0E11E1E00EB1D0066 +S31A5000213E00EA28009FE51B1E00EB210000EA20009FE5181E0097 +S31A50002153EB1E0000EA909E00002C2B0150602B0150842B01507C +S31A5000216890450100AC2B0150AC2A0150D82A01504C309FE51084 +S31A5000217D011BE5001093E5002099E50530A0E1512A00EB006054 +S31A5000219250E20700000A0C411BE50600A0E1392B00EB0410A0C8 +S31A500021A7E10030A0E11C009FE50620A0E1FF1D00EB10011BE5DC +S31A500021BC001099E50520A0E1962A00EB010000EA909E0000CCF4 +S31A500021D12B0150F0AF1BE90DC0A0E1F0D82DE904B04CE254D052 +S31A500021E64DE20040A0E30070A0E14C504BE254400BE50500A0B9 +S31A500021FBE15C400BE550304BE200308DE554204BE204208DE586 +S31A500022100160A0E128319FE56610A0E308308DE50120A0E30459 +S31A5000222530A0E17A2E00EB58304BE200308DE55C204BE20420E6 +S31A5000223A8DE534004BE200319FE56C10A0E308308DE50120A047 +S31A5000224FE30430A0E16F2E00EB0220A0E314008DE8E4309FE53E +S31A500022640700A0E10C308DE50610A0E108408DE50530A0E17260 +S31A500022792E00EB040050E10200001AC4009FE583FCFFEB460099 +S31A5000228E00EA54301BE5000053E30200000A5C301BE500005356 +S31A500022A3E30200001AA4009FE57AFCFFEB3D0000EA50001BE5D2 +S31A500022B8852900EB005050E20600001A50001BE558301BE503A5 +S31A500022CD0080E0010040E27E2900EB005050E20D00000A504068 +S31A500022E21BE50500A0E1E72A00EB0020A0E160009FE50410A0D6 +S31A500022F7E1AE1D00EB58009FE558309FE558C09FE5001093E5D9 +S31A5000230C00209CE5A81D00EB240000EA50101BE558301BE5011E +S31A5000232100A0E1031081E0011041E2690C00EB000050E30C0089 +S31A50002336000A28009FE59D1D00EB190000EAFC280150F02B014D +S31A5000234B50742401508C290150F82B0150EC2901500C2A015087 +S31A50002360809E0000849E00000C2C015050001BE558101BE56031 +S31A50002375204BE28A2900EB005050E20900000A60401BE50500D8 +S31A5000238AA0E1BE2A00EB0410A0E10030A0E108009FE50520A0FD +S31A5000239FE1841D00EB000000EAAC2B0150F0A81BE90DC0A0E16A +S31A500023B4F0D82DE904B04CE254D04DE20040A0E30070A0E14CAB +S31A500023C9504BE254400BE50500A0E15C400BE550304BE20030B9 +S31A500023DE8DE554204BE204208DE50160A0E1FC309FE56610A043 +S31A500023F3E308308DE50120A0E30430A0E1042E00EB58304BE2C7 +S31A5000240800308DE55C204BE204208DE534004BE2D4309FE56C33 +S31A5000241D10A0E308308DE50120A0E30430A0E1F92D00EB02208B +S31A50002432A0E314008DE8B8309FE50700A0E10C308DE50610A0DB +S31A50002447E108408DE50530A0E1FC2D00EB040050E10200001A74 +S31A5000245C98009FE50DFCFFEB3A0000EA54301BE5000053E30226 +S31A5000247100000A5C301BE5000053E30200001A78009FE504FC1C +S31A50002486FFEB310000EA50001BE50F2900EB005050E2060000EB +S31A5000249B1A50001BE558301BE5030080E0010040E2082900EB42 +S31A500024B0005050E21600000A50401BE50500A0E1712A00EB0083 +S31A500024C520A0E134009FE50410A0E1381D00EB2C009FE52C3072 +S31A500024DA9FE52CC09FE5001093E500209CE5321D00EB18000028 +S31A500024EFEAFC280150F02B0150742401508C290150F82B015054 +S31A50002504EC2901500C2A0150809E0000849E000050001BE55897 +S31A50002519101BE560204BE2BF2900EB005050E20900000A604092 +S31A5000252E1BE50500A0E1542A00EB0410A0E10030A0E108009F66 +S31A50002543E50520A0E11A1D00EB000000EA402C0150F0A81BE93D +S31A500025580DC0A0E1F0D82DE904B04CE254D04DE20040A0E300F4 +S31A5000256D70A0E14C504BE254400BE50500A0E15C400BE5503033 +S31A500025824BE200308DE554204BE204208DE50160A0E1FC309F3B +S31A50002597E56610A0E308308DE50120A0E30430A0E19A2D00EB46 +S31A500025AC58304BE200308DE55C204BE204208DE534004BE2D4F9 +S31A500025C1309FE56C10A0E308308DE50120A0E30430A0E18F2D3D +S31A500025D600EB0220A0E314008DE8B8309FE50700A0E10C308DC4 +S31A500025EBE50610A0E108408DE50530A0E1922D00EB040050E1BA +S31A500026000200001A98009FE5A3FBFFEB3A0000EA54301BE50007 +S31A500026150053E30200000A5C301BE5000053E30200001A7800C2 +S31A5000262A9FE59AFBFFEB310000EA50001BE5A52800EB0050507F +S31A5000263FE20600001A50001BE558301BE5030080E0010040E2D0 +S31A500026549E2800EB005050E21600000A50401BE50500A0E107AB +S31A500026692A00EB0020A0E134009FE50410A0E1CE1C00EB2C0002 +S31A5000267E9FE52C309FE52CC09FE5001093E500209CE5C81C0010 +S31A50002693EB180000EAFC280150F02B0150742401508C2901501F +S31A500026A8F82B0150EC2901500C2A0150809E0000849E000050D6 +S31A500026BD001BE558101BE560204BE2A12900EB005050E209005D +S31A500026D2000A60401BE50500A0E1EA2900EB0410A0E10030A00A +S31A500026E7E108009FE50520A0E1B01C00EB000000EA602C0150F7 +S31A500026FCF0A81BE90DC0A0E1F0DF2DE904B04CE218D04DE200AB +S31A5000271160A0E300608DE52C304BE204308DE50120A0E30820AD +S31A500027268DE55C319FE50C308DE5022082E00630A0E1422D006D +S31A5000273BEB060050E10200001A44019FE553FBFFEB6D0000EA9D +S31A500027503C319FE53C519FE53C419FE5001093E5002095E506F3 +S31A5000276580A0E1000094E5019062E00910A0E1E21A00EB0060DB +S31A5000277A94E50270A0E3026C86E205A0A0E1010000EA017087A7 +S31A5000278FE2016C86E200309AE5230457E10D00002A0030D6E5F8 +S31A500027A4FF0053E3F7FFFF0A2C001BE50610A0E1A31C00EB0029 +S31A500027B90050E3F2FFFF1AD8009FE52C101BE5D51E00EB000002 +S31A500027CE50E34C00000A0180A0E3000058E30300001ABC009F60 +S31A500027E3E52C101BE5721C00EB450000EA100096E530404BE29A +S31A500027F8181096E50420A0E1682800EB005050E20470A0E10735 +S31A5000280D00000A30401BE50500A0E19B2900EB0410A0E10030EC +S31A50002822A0E17C009FE50520A0E1611C00EB0900A0E100109A88 +S31A50002837E50720A0E1442900EB0600A0E1FF10A0E3012CA0E388 +S31A5000284CE01A00EB0900A0E100109AE50720A0E1512800EB0017 +S31A500028615050E21000000A30401BE50500A0E1852900EB0410CD +S31A50002876A0E10030A0E124009FE50520A0E14B1C00EB1700000E +S31A5000288BEA842C01508C290150849E0000889E0000909E00007B +S31A500028A0902C0150A42C0150AC2B01504C309FE5001093E509E6 +S31A500028B500A0E100209AE50730A0E1842800EB005050E20700C0 +S31A500028CA000A30401BE50500A0E16C2900EB0410A0E10030A0BE +S31A500028DFE11C009FE50520A0E1321C00EB0900A0E100109AE515 +S31A500028F40720A0E1C92800EB010000EA909E0000CC2B0150F0A4 +S31A50002909AF1BE90DC0A0E1F0D82DE904B04CE250D04DE2004013 +S31A5000291EA0E30070A0E14C504BE254400BE50500A0E158400B64 +S31A50002933E550304BE200308DE554204BE204208DE50160A0E1EC +S31A50002948E4309FE56210A0E308308DE50120A0E30430A0E1ADE7 +S31A5000295D2C00EB58304BE200308DE534004BE2C4309FE5631055 +S31A50002972A0E308308DE50420A0E104408DE50230A0E3A32C00EE +S31A50002987EB0220A0E300208DE55C304BE204308DE50110A0E3D0 +S31A5000299C08108DE594309FE50700A0E10C308DE50610A0E1052C +S31A500029B130A0E1A32C00EB040050E10200001A78009FE5B4FA55 +S31A500029C6FFEB3D0000EA5C001BE58CFAFFEB005050E203000044 +S31A500029DB1A60009FE55C101BE5F31B00EB350000EA54301BE58B +S31A500029F0000053E31430950550300B0544209FE550001BE500A0 +S31A50002A053092E5030050E10500003A34309FE518C095E5001002 +S31A50002A1A93E50C2080E0010052E10A00003A20009FE5E11B0035 +S31A50002A2FEB230000EABC2C0150D82C0150842C01508C290150AF +S31A50002A44A42C015088450100F4440100EC2C0150101095E50CF0 +S31A50002A5920A0E1281A00EB50001BE54C309FE51C2095E520100E +S31A50002A6E95E5002083E551FAFFEB58301BE50040A0E10000532A +S31A50002A83E30200000A2C009FE50410A0E1C81B00EBFC1095E560 +S31A50002A98000051E30800000A010054E10600000A10009FE504AF +S31A50002AAD20A0E1C01B00EB020000EA90450100042D0150182DCE +S31A50002AC20150F0A81BE90DC0A0E1F0D92DE944209FE504D04D86 +S31A50002AD7E2004092E504B04CE2000054E32700001A30809FE56D +S31A50002AEC0118A0E3000098E50130A0E3003082E5010840E25E92 +S31A50002B012700EB001050E20600000A10009FE5A81B00EB0400BF +S31A50002B16A0E11B0000EAA8830000F44401005C2D015060709F21 +S31A50002B2BE560609FE50100A0E15C409FE50710A0E10620A0E135 +S31A50002B40772700EB50509FE50400A0E10510A0E1842700EB4488 +S31A50002B55009FE5001097E5002096E500C094E5003095E500C0C7 +S31A50002B6A8DE5911B00EB003094E5002098E524109FE50138833D +S31A50002B7FE2022063E0002081E50100A0E3050000EA809E00008D +S31A50002B94849E0000889E00008C9E0000882D0150909E0000F040 +S31A50002BA9A91BE90DC0A0E130D82DE904B04CE20050A0E10100F4 +S31A50002BBE55E30140A0E1020000CA48009FE532FAFFEB30A81B11 +S31A50002BD3E9BBFFFFEB000050E30C00000A34009FE534109FE541 +S31A50002BE8042094E5B62B00EB003050E20400000A0500A0E1041F +S31A50002BFD10A0E10FE0A0E10CF093E530A81BE910009FE521FA6D +S31A50002C12FFEB30A81BE9B82D0150E486000074870000CC2D01FC +S31A50002C27500DC0A0E1F0DD2DE904B04CE24BDF4DE20040A0E1C5 +S31A50002C3C0150A0E10330D4E502A0A0E1000053E31000000A13E9 +S31A50002C511E4BE20100D4E50120A0E3040080E2000084E004029F +S31A50002C6600EB0220D4E5000052E30200000A30311BE500005348 +S31A50002C7BE36500000A000052E30200001A30311BE5000053E3B4 +S31A50002C906000001A0320D4E5000055E30130D4E5022084E004D7 +S31A50002CA53083E2037082E00300000AB8039FE50510A0E13E1B1F +S31A50002CBA00EB020000EAA8039FE5041084E23A1B00EB0080D49B +S31A50002CCFE5013048E2050053E303F19F97490000EAF82C00504E +S31A50002CE4282D00509C2D0050A42D0050482D0050602D00504DB7 +S31A50002CF90F4BE20710A0E10420A0E37E1900EB64239FE5343103 +S31A50002D0E1BE560139FE560039FE5000053E30210A001241B0054 +S31A50002D23EB370000EA4E0F4BE20710A0E10420A0E3721900EBFA +S31A50002D3840039FE538111BE51C1B00EB2F0000EA0700A0E187D6 +S31A50002D4D2500EB0010A0E120039FE5161B00EB290000EA005054 +S31A50002D62A0E318439FE50510D7E70400A0E1101B00EB040055DD +S31A50002D77E30100008A04039FE50C1B00EB015085E2050055E3F1 +S31A50002D8CF5FFFF9AF4029FE5071B00EB1A0000EAEC029FE51B37 +S31A50002DA10000EAE8029FE50750A0E1011B00EB0030D7E507405D +S31A50002DB6A0E1000053E31100000AD0629FE50030D5E50A0053E3 +S31A50002DCBE30200000A0130F4E50A0053E3FCFFFF1A0600A0E1C9 +S31A50002DE00030A0E30030C4E50510A0E1F11A00EB0A30A0E301B2 +S31A50002DF530C4E40450A0E10030D5E5000053E3EEFFFF1A0000A0 +S31A50002E0A5AE30300000A7C029FE5E71A00EB0200A0E3A30000FD +S31A50002E1FEA040058E31500000A494F4BE20400A0E1011CA0E316 +S31A50002E340A20A0E1421C00EB000050E30000E0E30460A0E198CC +S31A50002E490000BA0600A0E1ED1A00EB000050E3EEFFFF0AFF3093 +S31A50002E5EE0E324204BE20330D2E72E0053E30A00A0018E00004C +S31A50002E730A5E0053E30300A0038B00000A013048E2050053E385 +S31A50002E8803F19F97860000EAA82E0050F42E0050A4300050D8B1 +S31A50002E9D2F0050382F0050742F00504D0F4BE20710A0E104205C +S31A50002EB2A0E3121900EB490F4BE24F4F4BE20410A0E1712C009A +S31A50002EC7EB000050E36500000A34211BE53C311BE5030052E11B +S31A50002EDCCDFFFF0A0700A0E10410A0E10420A0E3041900EB6D7D +S31A50002EF10000EA4E0F4BE20710A0E10420A0E3FF1800EB490F69 +S31A50002F064BE2054D4BE20410A0E10020A0E30230A0E1042C0099 +S31A50002F1BEB000050E35000000A38211BE540311BE5030052E1D3 +S31A50002F30EAFFFF1AB7FFFFEA510F4BE20710A0E10420A0E3EEDB +S31A50002F451800EB490F4BE2524F4BE20410A0E1B72400EB000070 +S31A50002F5A50E34100000A44211BE548311BE5030052E1DBFFFFA1 +S31A50002F6F1AA8FFFFEA4B4F4BE20400A0E10710A0E10620A0E3C0 +S31A50002F84DE1800EB0050A0E304A0A0E1534F4BE2493F4BE25035 +S31A50002F99310BE5156E4BE2E0809FE50410A0E10620A0E150018B +S31A50002FAE1BE50830A0E1DD2B00EB000050E32500000A0030D4A6 +S31A50002FC3E50530C7E7015085E2050055E3F3FFFF9A340000EA3D +S31A50002FD8BC009FE50750A0E1741A00EB496F4BE2B0709FE5096B +S31A50002FED0000EA0030D6E50640A0E1000053E30300000A013069 +S31A50003002C5E40130F4E5000053E3FBFFFF1A0A30A0E30130C5B4 +S31A50003017E40040A0E30040C5E50700A0E1631A00EB0600A0E146 +S31A5000302C011CA0E30420A0E1C31B00EB040050E10000E0E31A19 +S31A500030410000BA0600A0E16F1A00EB040050E1E6FFFF1A140028 +S31A5000305600EA0700A0E10A10A0E10620A0E3A61800EB0400A00C +S31A5000306BE30F0000EA602E0150742E01506C2E0150682E01507A +S31A500030807C2E0150842E01508C2E0150902E0150942E01509822 +S31A500030952E01509C2E0150A42E0150D02E015008009FE5421ADC +S31A500030AA00EB0100A0E3000000EA942E0150F0AD1BE90DC0A041 +S31A500030BFE100D82DE9031081E22111A0E10130A0E1011041E2C8 +S31A500030D404B04CE200E0A0E10000A0E300C0A0E1000053E1094D +S31A500030E90000DA0120A0E1011041E204309EE40F005CE3133C79 +S31A500030FE83E1030020E001C08C1200C0A003000052E3F5FFFF16 +S31A50003113CA00A81BE90DC0A0E100D82DE9010040E204B04CE29A +S31A50003128050050E300F19F970C0000EA4C3100504C3100505CF1 +S31A5000313D310050643100504C310050543100500400A0E300A8F0 +S31A500031521BE90800A0E300A81BE90000A0E300A81BE9020CA0FA +S31A50003167E300A81BE90DC0A0E1F0DF2DE904B04CE242DE4DE20A +S31A5000317C0CD04DE20080A0E30070A0E101A0A0E14DFEFFEB6032 +S31A50003191919FE5080050E16B00000A426E4BE2086046E206009D +S31A500031A6A0E14C519FE5012BA0E30510A0E1521800EB433E4BB6 +S31A500031BBE2083043E20C3043E200308DE5434E4BE204808DE5B3 +S31A500031D0084044E224319FE5084044E2008083E50400A0E1185A +S31A500031E5319FE56C10A0E308308DE50820A0E10230A0E3862A13 +S31A500031FA00EB0120A0E304018DE8FC309FE50700A0E10C308D60 +S31A5000320FE50A10A0E108808DE50430A0E1892A00EB080050E14E +S31A5000322405A0A0E14700000A08508AE2FE3F8AE2030055E13DE5 +S31A5000323900002A0830DAE5080053E13A00000A0000D5E500705F +S31A5000324EA0E3B0FFFFEB0120D5E5AC409FE50330D5E50020821F +S31A50003263E0043083E2036082E0000000EA184084E2090054E1DC +S31A500032780500000A000094E5041085E2EF1900EB000050E3F7CB +S31A5000328DFFFF1A047094E50500A0E144241BE50710A0E160FEED +S31A500032A2FFEB010080E2050050E300F19F97190000EACC320014 +S31A500032B75034330050E4320050E8320050F032005014330050CC +S31A500032CC0A00A0E1421E4BE2081041E2012BA0E3081800EB1971 +S31A500032E10000EA0180A0E3065085E00A0000EA18509FE50800F1 +S31A500032F600EAE4880000949E000094450100D42E01507424011F +S31A5000330B50248800009C9E000028009FE5A61900EB24309FE5F3 +S31A50003320030055E10200002A0030D5E5000053E3C4FFFF1A00E1 +S31A500033350058E30300000A030000EB010000EAEC2E01508CA273 +S31A5000334A0000F0AF1BE90DC0A0E1F0DF2DE9A8309FE5FF1FA028 +S31A5000335FE3A4209FE504B04CE2A0709FE5019BA0E3009087E547 +S31A5000337404D04DE2043087E5F82387E50700A0E14CFFFFEBFC0B +S31A500033890387E580409FE580309FE5001094E5002093E5780059 +S31A5000339E9FE5816042E0DE1B00EB000050E30480A0E1300000F1 +S31A500033B30A0600A0E12C404BE2001098E50420A0E1622600EBE0 +S31A500033C80600A0E1001098E50420A0E1732500EB005050E204D8 +S31A500033DDA0A0E10F00000A2C401BE50500A0E1A62600EB04108E +S31A500033F2A0E10030A0E120009FE50520A0E16C1900EB1500006F +S31A50003407EACEFAAD0BADDEADDE949E0000889E0000849E000060 +S31A5000341C002F0150342701500600A0E10710A0E10920A0E10A46 +S31A5000343130A0E1A72500EB005050E20700000A2C401BE50500C4 +S31A50003446A0E18F2600EB0410A0E10030A0E118009FE50520A053 +S31A5000345BE1551900EB0600A0E1001098E50A20A0E1EC2500EB11 +S31A50003470000000EA2C2F0150F0AF1BE90DC0A0E1F0DD2DE9087F +S31A50003485319FE504B04CE20080A0E10160A0E1003093E502A018 +S31A5000349AA0E1000053E30100001A0300A0E1F0AD1BE9E4509FFD +S31A500034AFE53F3E85E2030055E13000002A0000D5E514FFFFEB9F +S31A500034C401C0D5E5041085E20320D5E500E08CE00800A0E104F1 +S31A500034D93082E203708EE0022085E004C08CE20C4082E055193E +S31A500034EE00EB000050E31D00001A0030D5E50A0053E1150000E1 +S31A500035031A01304AE2050053E303F19F97100000EA2C350050D6 +S31A500035182C35005068350050543500502C350050403500500655 +S31A5000352D00A0E10410A0E10420A0E3711700EB090000EA06000A +S31A50003542A0E10410A0E10620A0E36C1700EB040000EA0040863D +S31A50003557E5020000EA38009FE50810A0E1131900EB0100A0E348 +S31A5000356CF0AD1BE928309FE5075085E0030055E1CEFFFF3A1C60 +S31A50003581009FE50810A0E10A1900EB0000A0E3F0AD1BE994A25A +S31A5000359600009C9E0000582F01508CA20000842F01500DC0A019 +S31A500035ABE1F0D92DE904B04CE20070A0E10080A0E378519FE5D2 +S31A500035C00030D5E5000053E34B00001A006097E50600A0E10CAC +S31A500035D51900EB014080E2100097E5CCFEFFEB043088E0040004 +S31A500035EA80E2082097E5008083E0000052E30400000A0200A0A8 +S31A500035FFE1011900EB010080E2008088E0000000EA0200A0E1C3 +S31A500036143F0E58E34200008A0140C5E50300C5E51030D7E50063 +S31A5000362930C5E50C20D7E50220C5E50020D6E5045085E2000012 +S31A5000363E52E30500000A0030D5E5023083E00130C5E40120F66D +S31A50003653E5000052E3F9FFFF1A0030A0E30130C5E4030050E120 +S31A500036680B00000A086097E50020D6E5030052E10500000A00DE +S31A5000367D30D5E5023083E00130C5E40120F6E5000052E3F9FF60 +S31A50003692FF1A0030A0E30130C5E4103097E5013043E2050053BD +S31A500036A7E303F19F970E0000EAC8360050C8360050EC360050A5 +S31A500036BCEC360050C8360050DC3600500500A0E1141087E2046A +S31A500036D120A0E30A1700EB030000EA0500A0E1141087E20620B9 +S31A500036E6A0E3051700EB100097E588FEFFEB0100A0E3F0A91BBB +S31A500036FBE90000D5E584FEFFEB0120D5E50330D5E5002082E00B +S31A50003710043083E2034082E0045085E0048088E03F0E58E3A53E +S31A50003725FFFF3A10009FE5001097E5A01800EB0000A0E3F0A922 +S31A5000373A1BE99C9E0000A82F01500DC0A0E170D82DE90010A062 +S31A5000374FE370409FE5012BA0E36C509FE504B04CE268609FE5DB +S31A500037640400A0E1191700EB060055E10600000A0500A0E18AFE +S31A50003779FFFFEB000050E30F00000A185085E2060055E1F8FFAE +S31A5000378EFF1A3C209FE5013BA0E3003084E5042084E530309FF3 +S31A500037A3E50400A0E1F83384E5FF1FA0E341FEFFEBFC0384E58B +S31A500037B81C209FE50130A0E3003082E570A81BE9949E00002429 +S31A500037CD880000E4880000CEFAAD0BADDEADDE94A200000DC004 +S31A500037E2A0E170D82DE98C609FE50030A0E388509FE504B04C1E +S31A500037F7E2003086E504D04DE2003085E5AFFCFFEB000050E385 +S31A5000380C3800000A6C309FE56C009FE56C409FE5001090E50149 +S31A500038212BA0E300C093E50400A0E18C1041E0B31600EB04005C +S31A50003836A0E1FF1FA0E31EFEFFEBFC3394E5030050E10700001C +S31A5000384B1A042094E538309FE5030052E10300001AF82394E588 +S31A500038602C309FE5030052E10B00000A24009FE5501800EBB225 +S31A50003875FFFFEB1D0000EA94A2000094450100889E0000849EA0 +S31A5000388A0000949E0000CEFAAD0BADDEADDEC02F01501C104B54 +S31A5000389FE23C009FE50120A0E3F3FEFFEB1C301BE5000053E31B +S31A500038B40700000A0510A0E124009FE50420A0E3ECFEFFEB1CC3 +S31A500038C9009FE51C109FE50220A0E3E8FEFFEB0130A0E3003007 +S31A500038DE86E5030000EAF82D0150102E01504C2E0150F844011A +S31A500038F30070A81BE90DC0A0E100D82DE9803260E0030180E0BC +S31A50003908000180E014209FE50002A0E1483092E504B04CE20FD8 +S31A5000391DE0A0E103F0A0E100A81BE9500000000DC0A0E1F0DF51 +S31A500039322DE90010A0E304B04CE261DF4DE2A4110BE598010BE7 +S31A50003947E5042090E59C210BE5A0110BE5007092E50130A0E3AE +S31A5000395CA8310BE5B91200EBC11200EBB71200EB042097E5016E +S31A500039710052E30500000AA8111BE5040052E30030A0130130A1 +S31A50003986A003014013E0A400000A0030A0E3A8310BE50400527F +S31A5000399BE30200000A0700A0E10410A0E3AA2300EB043097E54B +S31A500039B0040053E30300000ACC029FE5FD1700EBA8011BE5BBB0 +S31A500039C50000EA0700A0E1013CA0E390310BE52010A0E3A83128 +S31A500039DA1BE5632F4BE294310BE5654F4BE200408DE5193E4BD9 +S31A500039EFE2722200EB000050E363AF4BE20700000A88329FE54B +S31A50003A0428104BE2F32091E1410F52E30200000A78029FE5E6F8 +S31A50003A191700EBD0FFFFEA0700A0E10030A0E394310BE5151073 +S31A50003A2EA0E3653F4BE200308DE50A20A0E1193E4BE25E220088 +S31A50003A43EB000050E31B00000A628F4BE20840A0E10130D4E405 +S31A50003A5838929FE5000053E30200000A0130D4E4000053E3FC58 +S31A50003A6DFFFF1A0460A0E10130D4E4000053E3FCFFFF1A04506A +S31A50003A82A0E10130D4E4000053E3FCFFFF1AA4111BE50000511F +S31A50003A97E30100000AF8019FE5C41700EB0900A0E10610A0E172 +S31A50003AAC0820A0E100408DE50530A0E1BE1700EB0700A0E11A3C +S31A50003AC110A0E30050A0E394510BE5653F4BE200308DE50A20C2 +S31A50003AD6A0E1193E4BE2372200EB050050E10800000A0A00A04A +S31A50003AEBE190111BE58C204BE20C2300EB8C301BE5A0111BE58E +S31A50003B00050050E10310A011A0110BE5A0211BE5000052E39237 +S31A50003B15FFFF0A0510A0E17C519FE507CDA0E30500A0E1083041 +S31A50003B2A97E5813083E00C20D3E70120C0E7011081E205005128 +S31A50003B3FE3F8FFFFDA0700A0E10030A0E394310BE51B10A0E3CA +S31A50003B54653F4BE200308DE50A20A0E1193E4BE2152200EB0042 +S31A50003B690050E32900000A0A00A0E190111BE574204BE2B022CC +S31A50003B7E00EB000050E32000000A9C111BE570201BE500309196 +S31A50003B93E5101093E5024081E09C211BE5044082E5A0111BE58E +S31A50003BA874205BE50700A0E12E2200EB1F30D4E51F30C4E50714 +S31A50003BBD20D4E5800012E30200001A0730D4E5800013E3FCFFD2 +S31A50003BD2FF0A98111BE5003091E50100A0E1242093E50510A03D +S31A50003BE7E10FE0A0E100F092E59C211BE5343092E50140A0E35F +S31A50003BFC0C4083E51A1200EB0400A0E12A0000EA90009FE5687E +S31A50003C111700EB52FFFFEA88009FE5651700EB4FFFFFEA05005D +S31A50003C2652E30200001A78009FE5601700EB4AFFFFEA0C120034 +S31A50003C3BEB3200A0E32CFFFFEBA4311BE5000053E30100001A43 +S31A50003C5058009FE5571700EBA4111BE550009FE5011081E2A433 +S31A50003C65110BE5521700EBA4211BE50400A0E10A0052E30E0008 +S31A50003C7A000A0700A0E14F0500EBF01100EB35FFFFEA043001D0 +S31A50003C8F509EFEFFFF203001503C30015038300150F083000056 +S31A50003CA44C300150603001507C3001509C300150BC300150F0C0 +S31A50003CB9AF1BE90DC0A0E170D82DE90040A0E1086094E504504B +S31A50003CCE96E504B04CE2D12200EB0000A0E3C22200EB00008579 +S31A50003CE3E5344085E50600A0E10EFFFFEB70A81BE90DC0A0E1CB +S31A50003CF800D82DE904B04CE204C090E504109CE52130A0E300EF +S31A50003D0D30C1E5FF20A0E30720C1E5213043E20F30C1E530304B +S31A50003D228CE500A81BE90DC0A0E130D82DE9044090E504B04CF4 +S31A50003D37E204C094E52130A0E30030CCE54820A0E30E20CCE583 +S31A50003D4C0000A0E30B00CCE50A00CCE5013043E20C30CCE54689 +S31A50003D612042E20D20CCE5203083E20430CCE5180084E51400A6 +S31A50003D7684E5083084E50150A0E12C0084E55010A0E30110CCB1 +S31A50003D8BE53F3083E20330CCE57E2082E20220CCE5303043E2D6 +S31A50003DA0103084E57F2082E20720CCE5103043E20F30CCE59F40 +S31A50003DB52042E20020CCE500E0A0E101208CE20710CCE50E3098 +S31A50003DCAD5E70E30C2E701E08EE205005EE3FAFFFFDA2230A090 +S31A50003DDFE30030CCE50020A0E30D20CCE51E3043E20C30CCE5D4 +S31A50003DF4012082E2302084E530A81BE90DC0A0E100D82DE9010D +S31A50003E090C51E20100A01304B04CE200A81BE90DC0A0E100D8A7 +S31A50003E1E2DE9042090E504B04CE2143092E50000A0E300005317 +S31A50003E33E10200000A183092E5000053E10000001A0100A0E3A6 +S31A50003E4800A81BE90DC0A0E100D82DE904B04CE204C090E50408 +S31A50003E5D009CE52230A0E30030C0E50520C0E54224A0E10620F8 +S31A50003E72C0E50410C0E5043083E20030C0E50120A0E32C208C9D +S31A50003E87E500A81BE90DC0A0E1F0DF2DE904B04CE20090A0E119 +S31A50003E9C0380A0E13F0058E3044099E50850A0C14050A0D304BB +S31A50003EB1309BE50160A0E1087094E502A0A0E1040094E5400043 +S31A50003EC657E30400001A147084E51C3084E5245084E54830A0A2 +S31A50003EDBE3030000EA187084E5203084E5285084E54030A0E32E +S31A50003EF0083084E52230A0E30030C0E50A50C0E54534A0E10B18 +S31A50003F0530C0E50020A0E30820C0E502E0A0E10970C0E540301B +S31A50003F1AA0E30730C0E5122082E20020C0E50A005EE10F00002A +S31A50003F2FAA8E31A0E1062083E004C092E501E08EE2061093E798 +S31A50003F440C20A0E101C04CE2000052E3F4FFFFDA0C20A0E101C7 +S31A50003F5930D1E401C04CE21030C0E5000052E3F9FFFFCAEDFF62 +S31A50003F6EFFEA050058E1040000AA0030A0E305E068E01030C033 +S31A50003F83E501E05EE2FCFFFF1A2C2094E50730D0E5400013E3D2 +S31A50003F98FCFFFF0A000052E30800001A143094E5030057E1016A +S31A50003FAD30A0030230A0130C3084E50900A0E10710A0E1052005 +S31A50003FC2A0E1A0FFFFEBF0AF1BE90DC0A0E170D82DE904D04D1A +S31A50003FD7E20060A0E1045096E5044095E50C20D4E56230A0E335 +S31A50003FEC0030C4E50710D4E5403043E20030C4E504B04CE22A47 +S31A500040010000EA0430A0E30000A0E30A30C4E50B00C4E5800019 +S31A5000401652E30800C4E55020A0030920C4E5103095E502005365 +S31A5000402BE10200001A013041E20330C4E5210000EA0010A0E161 +S31A500040401C004BE2102085E54030A0E30730C4E50A20A0E300B2 +S31A5000405520C4E51030D4E50130C0E7011081E2030051E3FAFFC2 +S31A5000406AFF9A19305BE51A105BE50600A0E1002096E5031481A5 +S31A5000407FE124C092E5041041E20FE0A0E104F09CE51B305BE5F3 +S31A50004094013043E20330C4E56220A0E30020C4E50710D4E522CF +S31A500040A930A0E30030C4E50320D4E5FF1001E2012082E20100CC +S31A500040BE52E1CFFFFF1A70A81BE90DC0A0E170D82DE904B04CB5 +S31A500040D3E200C0A0E30C40A0E10260A0E1040090E5060054E1F9 +S31A500040E804E090E50150A0E1060000AA0520A0E106C0A0E104A1 +S31A500040FD3092E501C05CE2034084E0082082E2FAFFFF1A22301B +S31A50004112A0E30030CEE50A40CEE54434A0E10B30CEE50420A034 +S31A50004127E30820CEE51010D0E500C0A0E30910CEE54030A0E398 +S31A5000413C0730CEE5062082E20020CEE506005CE10F0000AA8C49 +S31A5000415131A0E1051093E701008CE2000051E3053083E0060081 +S31A50004166000A042093E5000052E30300000A1030DEE50130C111 +S31A5000417BE4012052E2FBFFFF1A00C0A0E106005CE1EFFFFFBA62 +S31A5000419070A81BE90DC0A0E170D82DE90050A0E1044095E50469 +S31A500041A53094E50C2094E504B04CE20410D3E5010052E303007A +S31A500041BA001A1C6094E50030A0E3143084E5020000EA2060942B +S31A500041CFE50030A0E3183084E5141094E50030A0E32C3084E527 +S31A500041E4030051E10500000A242094E50500A0E114FFFFEB01EB +S31A500041F930A0E30C3084E5090000EA181094E5000051E3050036 +S31A5000420E000A282094E50500A0E10BFFFFEB0230A0E30C30848B +S31A50004223E5000000EA0C1084E50500A0E1003095E50610A0E115 +S31A5000423824C093E50020A0E30FE0A0E108F09CE570A81BE90D0A +S31A5000424DC0A0E100D82DE904B04CE200A81BE90DC0A0E1F0D833 +S31A500042622DE90060A0E1047096E5045097E52230A0E30030C571 +S31A50004277E50720D5E504B04CE2FF4002E2100000EA0A0014E316 +S31A5000428C0200000A0600A0E10410A0E1BDFFFFEB050014E302FB +S31A500042A100000A0600A0E10410A0E146FFFFEB300014E3020034 +S31A500042B6000A0600A0E10410A0E1E1FFFFEB0730D5E5FF40037A +S31A500042CBE2000054E30300000A0740C5E5303097E5000053E35F +S31A500042E0E8FFFF1A000097E55F2100EBF0A81BE90DC0A0E100A2 +S31A500042F5D82DE9043090E5002093E504B04CE2200092E500A80E +S31A5000430A1BE90DC0A0E100D82DE91C209FE5083090E503009305 +S31A5000431FE8030082E804B04CE20C109FE50130A0E3003081E512 +S31A5000433400A81BE99CA2000098A200000DC0A0E1F0DF2DE904C3 +S31A50004349B04CE245DF4DE20070A0E1D0504BE20500A0E1FC30E8 +S31A5000435E4BE200308DE5012C4BE204208DE50160A0E174339F0D +S31A50004373E56E10A0E308308DE50120A0E30030A0E3232600EBC4 +S31A50004388413F4BE200308DE5422F4BE204208DE5B8004BE24C16 +S31A5000439D339FE57410A0E308308DE50120A0E30030A0E31826B8 +S31A500043B200EB433F4BE200308DE5112E4BE204208DE5A0004B77 +S31A500043C7E224339FE56910A0E308308DE50120A0E30230A0E1D1 +S31A500043DC0D2600EB453F4BE200308DE5462F4BE204208DE58845 +S31A500043F1004BE2FC329FE56810A0E308308DE50120A0E3023007 +S31A50004406A0E1022600EB473F4BE200308DE5122E4BE204208D44 +S31A5000441BE570004BE2D4329FE56C10A0E308308DE50120A0E3DD +S31A500044300030A0E3F72500EB58004BE2493F4BE200308DE5008B +S31A5000444540A0E3B0329FE57610A0E308308DE50420A0E1044047 +S31A5000445A8DE50230A0E3EC2500EB4A3F4BE200308DE54B2F4BB7 +S31A5000446FE204208DE540004BE284329FE57210A0E308308DE514 +S31A500044840120A0E30430A0E1E12500EB0730A0E318008DE80735 +S31A5000449900A0E164329FE50610A0E10C308DE50120A0E30840EC +S31A500044AE8DE50530A0E1E32500EB040050E10200001A44029F52 +S31A500044C3E53B1500EBCB0000EA10311BE5000053E30900000A2F +S31A500044D8DC304BE20C011BE50310A0E1531F00EB000050E30807 +S31A500044ED00001A18029FE50C111BE52E1500EBBE0000EADC30AD +S31A500045024BE20300A0E10420A0E300129FE57B1300EB18311B83 +S31A50004517E5000053E31000000AE8404BE214011BE50410A0E105 +S31A5000452C411F00EB000050E3D4019FE50600000AE8004BE2F830 +S31A50004541404BE20410A0E1C21D00EB000050E3060000AABC01A3 +S31A500045569FE514111BE5151500EBA50000EAB0019FE512150051 +S31A5000456BEBA20000EA2C311BE5000053E3FA3FA00328310B0596 +S31A5000458020311BE5000053E34030A0031C310B0500311BE500A8 +S31A500045950053E30A30A003FC300B0508311BE5000053E3FA3FC4 +S31A500045AAA00304310B05DC004BE26D1F00EB0010A0E15C019FB1 +S31A500045BFE500A0A0E3FB1400EBE8004BE2671F00EB0010A0E178 +S31A500045D448019FE5F61400EB44019FE50A70A0E13E1900EB664E +S31A500045E90000EA012C4BE2BC3152E1084098E5083083E2BC30B5 +S31A500045FEC8E10060A0E3045098E50830A0E30030C4E501708769 +S31A50004613E20160C4E50708A0E1B260C4E12008A0E1261900EB36 +S31A50004628B600C4E10620A0E1BC10D8E10400A0E1841800EB0094 +S31A5000463D08A0E12008A0E11E1900EBDC104BE2B200C4E104202A +S31A50004652A0E30C0085E2291300EB100085E2E8104BE20420A080 +S31A50004667E3251300EB0140A0E30940C5E5BC00D8E1111900EBA1 +S31A5000467C0410A0E1B200C5E1F8204BE20800A0E1BC1700EB0852 +S31A5000469100A0E15F1800EB3D1700EB88209FE5006082E5043174 +S31A500046A61BE50060A0E1034086E00250A0E1000000EA9B1800AF +S31A500046BBEB003095E5000053E30200001A311700EB040050E145 +S31A500046D0F8FFFF3A2E1700EB0080A0E12C1700EB28311BE50394 +S31A500046E54080E0110000EA2431015048310150743101508831B0 +S31A500046FA015098310150B4310150C8310150E8310150EC3101E2 +S31A5000470F501032015058840000303201505C32015080320150EB +S31A50004724983201500C43005098A200007D1800EB161700EB049A +S31A500047390050E1FBFFFF3A0900A0E1EC104BE20420A0E3EC1259 +S31A5000474E00EB003095E5000053E30A00000A24311BE501A08AA1 +S31A50004763E2000053E30600000A74309FE5B600D3E1D21800EB5C +S31A500047780010A0E168009FE5082066E08B1400EBFC301BE50332 +S31A5000478D0057E10E0000AAEC504BE20500A0E14C409FE50420AE +S31A500047A2A0E30410A0E1D51200EB0400A0E1DC104BE20420A060 +S31A500047B7E3D11200EB30009FE5F41700EB008050E20490A0E175 +S31A500047CC86FFFF1AD01800EB1C009FE5FC201BE50A10A0E17446 +S31A500047E11400EB040000EA9CA20000A032015058840000EA0554 +S31A500047F60000C4320150F0AF1BE90DC0A0E100D82DE930309F33 +S31A5000480BE530009FE5001093E504B04CE228C09FE50C3091E521 +S31A500048200C308CE50C3090E5102091E50C3081E510208CE510D6 +S31A500048353090E5103081E500A81BE9F883000020000050A4A2F0 +S31A5000484A00000DC0A0E100D82DE91C209FE51C109FE5000092C5 +S31A5000485FE50C3091E50C3080E5102091E504B04CE2102080E599 +S31A5000487400A81BE9F8830000A4A200000DC0A0E130D82DE96C94 +S31A50004889209FE504B04CE2003092E50040A0E1000053E305009B +S31A5000489E000A443094E5040053E30200001A003092E5383084CF +S31A500048B3E530A81BE940509FE5003095E5013083E2003085E5EB +S31A500048C8010053E30000001ACAFFFFEB28309FE5004083E56C91 +S31A500048DD0500EB003095E5013043E2003085E5000053E30000B0 +S31A500048F2001AD4FFFFEB30A81BE944840000C4A20000384401FD +S31A50004907000DC0A0E130D82DE924309FE504B04CE220409FE53B +S31A5000491C0350A0E1030054E10300003A0FE0A0E104F014E40586 +S31A500049310054E1FBFFFF2A30A81BE9FC880000FC8800000DC012 +S31A50004946A0E100D82DE90030A0E10120A0E104B04CE20C009FB7 +S31A5000495BE50310A0E1F51100EB0000A0E300A81BE9EC320150E9 +S31A500049700DC0A0E100D82DE904B04CE2FEDEFFE700A81BE90D43 +S31A50004985C0A0E110D82DE970209FE570309FE570109FE500400C +S31A5000499AA0E3004082E5004083E564209FE50130A0E300308173 +S31A500049AFE55C309FE5004082E5004083E5082082E20F32E0E3C9 +S31A500049C4003082E504B04CE2AE0100EB40309FE5004083E509D0 +S31A500049D922A0E3004082E59D0F00EB101F11EE0F1081E3101FB0 +S31A500049EE01EE101F11EE011A81E3031081E3101F01EE10A81B5A +S31A50004A03E904000590080005900C00059010000490140004903C +S31A50004A18100000900DC0A0E130D82DE90030A0E1010040E20053 +S31A50004A2D0053E304B04CE21B0000DA6C509FE500E0A0E301402D +S31A50004A4240E2001095E5002095E5010052E10300001A50309F53 +S31A50004A57E5002093E5010052E1FCFFFF0A09C2A0E300309CE540 +S31A50004A6C000053E30400000A012052E000309C45032082400250 +S31A50004A81E08EE0010000EA023061E003E08EE002005EE3EAFFA1 +S31A50004A96FFDA0030A0E10400A0E1000053E3E4FFFFCA30A81BD1 +S31A50004AABE9100000900DC0A0E100D82DE984309FE5002093E50B +S31A50004AC004B04CE2FF0812E31000A0130500001AFF0C12E308C3 +S31A50004AD500A0130200001AFF0012E31800A0030000A0135810DD +S31A50004AEA9FE558C09FE55230A0E1010013E30C00000A0B0050D6 +S31A50004AFFE30700001A003091E50C2003E05230A0E1010013E399 +S31A50004B140300001A010080E21B0050E3F9FFFF9A00A81BE9200B +S31A50004B290080E200A81BE9010080E2070010E3ECFFFF1A0000B2 +S31A50004B3EE0E300A81BE9000005901800049000F8FF0F0DC0A0E9 +S31A50004B53E100D82DE92A0050E30B00A0C314109FE50120A0E311 +S31A50004B68003091E504B04CE21230C3E1003081E500A81BE9042E +S31A50004B7D0005900DC0A0E100D82DE92A0050E30B00A0C314100D +S31A50004B929FE50120A0E3003091E504B04CE2123083E1003081B1 +S31A50004BA7E500A81BE9040005900DC0A0E100D82DE90B3040E2E0 +S31A50004BBC1F0053E304B04CE20400009A1F3000E20120A0E308DC +S31A50004BD1109FE51223A0E1002081E500A81BE9180004900DC084 +S31A50004BE6A0E100D82DE90B3040E21F0053E304B04CE23400002D +S31A50004BFB9A000051E31900000A000052E30B00000A1F1000E203 +S31A50004C10BC009FE50120A0E3003090E51221A0E1B0109FE502B6 +S31A50004C253083E1003080E5003091E5023083E1003081E500A881 +S31A50004C3A1BE91F1000E28C009FE50120A0E3003090E51221E08E +S31A50004C4FE180109FE5023003E0003080E5003091E5023003E0A0 +S31A50004C64003081E500A81BE9000052E30B00000A1F1000E254F4 +S31A50004C79009FE50120A0E3003090E51221A0E148109FE5023041 +S31A50004C8E83E1003080E5003091E50230C3E1003081E500A81BED +S31A50004CA3E91F1000E228009FE50120A0E3003090E51221A0E103 +S31A50004CB814109FE5023083E1003080E5003091E50230C3E10042 +S31A50004CCD3081E500A81BE910000490140004900DC0A0E110D8B8 +S31A50004CE22DE904B04CE260439FE5104F02EE0330A0E3103F03F1 +S31A50004CF7EE0400A0E10010A0E30129A0E3B21100EB0010A0E35E +S31A50004D0C052CA0E32000A0E302C0A0E3033B8CE30C3083E30150 +S31A50004D213A83E1023184E7010040E2011081E2012082E20000CF +S31A50004D3650E3F6FFFFCA8020A0E30210A0E10400A0E302C0A082 +S31A50004D4BE3033B8CE30C3083E3013A83E1023184E7010040E26B +S31A50004D60011081E2012082E2000050E3F6FFFFCA012CA0E3024C +S31A50004D7510A0E18000A0E3D0C29FE5013AA0E12C3683E1023174 +S31A50004D8A84E7010040E2011081E2012082E2000050E3F7FFFF0F +S31A50004D9FCA062DA0E30210A0E18000A0E3A0C29FE5013AA0E1F1 +S31A50004DB42C3683E1023184E7010040E2011081E2012082E20014 +S31A50004DC90050E3F7FFFFCA612FA0E30210A0E10100A0E370C231 +S31A50004DDE9FE5013AA0E12C3683E1023184E7010040E201108111 +S31A50004DF3E2012082E2000050E3F7FFFFCA622FA0E30210A0E155 +S31A50004E080100A0E340C29FE5013AA0E12C3683E1023184E70114 +S31A50004E1D0040E2011081E2012082E2000050E3F7FFFFCA632F8B +S31A50004E32A0E30210A0E10100A0E310C29FE5013AA0E12C368384 +S31A50004E47E1023184E7010040E2011081E2012082E2000050E332 +S31A50004E5CF7FFFFCA192EA0E30210A0E10400A0E3E0C19FE50122 +S31A50004E713AA0E12C3683E1023184E7010040E2011081E20120FF +S31A50004E8682E2000050E3F7FFFFCA652FA0E30210A0E10400A01D +S31A50004E9BE3B0C19FE5013AA0E12C3683E1023184E7010040E291 +S31A50004EB0011081E2012082E2000050E3F7FFFFCA022CA0E302F9 +S31A50004EC510A0E10200A0E180C19FE5013AA0E12C3683E10231F4 +S31A50004EDA84E7010040E2011081E2012082E2000050E3F7FFFFBE +S31A50004EEFCA032CA0E30210A0E1020CA0E350C19FE5013AA0E167 +S31A50004F042C3683E1023184E7010040E2011081E2012082E200C2 +S31A50004F190050E3F7FFFFCA012BA0E30210A0E18000A0E320C115 +S31A50004F2E9FE5013AA0E12C3683E1023184E7010040E2011081BF +S31A50004F43E2012082E2000050E3F7FFFFCA122DA0E30210A0E155 +S31A50004F588000A0E3F0C09FE5013AA0E12C3683E1023184E70196 +S31A50004F6D0040E2011081E2012082E2000050E3F7FFFFCA022B9F +S31A50004F82A0E30210A0E1010BA0E3C0C09FE5013AA0E12C36837A +S31A50004F97E1023184E7010040E2011081E2012082E2000050E3E1 +S31A50004FACF7FFFFCA031BA0E30020A0E32000A0E302C0A0E303AC +S31A50004FC13B8CE30C3083E3013A83E1023184E7010040E20110C8 +S31A50004FD681E2012082E2000050E3F6FFFFCA032BA0E30210A034 +S31A50004FEBE12000A0E302C0A0E3033B8CE3043083E3013A83E1AC +S31A50005000023184E7010040E2011081E2012082E2000050E3F662 +S31A50005015FFFFCA0E2CA0E30210A0E18000A0E302C0A0E3033B92 +S31A5000502A8CE30C3083E3013A83E1023184E7010040E201108118 +S31A5000503FE2012082E2000050E3F6FFFFCA10A81BE9004000C0F2 +S31A500050540020C0000DC0A0E100D82DE904B04CE21CC09FE50093 +S31A50005069309CE50030C3E1010000E0003083E100308CE512240B +S31A5000507EA0E3003082E500A81BE9600100000DC0A0E100D82D4D +S31A50005093E92C209FE5003092E528109FE5FF3F83E3003082E55B +S31A500050A8003091E504B04CE2FF3F83E3003081E5102042E2FF88 +S31A500050BD3FA0E3003082E500A81BE91C000490040004900DC06E +S31A500050D2A0E110D82DE90D40A0E110D09FE504B04CE20FE0A051 +S31A500050E7E100F0A0E104D0A0E110A81BE9FCFFFF010DC0A0E1B2 +S31A500050FC30D82DE9B0209FE5B0309FE504B04CE2001092E5000A +S31A5000511140A0E1005093E5000051E30600001A0130A0E3003072 +S31A5000512682E53500A0E30120A0E1E70C00EB3500A0E3E00C00DB +S31A5000513BEB0E33A0E3083084E5022CA0E30C2084E53E3383E29D +S31A50005150103084E50123A0E3142084E5033383E2183084E58338 +S31A5000516500A0E31C2084E53530A0E3203084E58010A0E3B6FF4E +S31A5000517AFFEB010515E30900001A34309FE5002093E50100122C +S31A5000518FE30200000A0430A0E3043084E530A81BE90130A0E3E2 +S31A500051A4043084E530A81BE90030A0E3043084E530A81BE9FCFF +S31A500051B983000000000490600100000DC0A0E100D82DE9243083 +S31A500051CE9FE5002093E504B04CE2010512E30200001A0130A090 +S31A500051E3E3043080E500A81BE90030A0E3043080E500A81BE941 +S31A500051F8000004900DC0A0E100D82DE9803260E0030180E00026 +S31A5000520D0180E014209FE50002A0E1483092E504B04CE20FE0DA +S31A50005222A0E103F0A0E100A81BE9500000000DC0A0E170D82D6D +S31A50005237E9040051E304B04CE24CD04DE20040A0E12900001ABA +S31A5000524C045094E5010055E32600001A8300A0E38110A0E37C1B +S31A50005261FFFFEB1E00A0E3E3FFFFEB8300A0E30310A0E30230BE +S31A50005276A0E3043084E50060A0E374FFFFEB0500A0E1DBFFFF0E +S31A5000528BEB8300A0E30330A0E3043084E50510A0E16DFFFFEB88 +S31A500052A00500A0E3D4FFFFEB020000EA0A00A0E3D1FFFFEB012A +S31A500052B56086E2090056E30C0000CA0400A0E12010A0E3003046 +S31A500052CAA0E360300BE560204BE200208DE55C304BE258204BBB +S31A500052DFE2361C00EB000050E3EFFFFF0A0430A0E3043084E5C7 +S31A500052F470A81BE90DC0A0E100D82DE93500A0E304B04CE26CF1 +S31A500053090C00EB00A81BE90DC0A0E1F0D82DE9E8209FE5E810E6 +S31A5000531E9FE5022061E004B04CE2E0709FE55CD04DE200409755 +S31A50005333E50400A0E1F10F00EB0E02A0E3021A80E2202090E4F5 +S31A50005348000031E1FCFFFF1A0000A0E3160F07EE9A0F07EE1089 +S31A5000535D1F11EE011AC1E3101F01EE0010A0E3151F07EE00002E +S31A50005372A0E10000A0E10000A0E10000A0E10000A0E10000A0AB +S31A50005387E150504BE20500A0E10FE0A0E104F0A0E1101F11EE74 +S31A5000539C011A81E3031081E3101F01EE0560A0E140404BE204FB +S31A500053B100A0E158109FE50320A0E3D91100EB000050E3140062 +S31A500053C6000A48009FE5791100EB3430A0E324308DE504E0A000 +S31A500053DBE10F00BEE80DC0A0E10F00ACE80F00BEE80F00ACE888 +S31A500053F000309EE500308CE50F0096E8B50F00EB0800A0E31522 +S31A500054050000EA28F5005060F40050C04401001C330150203349 +S31A5000541A01500532A0E3143087E530C0D5E52F10D5E52EE0D5E6 +S31A5000542FE52D20D5E50C1481E18134A0E10E2482E1012082E254 +S31A50005444083087E50114A0E10C2087E5910203E08330A0E1057C +S31A500054593283E2183087E5F0A81BE90DC0A0E110D82DE9543031 +S31A5000546E9FE504B04CE20040A0E1033004E0000053E30E000051 +S31A500054830A40009FE50410A0E1491100EB38309FE5033004E013 +S31A50005498000053E30100000A0400A0E310A81BE924009FE5007D +S31A500054AD0004E0000050E30200A0130800A00310A81BE903005E +S31A500054C2A0E110A81BE97E007E00403301501000100020002022 +S31A500054D7000DC0A0E100D82DE934309FE50020A0E3030050E16F +S31A500054EC04B04CE20100008A030051E10400008A1C309FE50352 +S31A500055010050E10200008A030051E10000009A0120A0E302000D +S31A50005516A0E100A81BE944000050F01F01500DC0A0E100D82DB6 +S31A5000552BE90C309FE50F0000E20000D3E704B04CE200A81BE933 +S31A500055404C3301500DC0A0E100D82DE920209FE5000092E504B5 +S31A50005555B04CE2000050E3010000CAE10800EB00A81BE900305F +S31A5000556AE0E3003082E500A81BE9188400000DC0A0E100D82DE1 +S31A5000557FE9FF0000E2613040E2050053E30010A0E104B04CE296 +S31A500055940100008A570040E200A81BE9302040E2FF3002E2096E +S31A500055A90053E30100008A0200A0E100A81BE9413040E205000F +S31A500055BE53E30100009A0000E0E300A81BE9370041E200A81B25 +S31A500055D3E90DC0A0E110D82DE90030A0E304B04CE214D04DE290 +S31A500055E814304BE524404BE21C000BE5D2FFFFEBFF0000E204A7 +S31A500055FD10A0E1020000EB010050E3F9FFFF1A10A81BE90DC0F7 +S31A50005612A0E170D82DE90140A0E11050D4E504B04CE20000553C +S31A50005627E30800001A240050E32800001A0130A0E31030C4E5DD +S31A5000563C0C5084E5005084E5023043E2043084E5210000EA0185 +S31A500056510055E31700001A230050E30600001A080094E50C1072 +S31A5000566694E50030A0E30130C0E70220A0E31020C4E516000041 +S31A5000567BEA0C1094E5020B51E30300001A0030A0E31030C4E54B +S31A500056900000E0E370A81BE9003094E5082094E5003083E000F3 +S31A500056A53084E50100C2E7013081E20C3084E5070000EA02002B +S31A500056BA55E30700001AFF0000E2ABFFFFEB0002A0E1040084AC +S31A500056CFE50330A0E31030C4E50000A0E370A81BE9030055E312 +S31A500056E42300001AFF0000E2A1FFFFEB043094E50020D4E5002D +S31A500056F93083E1043084E5030052E10200000A2D00A0E36908B2 +S31A5000570E00EBDCFFFFEA2B00A0E3660800EB082094E50230D2D5 +S31A50005723E53A0053E31000001A0000D2E50C6094E55F0800EBAE +S31A50005738083094E50100D3E55C0800EB0500A0E1060050E10789 +S31A5000574D00008A0210E0E3083094E50020D3E7033080E0010073 +S31A5000576280E20120C3E7060050E1F8FFFF9A0100A0E370A81B31 +S31A50005777E90000E0E30030A0E31030C4E570A81BE90DC0A0E115 +S31A5000578CF0D92DE904B04CE20070A0E168809FE52400A0E344A9 +S31A500057A10800EB0050A0E30540D7E70560A0E1050054E10700AD +S31A500057B6000A0400A0E13D0800EB016086E2043085E00640D74A +S31A500057CBE7FF5003E2000054E3F7FFFF1A2300A0E3350800EB44 +S31A500057E02502D8E7330800EB0F3005E20300D8E7300800EB52F5 +S31A500057F5FFFFEB7F0000E22B0050E3E5FFFF1AF0A91BE94C3388 +S31A5000580A01500DC0A0E1F0DF2DE990009FE50020A0E38C309F9D +S31A5000581FE504D04DE2002083E504B04CE2001090E503A0A0E123 +S31A50005834020051E14B0000DA0090A0E16C809FE56C309FE5000F +S31A500058492093E5000052E31900000A003090E554109FE5030074 +S31A5000585E53E30300009A003098E5030013E30440A00308000077 +S31A500058730A30209FE5003092E50140A0E3040053E10300009AAC +S31A50005888003091E5010013E30140A0130240A0032C004BE200E6 +S31A5000589D1091E50420A0E1A00A00EB070000EAC8B200001C84D5 +S31A500058B20000CCB20000D4B20000003098E50020D3E50140A021 +S31A500058C7E32C204BE500309AE5000053E32400001A03C0A0E1B0 +S31A500058DC04005CE1150000AA2C604BE270E09FE50A70A0E16C6D +S31A500058F1509FE50600DCE700109EE52032D5E70130C1E4002018 +S31A5000590697E500108EE5000052E31500001A0F3000E20320D5BA +S31A5000591BE70120C1E400309AE500108EE5000053E30E00001AE4 +S31A5000593001C08CE204005CE1EDFFFFBA002099E50900A0E100CF +S31A500059453098E5022064E0002089E5043083E0003088E5000022 +S31A5000595A52E3010000EAD0B200004C330150B5FFFFCAF0AF1B39 +S31A5000596FE90DC0A0E170D82DE904B04CE268C09FE500108CE529 +S31A5000598464109FE5000081E560009FE5002080E55C209FE500F1 +S31A500059990053E3003082E50C60A0E10A00000A4C409FE5005075 +S31A500059AEA0E3005084E5003094E593FFFFEB002094E5003094D0 +S31A500059C3E5050053E10200000A0500A0E170A81BE98CFFFFEB38 +S31A500059D8002096E50030A0E30030C2E5000096E570A81BE9D0D8 +S31A500059EDB20000CCB20000C8B20000D4B200001C8400000DC0B2 +S31A50005A02A0E1F0DF2DE924019FE524219FE504D04DE20070A04E +S31A50005A17E3007082E504B04CE2003090E50290A0E1070053E195 +S31A50005A2C5A0000DA04319FE5002093E50010D2E503A0A0E10798 +S31A50005A410051E15400000AF0809FE5F0109FE5003091E500004C +S31A50005A5653E31000000A003090E5030053E30300009A00309852 +S31A50005A6BE5030013E30450A0030A00000AB4209FE5003092E5E8 +S31A50005A800150A0E3050053E10500009A003098E5010013E3016A +S31A50005A9550A0130250A003000000EA0150A0E30040A0E3050028 +S31A50005AAA54E1170000AA84609FE5003096E50100D3E40030861A +S31A50005ABFE5ACFEFFEB0002A0E1003099E5FF7000E2000053E34B +S31A50005AD43000001A00309AE50100D3E400308AE5A3FEFFEB008C +S31A50005AE90087E1003099E5FF7000E2000053E32700001A2C3018 +S31A50005AFE4BE20370C4E7014084E2050054E1E8FFFFBA2C109F96 +S31A50005B13E5003091E5000053E30900000A2C004BE2001098E56D +S31A50005B280520A0E10C0A00EB060000EAC8B200001C840000CC95 +S31A50005B3DB20000D0B20000D4B20000003098E50070C3E500304E +S31A50005B5299E5000053E30F00001A30309FE5002093E50300A0EC +S31A50005B67E1003098E5022065E0002080E5053083E0003088E524 +S31A50005B7C000052E3050000DA00309AE50020D3E5000052E300EE +S31A50005B910000EAC8B20000ABFFFF1AF0AF1BE90DC0A0E170D849 +S31A50005BA62DE904B04CE25CC09FE500008CE558009FE50010801F +S31A50005BBBE554109FE5002081E550209FE5000053E3003082E56B +S31A50005BD00060A0E10A00000A40409FE50050A0E3005084E500E5 +S31A50005BE53094E584FFFFEB002094E5003094E5050053E10200C2 +S31A50005BFA000A0500A0E170A81BE97DFFFFEB000096E570A81B80 +S31A50005C0FE9CCB20000D0B20000C8B20000D4B200001C840000A1 +S31A50005C240DC0A0E100D82DE904B04CE2800800EB08209FE501D7 +S31A50005C3930A0E3003082E500A81BE9008400000DC0A0E170D8F0 +S31A50005C4E2DE904B04CE20060A0E30150A0E1006085E50040A094 +S31A50005C63E1060000EA003095E5016086E2002094E5033280E163 +S31A50005C78003085E5012082E2002084E5002094E50030D2E50099 +S31A50005C8D0053E30300000A0300A0E136FEFFEB000050E3F0FFA5 +S31A50005CA2FFAA0600A0E170A81BE90DC0A0E170D82DE904B04C9F +S31A50005CB7E202E0A0E10060A0E3004051E20400001A3030A0E3E6 +S31A50005CCC0130C0E40030C0E50200A0E370A81BE907308EE2007B +S31A50005CE10053E3073083B2C3E1B0E11300000A50509FE501102F +S31A50005CF64EE28131A0E134C3B0E10020A0030120A01301005E62 +S31A50005D0BE30030A0130130A003032092E10600000AFFC00CE240 +S31A50005D202C32D5E70130C0E40F200CE20230D5E7026086E20153 +S31A50005D3530C0E400E051E2ECFFFF1A0600A0E170A81BE94C33F6 +S31A50005D4A01500DC0A0E110D82DE90010A0E188309FE504B04C84 +S31A50005D5FE2002093E500E0A0E30E0052E11C0000DA74409FE58D +S31A50005D7400C094E50E005CE10300000A0100A0E30FE0A0E10C33 +S31A50005D89F0A0E100E0A0E101005EE30200001A50309FE500E09B +S31A50005D9EC3E510A81BE9003094E501007EE3000053130B0000BA +S31A50005DB31A38309FE5003093E5000053E30700000A0100A0E30C +S31A50005DC80FE0A0E103F0A0E1000050E30200000A18209FE50190 +S31A50005DDD30A0E30030C2E510A81BE9C4430100288400002084BD +S31A50005DF20000B8430100248400000DC0A0E110D82DE974409F03 +S31A50005E07E50030D4E504B04CE2000053E30B00000A64309FE51D +S31A50005E1C00C093E500005CE30700000A58309FE50000A0E30004 +S31A50005E312093E50010A0E10FE0A0E10CF0A0E10030A0E300300D +S31A50005E46C4E53C409FE50030D4E5000053E30800000A30309F18 +S31A50005E5BE5003093E5000053E30400000A0000A0E30FE0A0E118 +S31A50005E7003F0A0E10030A0E30030C4E510A81BE920840000283F +S31A50005E85840000C443010024840000B84301000DC0A0E170D8EC +S31A50005E9A2DE9B8209FE5003092E504B04CE2000053E30200006A +S31A50005EAF0A003092E50FE0A0E103F0A0E19C209FE5003092E50C +S31A50005EC4000053E30300000A0030A0E3003082E50250A0E3020F +S31A50005ED90000EAA32500EB902500EB0050A0E1AD2700EB000091 +S31A50005EEE50E30000000AB52700EBA52700EBBEFFFFEB87270039 +S31A50005F03EB0300A0E3AB0800EB0300A0E3790800EB48609FE506 +S31A50005F18000055E30600000A40409FE5003094E50500A0E10F94 +S31A50005F2DE0A0E103F0A0E1000050E3F9FFFF1A902700EB00301E +S31A50005F4296E5000053E30200000A003096E50FE0A0E103F0A089 +S31A50005F57E170A81BE914840000A8440100108400000484000041 +S31A50005F6C0DC0A0E1F0DD2DE904B04CE224D04DE20050A0E100C3 +S31A50005F8140A0E348604BE2F4A09FE500309AE50180A0E3000052 +S31A50005F9653E30500000A0400A0E10610A0E10FE0A0E103F0A03C +S31A50005FABE10080A0E1020000EA0400A0E12E0600EB48000BE5E1 +S31A50005FC00600A0E1103044E2070053E303E0A0E1017084E21100 +S31A50005FD500008A0840A0E30020A0E302C0A0E144004BE20010A5 +S31A50005FEAA0E1043082E2012082E203C0C1E7040052E1FAFFFF14 +S31A50005FFFBA0010A0E106C0A0E10320A0E30130DCE4012042E2C9 +S31A500060140130C1E4010072E3FAFFFF1A000058E30700000A0592 +S31A5000602910A0E107005EE30C20A0930420A0830030A0E34BFE91 +S31A5000603EFFEB0050A0E1100000EA0520A0E107005EE31730A06D +S31A50006053930730A083010073E37810A0E30300000A013043E230 +S31A500060680110C2E4010073E3FBFFFF1A07005EE30200009A08C0 +S31A5000607D5085E2010000EABC430100185085E20740A0E1190066 +S31A5000609254E3BCFFFFDAF0AD1BE90DC0A0E1F0D92DE904B04C0A +S31A500060A7E20CD04DE20040A0E31A70A0E30130D0E40180A0E1EA +S31A500060BC24000BE5500053E31700001A24004BE228104BE2DC1C +S31A500060D1FEFFEB040050E10800000A24201BE50130D2E4FF30DB +S31A500060E603E224200BE53D0053E30200001A28401BE50170844A +S31A500060FBE2090000EA74209FE50030D2E50810A0E1000053E397 +S31A500061102900000A0130C1E40130F2E5000053E3FBFFFF1A24A6 +S31A500061250000EA0450A0E1070055E1180000AA0060A0E32C1032 +S31A5000613A4BE2104045E2070054E32C600BE50C20A0930420A079 +S31A5000614F8324001BE50630A0E190FEFFEB2C101BE50500A0E14D +S31A50006164CB0500EB070054E30300009A24301BE5083083E20247 +S31A500061790000EA6033015024301BE5183083E2015085E22430E0 +S31A5000618E0BE5070055E1E7FFFFBA28209FE50030D2E50810A06F +S31A500061A3E1000053E30300000A0130C1E40130F2E5000053E359 +S31A500061B8FBFFFF1A0030A0E30030C1E5000000EA64330150F01E +S31A500061CDA91BE90DC0A0E1F0D82DE99C239FE504B04CE2C0D0D9 +S31A500061E24DE20040A0E10070A0E30030D4E50260A0E10070C271 +S31A500061F7E53F3043E2340053E303F19F970B0200EADC620050AB +S31A5000620C386A0050646300500869005090670050386A005038EC +S31A500062216A0050386A0050B4640050E0680050386A0050386AD2 +S31A500062360050386A0050386A005098650050386A0050386A00E8 +S31A5000624B50B46400504C630050386A005090670050F46800504C +S31A50006260386A0050386A0050386A005094650050386A0050388A +S31A500062756A0050386A0050386A0050386A0050386A0050386A9A +S31A5000628A0050386A0050386A0050B0690050906700501863004A +S31A5000629F50386A0050386A005058630050386A0050386A005071 +S31A500062B4386A0050BC680050386A0050C4640050386A00503885 +S31A500062C96A0050386A005040630050D868005090670050A3242D +S31A500062DE00EB902400EB5330A0E30030C6E50020A0E30320C65E +S31A500062F3E584129FE54032A0E10F3003E20320D1E70F0000E25E +S31A500063080030D1E70120C6E50230C6E5CB0100EA64129FE500E9 +S31A5000631D30D1E50620A0E1000053E3B001000A0130C2E401308F +S31A50006332F1E5000053E3FBFFFF1AAB0100EA010084E28B020057 +S31A50006347EBBE0100EA010084E2EE0200EBBB0100EA0600A0E1E8 +S31A5000635C02FFFFEBB80100EA0130D4E5000053E30A00001AFE06 +S31A500063710100EB0C129FE50030D1E50620A0E1000053E39901D6 +S31A50006386000A0130C2E40130F1E5000053E3FBFFFF1A940100E6 +S31A5000639BEAA4704BE2A0504BE2013084E2A0300BE50500A0E172 +S31A500063B00710A0E123FEFFEB000050E32400000AA0201BE501BD +S31A500063C530D2E4FF3003E2A0200BE52C0053E31E00001A050024 +S31A500063DAA0E1A8104BE218FEFFEB000050E31900000AA0201BC1 +S31A500063EFE50130D2E4FF3003E2A0200BE52C0053E31300001A24 +S31A50006404A4101BE5000051E30B00000AA8001BE5ED0100EB00AF +S31A500064191050E20300000AA0001BE5A4201BE50030A0E3DBFDDA +S31A5000642EFFEBA4201BE5A0301BE5823083E0A0300BE5A0201BD5 +S31A50006443E50030D2E52C0053E301308202D4FFFF0AA0301BE55F +S31A500064580020D3E5000052E30900001A1C119FE50030D1E5060C +S31A5000646D20A0E1000053E35D01000A0130C2E40130F1E50000A7 +S31A5000648253E3FBFFFF1A580100EAF8109FE50030D1E50620A0EB +S31A50006497E1000053E35301000A0130C2E40130F1E5000053E311 +S31A500064ACFBFFFF1A4E0100EA0400A0E10610A0E1F6FEFFEB60DF +S31A500064C10100EAAC504BE20500A0E1013084E2AC300BE5B010B3 +S31A500064D64BE2DAFDFFEB000050E31B00000AAC201BE50130D246 +S31A500064EBE4FF3003E2AC200BE52C0053E31500001A0500A0E17B +S31A50006500B4104BE2CFFDFFEB000050E31000000AB0001BE50686 +S31A5000651510A0E1B4201BE50130A0E312FDFFEB000050E346018F +S31A5000652A001A5C109FE50030D1E50620A0E1000053E32B01000D +S31A5000653F0A0130C2E40130F1E5000053E3FBFFFF1A260100EAAF +S31A5000655430109FE50030D1E50620A0E1000053E32101000A0128 +S31A5000656930C2E40130F1E5000053E3FBFFFF1A1C0100EAC8AA28 +S31A5000657E00004C3301501483000064330150683301506C3301D7 +S31A50006593500170A0E3B8504BE20500A0E1013084E2B8300BE52F +S31A500065A8BC104BE2A5FDFFEB000050E36B00000AB8201BE50182 +S31A500065BD30D2E4FF3003E2B8200BE52C0053E36500001A0500CB +S31A500065D2A0E1C0104BE29AFDFFEB000050E36000000AB8001BEF +S31A500065E7E50130D0E4FF3003E2B8000BE53A0053E35A00001ADF +S31A500065FC000057E33E00000AC0301BE5000053E32400000A9CC2 +S31A50006611504BE2C0301BE50040A0E3030054E11100002A051066 +S31A50006626A0E1B8201BE50130D2E40430C1E7FF3003E2B8200BF6 +S31A5000663BE57D0053E30300001A0130D2E4203083E30430C5E7C2 +S31A50006650B8200BE5014084E27F0054E30200008AC0301BE5033B +S31A500066650054E1EEFFFF3A0500A0E1BC101BE50420A0E1390738 +S31A5000667A00EB040050E10700001AC0201BE5BC301BE502206422 +S31A5000668FE0C0200BE5043083E0BC300BE5000052E3DBFFFF1A55 +S31A500066A4C0301BE5000053E30900001A58139FE50030D1E50667 +S31A500066B920A0E1000053E3CA00000A0130C2E40130F1E50000ED +S31A500066CE53E3FBFFFF1AC50000EA34139FE50030D1E50620A0F2 +S31A500066E3E1000053E3C000000A0130C2E40130F1E5000053E357 +S31A500066F8FBFFFF1ABB0000EABC101BE5C0201BE50130A0E323FC +S31A5000670DFDFFEB000050E30900000AF0129FE50030D1E5062062 +S31A50006722A0E1000053E3B000000A0130C2E40130F1E50000536A +S31A50006737E3FBFFFF1AAB0000EACC129FE50030D1E50620A0E17D +S31A5000674C000053E3A600000A0130C2E40130F1E5000053E3FBED +S31A50006761FFFF1AA10000EAA8129FE50030D1E50620A0E100005F +S31A5000677653E39C00000A0130C2E40130F1E5000053E3FBFFFFCF +S31A5000678B1A970000EA013084E2C4300BE5C4504BE20020D4E573 +S31A500067A00030A0E3C8300BE5530052E3430052130700001A059D +S31A500067B500A0E1C8104BE221FDFFEBC4201BE50030D2E53B00E5 +S31A500067CA53E301308202C4300B050500A0E1CC104BE219FDFFD1 +S31A500067DFEB000050E30100000ACC001BE5672300EB0300A0E35F +S31A500067F4700600EB0300A0E33E0600EBC8001BE5000050E30821 +S31A5000680900000A08229FE5003092E5000053E30400000A003051 +S31A5000681E92E50FE0A0E103F0A0E1000050E3C8000B05C8501B76 +S31A50006833E5000055E30300000A0900A0E3C8000BE5B40000EBED +S31A50006848800000EAB82500EB000050E30400000A6330A0E3005C +S31A5000685D30C4E5B8219FE5623043E2003082E50030D4E5530010 +S31A5000687253E3730053130600001A0500A0E131FDFFEB98219F96 +S31A50006887E598319FE5003082E5ED2400EB010000EA0100A0E372 +S31A5000689C2AFDFFEB0300A0E3440600EB0300A0E3120600EB1923 +S31A500068B10400EB0000E0E3650000EA160400EB64319FE500203D +S31A500068C693E50FE0A0E102F0A0E10100A0E35E0000EAA005009B +S31A500068DBEB590000EA010084E20610A0E14B2FA0E3D30200EB69 +S31A500068F0540000EA010084E20610A0E14B2FA0E3B80200EB4F10 +S31A500069050000EAD0004BE2013084E2D0300BE5D4104BE2CAFCE2 +S31A5000691AFFEB000050E31800000AD0201BE50130D2E4FF3003CA +S31A5000692FE2D0200BE52C0053E31200001A0130D2E4D0200BE5E6 +S31A50006944430053E30200001AD4001BE5E90600EB010000EAD4E6 +S31A50006959001BE5E10600EBA8109FE50030D1E50620A0E1000038 +S31A5000696E53E31E00000A0130C2E40130F1E5000053E3FBFFFF53 +S31A500069831A190000EAA0109FE50030D1E50620A0E1000053E395 +S31A500069981400000A0130C2E40130F1E5000053E3FBFFFF1A0F40 +S31A500069AD0000EAD8004BE2013084E2D8300BE5DC104BE2A0FC4C +S31A500069C2FFEB000050E30B00001A60109FE50030D1E50620A088 +S31A500069D7E1000053E30300000A0130C2E40130F1E5000053E31D +S31A500069ECFBFFFF1A0030A0E30030C2E5120000EA0C009FE560B7 +S31A50006A01FBFFEBDC001BE5CF0300EB0D0000EA643301506C332E +S31A50006A160150703301500C8400009886000034840000D0430156 +S31A50006A2B000884000068330150743301500400A0E10610A0E174 +S31A50006A404B2FA0E35B0600EB0600A0E14DFBFFEB0000A0E3F076 +S31A50006A55A81BE90DC0A0E110D82DE914409FE504B04CE2041010 +S31A50006A6AA0E1460500EB0400A0E143FBFFEB10A81BE9C8AA002F +S31A50006A7F000DC0A0E110D82DE938309FE5002093E504B04CE2FA +S31A50006A94000052E3000000AAEDFFFFEB24409FE50400A0E1C9AC +S31A50006AA9FAFFEB0400A0E1C6FDFFEB000050E3F9FFFF0A000038 +S31A50006ABEA0B30100A0A310A81BE918840000C8A200000DC0A0A7 +S31A50006AD3E100D82DE904B04CE200A81BE90DC0A0E100D82DE9BF +S31A50006AE804B04CE24CFCFFEBE80400EB2B00A0E36E0300EB004E +S31A50006AFDA81BE90DC0A0E100D82DE908309FE504B04CE20000A8 +S31A50006B1283E500A81BE9188400000DC0A0E100D82DE93C109F41 +S31A50006B27E55830A0E30030C1E50020A0E30320C1E504B04CE2EF +S31A50006B3C28C09FE54032A0E10F3003E20320DCE70F0000E20094 +S31A50006B5130DCE70120C1E50230C1E50100A0E108FBFFEB00A830 +S31A50006B661BE9C8AA00004C3301500DC0A0E100D82DE938209F4B +S31A50006B7BE538109FE50030E0E3003082E530309FE50020A0E3ED +S31A50006B90002081E5002083E524109FE524309FE5003081E50462 +S31A50006BA5B04CE21C209FE50130A0E3003082E500A81BE92CB311 +S31A50006BBA000028B30000D8B20000B0B3000030B300002C840015 +S31A50006BCF000DC0A0E130D82DE99C309FE504B04CE20040A0E1FC +S31A50006BE4002093E50150A0E1000052E30000001ADDFFFFEB12B5 +S31A50006BF90054E3070000CA78309FE578109FE5002093E503C096 +S31A50006C0EA0E1022061E0052082E0800052E30100009A0000A0C0 +S31A50006C23E330A81BE958E09FE500309EE5030054E10B00000A8B +S31A50006C384C009FE5003090E548109FE5030054E1030000BA01AA +S31A50006C4D2084E20030A0E3023181E7002080E500408EE50030A0 +S31A50006C629CE5043181E700309CE50300A0E1053083E000308C20 +S31A50006C77E530A81BE92C840000B0B3000030B300002CB300001C +S31A50006C8C28B30000D8B200000DC0A0E1F0DD2DE904B04CE20421 +S31A50006CA1D04DE20060A0E174009FE50150A0E1001090E5024017 +S31A50006CB6A0E168A09FE5000051E31300001A0130A0E3003080A1 +S31A50006CCBE558709FE558809FE50130A0E1031CA0E10800A0E3F4 +S31A50006CE003E1A0E101C083E28120A0E1073022E0000051E3032C +S31A50006CF520A0B10210A0E1010050E2F8FFFF1A0C30A0E10E2002 +S31A50006D0A88E7FF0053E3F0FFFF9A14709FE50030A0E300308A7D +S31A50006D1FE5080000EA308400001C840000B71DC104B4B30000DE +S31A50006D3425305BE5243C23E0032197E7016086E2044422E00146 +S31A50006D495045E2010075E30600000A25004BE20610A0E10120F5 +S31A50006D5EA0E3710500EB00309AE5000053E3F0FFFF0A0400A065 +S31A50006D73E1F0AD1BE90DC0A0E170D82DE968319FE504B04CE288 +S31A50006D880CD04DE21C000BE50020A0E30020C3E500C0A0E100DD +S31A50006D9D20DCE50350A0E1430052E33700001A0130DCE55200C9 +S31A50006DB253E33400001A0260DCE5430056E33100001A0330DCF9 +S31A50006DC7E53A0053E32E00001A1C404BE20400A0E104308CE214 +S31A50006DDC1C300BE520104BE297FBFFEB000050E34600000A1C98 +S31A50006DF1201BE50130D2E4FF3003E21C200BE52C0053E340004E +S31A50006E06001A0400A0E124104BE28CFBFFEB000050E33B000042 +S31A50006E1B0A20001BE524101BE50020E0E399FFFFEBC0309FE5D5 +S31A50006E30004093E50010A0E1000054E30B00000AB0209FE5000E +S31A50006E4530D2E50510A0E1000053E30300000A0130C1E401301B +S31A50006E5AF2E5000053E3FBFFFF1A0030A0E30030C1E5260000FE +S31A50006E6FEA010085E22020A0E38BFBFFEB0060C5E5010080E2C6 +S31A50006E840040C5E71F0000EA1C301BE50300A0E10120D0E44CBD +S31A50006E990052E30210A0E10600000A020000CA430052E30B0067 +S31A50006EAE000A110000EA500051E30400000A0E0000EA0510A035 +S31A50006EC3E14B2FA0E3C60100EB0E0000EA0510A0E14B2FA0E349 +S31A50006ED8040200EB0A0000EA0510A0E1022BA0E3110100EB0621 +S31A50006EED0000EAC8AA00001C840000683301500300A0E10510B9 +S31A50006F02A0E14B2FA0E3200500EB70A81BE90DC0A0E100D82D27 +S31A50006F17E90030D0E504B04CE2700053E30300001A18109FE5F0 +S31A50006F2C4B2FA0E3420100EB00A81BE908109FE54B2FA0E31773 +S31A50006F410500EB00A81BE9C8AA00000DC0A0E100D82DE9682013 +S31A50006F5680E2020050E104B04CE20300002A043091E4043080CF +S31A50006F6BE4020050E1FBFFFF3A00A81BE90DC0A0E100D82DE989 +S31A50006F804530A0E30130C0E43020A0E30120C0E4133043E201D8 +S31A50006F9530C0E404B04CE200A81BE90DC0A0E100D82DE94F3074 +S31A50006FAAA0E30130C0E44B20A0E30120C0E404B04CE200A81BCC +S31A50006FBFE90DC0A0E170D82DE904B04CE20060A0E10040A0E34C +S31A50006FD4005051E20700000A0100D6E4015045E263F9FFEB0045 +S31A50006FE94084E1000055E30432A0E10340A011F7FFFF1A0400A2 +S31A50006FFEA0E170A81BE90DC0A0E130D82DE904B04CE20050A04D +S31A50007013E10140A0E10210A0E3E7FFFFEB000084E5020085E238 +S31A5000702830A81BE90DC0A0E130D82DE904B04CE20050A0E10101 +S31A5000703D40A0E10810A0E3DDFFFFEB000084E5080085E230A816 +S31A500070521BE90DC0A0E100D82DE9FF0000E2613040E2050053A7 +S31A50007067E304B04CE20300008A573040E2003081E50100A0E3A9 +S31A5000707C00A81BE9413040E2050053E337304092F8FFFF9A3036 +S31A500070912040E2FF3002E2090053E30100009A0000A0E300A83A +S31A500070A61BE90100A0E3002081E500A81BE90DC0A0E110D82D62 +S31A500070BBE90040A0E10100D4E404B04CE2E1FFFFEB0400A0E1D6 +S31A500070D010A81BE90DC0A0E100D82DE904B04CE218C09FE5FF20 +S31A500070E53001E22322DCE70120C0E40F1001E20130DCE7013039 +S31A500070FAC0E400A81BE9783301500DC0A0E1F0D82DE904B04CB3 +S31A5000710FE204D04DE20040A0E10060A0E30170A0E120504BE2FD +S31A50007124030000EA20301BE5014084E20F3003E2066283E1002C +S31A5000713900D4E50510A0E1C3FFFFEB000050E3F6FFFF1A0400AB +S31A5000714EA0E1006087E5F0A81BE90DC0A0E1F0D82DE904B04CC1 +S31A50007163E20050A0E10170A0E1106085E2060055E10800002AD7 +S31A500071780100D5E4FDF8FFEB0040A0E10100D5E4FAF8FFEB04B8 +S31A5000718D0280E10100C7E4060055E1F6FFFF3A0500A0E1F0A800 +S31A500071A21BE90DC0A0E110D82DE904B04CE20140A0E1241CA0AE +S31A500071B7E1C5FFFFEB2418A0E1FF1001E2C2FFFFEB2414A0E1CB +S31A500071CCFF1001E2BFFFFFEBFF4004E20410A0E1BCFFFFEB104F +S31A500071E1A81BE90DC0A0E130D82DE904B04CE20150A0E1052052 +S31A500071F6A0E10130D2E40040A0E3040053E10300000A0130D2BB +S31A5000720BE4014084E2000053E3FBFFFF1AC80054E3C840A0A3FA +S31A50007220FF1004E2AAFFFFEB0430A0E1014044E2000053E30821 +S31A500072350000DA0420A0E10130D5E4014044E2230053E30000C5 +S31A5000724A53132A30A0030130C0E4000052E3F6FFFFCA30A81BBB +S31A5000725FE90DC0A0E130D82DE904B04CE20150A0E1104080E209 +S31A50007274040050E10300002A0110D5E493FFFFEB040050E1FBD7 +S31A50007289FFFF3A30A81BE90DC0A0E100D82DE90330A0E3002074 +S31A5000729EA0E304B04CE2013043E20120C0E4010073E3FBFFFFB5 +S31A500072B31A413CA0E10130C0E44128A0E10120C0E44134A0E1DE +S31A500072C80130C0E40010C0E500A81BE90DC0A0E100D82DE904E5 +S31A500072DD0080E20310A0E304B04CE200C0A0E30120A0E1011076 +S31A500072F241E20130D0E4000052E30CC483E1F9FFFFCA0C00A053 +S31A50007307E100A81BE90DC0A0E100D82DE90720A0E304B04CE2C6 +S31A5000731C0130D1E4012042E20130C0E4010072E3FAFFFF1A009E +S31A50007331A81BE90DC0A0E130D82DE904B04CE208D04DE20140AF +S31A50007346A0E11C504BE20500A0E11C1900EB000050E3090000E0 +S31A5000735B0A5130A0E30130C4E44320A0E30120C4E40500A0E1AB +S31A50007370D7FFFFEB0010A0E10400A0E188FFFFEB010000EA047C +S31A5000738500A0E1FAFEFFEB0040A0E10030A0E30030C4E530A815 +S31A5000739A1BE90DC0A0E110D82DE90010A0E104B04CE220D04D88 +S31A500073AFE218404BE20400A0E1B4FFFFEB0400A0E130104BE2F8 +S31A500073C4241900EB000050E30300000A28301BE50100A0E3001A +S31A500073D90053E30000001A0000A0E310A81BE90DC0A0E130D864 +S31A500073EE2DE904B04CE204D04DE20040A0E10150A0E118104B33 +S31A50007403E23EFFFFEB000054E10600000A18001BE5E0FFFFEBEF +S31A50007418000050E30200000A0500A0E1DDFEFFEB010000EA058F +S31A5000742D00A0E1D0FEFFEB0030A0E30030C0E530A81BE90DC08A +S31A50007442A0E130D82DE90030E0E304B04CE20CD04DE20120D06F +S31A50007457E40150A0E120300BE5670052E32100000A020000CA41 +S31A5000746C630052E30700000A2E0000EA700052E32C00001A20E9 +S31A50007481104BE20AFFFFEB1C104BE231FFFFEB2A0000EA0030B9 +S31A50007496D0E52D0053E30600001A0130D0E5310053E303000003 +S31A500074AB1A08219FE50030A0E3003082E5030000EAF8409FE5BC +S31A500074C00410A0E10EFFFFEB0420A0E1000092E5000050E30284 +S31A500074D500000AAFFFFFEB000050E31300000A0500A0E1ACFE2A +S31A500074EAFFEB120000EAC8409FE50410A0E101FFFFEB001094A2 +S31A500074FFE51C004BE261FFFFEB004094E5010074E30100000A8E +S31A50007514000054E30200001A0230A0E320300BE5050000EA01D4 +S31A5000752930A0E320300BE5020000EA0500A0E18EFEFFEB0050CC +S31A5000753EA0E120301BE5013083E2030053E303F19F971E0000FA +S31A50007553EADC7500506475005074750050B075005058209FE56F +S31A5000756858309FE5003082E5190000EA50409FE548109FE5041E +S31A5000757D00A0E171FEFFEB1C004BE21A10A0E30420A0E1C41852 +S31A5000759200EB000050E30C00000A20309FE5004083E50500A039 +S31A500075A7E17CFEFFEB090000EA0500A0E179FEFFEB060000EA6A +S31A500075BCC4430100C043010034840000D0430100404401000502 +S31A500075D100A0E167FEFFEB0050A0E10030A0E30030C5E530A849 +S31A500075E61BE90DC0A0E1F0DF2DE904B04CE208D04DE20160A019 +S31A500075FBE10070A0E32C104BE20240A0E1A9FEFFEB30104BE227 +S31A500076107BFEFFEB50509FE50510A0E1CDFEFFEB1A4044E204B9 +S31A500076259086E05130A0E30130C6E44D20A0E30120C6E4071053 +S31A5000763AA0E106A0A0E10A00A0E1A2FEFFEB0060A0E10680A021 +S31A5000764FE13030A0E30130C6E40510A0E10600A0E1FEFEFFEB2E +S31A500076640060A0E1080000EAB4B70000017087E20600A0E10418 +S31A5000767910A0E1F7FEFFEB0060A0E10500A0E10410A0E11EFF1D +S31A5000768EFFEB090056E10D00002A30301BE5030057E10A00008B +S31A500076A3AA3C409FE50510A0E12C001BE50420A0E1551800EB13 +S31A500076B80030A0E32C300BE5030050E1E9FFFF1A313083E2006D +S31A500076CD30C8E50A00A0E1FF1007E27DFEFFEB0030A0E30030AA +S31A500076E2C6E5000000EABCB70000F0AF1BE90DC0A0E130D82D0F +S31A500076F7E90030A0E304B04CE224D04DE22C300BE528300BE5F3 +S31A5000770C24300BE50150A0E120300BE538104BE242FEFFEB1C01 +S31A50007721404BE20410A0E18AFEFFEB0400A0E134404BE204104F +S31A50007736A0E1471800EB000050E33700000A7130A0E30130C58F +S31A5000774BE47020A0E30120C5E438101BE50500A0E190FEFFEBCC +S31A500077600410A0E1BDFEFFEB38301BE50050A0E1020013E3064D +S31A5000777500000A0210A0E388FEFFEB0210A0E352FEFFEB2C108F +S31A5000778A5BE550FEFFEB0050A0E138301BE5040013E3080000E1 +S31A5000779F0A28301BE5000053E30500000A0500A0E10410A0E3BB +S31A500077B47AFEFFEB28101BE588FEFFEB0050A0E138301BE5081F +S31A500077C90013E30800000A24301BE5000053E30500000A0500AF +S31A500077DEA0E10810A0E36EFEFFEB24101BE57CFEFFEB0050A046 +S31A500077F3E138301BE5100013E30B00000A20301BE5000053E341 +S31A500078080800000A0500A0E11010A0E362FEFFEB20101BE570F0 +S31A5000781DFEFFEB010000EA0500A0E1D2FDFFEB0050A0E10030ED +S31A50007832A0E30030C5E530A81BE90DC0A0E170D82DE904B04C06 +S31A50007847E208D04DE20040A0E120504BE20500A0E10160A0E127 +S31A5000785C0210A0E18AFEFFEB0500A0E10410A0E10620A0E11FDB +S31A500078711800EB70A81BE90DC0A0E100D82DE90C309FE5002071 +S31A5000788693E504B04CE2000192E700A81BE9348400000DC0A0F2 +S31A5000789BE100D82DE90C309FE5002093E504B04CE2001182E7FF +S31A500078B000A81BE9348400000DC0A0E100D82DE920309FE518E1 +S31A500078C52093E50010A0E1000092E5FF1001E20C3092E504B05F +S31A500078DA4CE20FE0A0E103F0A0E100A81BE9500000000DC0A0C8 +S31A500078EFE100D82DE91C309FE5182093E5000092E5103092E5B1 +S31A5000790404B04CE20FE0A0E103F0A0E1FF0000E200A81BE95075 +S31A500079190000000DC0A0E100D82DE91C309FE5182093E5000047 +S31A5000792E92E50810A0E3143092E504B04CE20FE0A0E103F0A03C +S31A50007943E100A81BE9500000000DC0A0E100D82DE924309FE5E8 +S31A5000795804B04CE218C093E500109CE50020A0E10100A0E114CA +S31A5000796D309CE50010A0E30FE0A0E103F0A0E100A81BE950008B +S31A5000798200000DC0A0E100D82DE9000050E304B04CE20F00003A +S31A500079970A70209FE5003092E5013043E2003082E5000053E39D +S31A500079AC160000CA0030A0E3003082E554209FE5183092E5008F +S31A500079C10093E5142093E50510A0E30FE0A0E102F0A0E100A814 +S31A500079D61BE930209FE5003092E5013083E2003082E501005346 +S31A500079EBE30600001A1C309FE5182093E5000092E5143092E57C +S31A50007A000410A0E30FE0A0E103F0A0E100A81BE93884000050E8 +S31A50007A150000000DC0A0E100D82DE91C309FE5182093E500004A +S31A50007A2A92E5103092E504B04CE20FE0A0E103F0A0E1FF0000FE +S31A50007A3FE200A81BE9500000000DC0A0E1F0DF2DE9FF1001E2D9 +S31A50007A540D0051E304B04CE208D04DE26C00000A68319FE568A2 +S31A50007A69219FE5000093E50010C2E70A0051E3010080E200003B +S31A50007A7E83E50390A0E10100000A640050E36100001A44319FF0 +S31A50007A93E5186093E500200FE100400FE1C04084E304F029E10E +S31A50007AA830200BE5000096E50C3096E52410A0E30FE0A0E103D7 +S31A50007ABDF0A0E1000096E54F80A0E30C3096E50810A0E10FE0E1 +S31A50007AD2A0E103F0A0E1002099E50070A0E3020057E117000072 +S31A50007AE7AAF0A09FE5E4209FE50730D2E72342DAE7000096E55D +S31A50007AFC0F3003E20350DAE70C3096E50410A0E10FE0A0E10328 +S31A50007B11F0A0E1000096E5017087E20C3096E50510A0E10FE007 +S31A50007B26A0E103F0A0E1044088E0FF8004E2055088E000309968 +S31A50007B3BE5FF8005E2030057E1E8FFFFBA000096E50C3096E587 +S31A50007B502310A0E30FE0A0E103F0A0E17C309FE5000096E5285D +S31A50007B6512D3E70C2096E50FE0A0E102F0A0E164209FE5000057 +S31A50007B7A96E50F3008E20310D2E70C3096E50FE0A0E103F0A076 +S31A50007B8FE1000096E5103096E50FE0A0E103F0A0E129004BE537 +S31A50007BA429305BE52B0053E30F00000A29004BE20110A0E37207 +S31A50007BB90300EB000050E30700001A29305BE52D0053E3EFFF35 +S31A50007BCEFF1AB5FFFFEA3C840000C4B70000500000008C33014B +S31A50007BE35028209FE50130A0E3443082E50020A0E3002089E55B +S31A50007BF830201BE500300FE1C04002E2C030C3E3043083E1039D +S31A50007C0DF029E1000000EA50000000F0AF1BE90DC0A0E170D89F +S31A50007C222DE904B04CE20160A0E10240A0E10430A0E101404420 +S31A50007C37E2000053E30050A0E10600000A0110D6E40500A0E198 +S31A50007C4C7DFFFFEB0430A0E1014044E2000053E3F8FFFF1A7095 +S31A50007C61A81BE90DC0A0E170D82DE904B04CE20160A0E102405A +S31A50007C76A0E10430A0E1014044E2000053E30050A0E1060000F9 +S31A50007C8B0A0500A0E160FFFFEB0430A0E1014044E20100C6E4EE +S31A50007CA0000053E3F8FFFF1A70A81BE90DC0A0E10E002DE900A5 +S31A50007CB5D82DE90000A0E310B04CE200A81BE90DC0A0E170D8C3 +S31A50007CCA2DE90000A0E304B04CE22AFFFFEBB4C09FE5B4509F26 +S31A50007CDFE5B4E09FE5B4609FE50020A0E3B0109FE50C40A0E1F1 +S31A50007CF4000091E5023190E702318CE7012082E20A0052E3FAA1 +S31A50007D09FFFFDA001091E52C3091E52C308CE5402091E53020EC +S31A50007D1E8CE5303091E534308CE5342091E538208CE538309152 +S31A50007D33E53C308CE50000A0E33C3091E51C208CE20C10A0E177 +S31A50007D4864308CE5400082E5042042E2010052E1FBFFFFAA0005 +S31A50007D5D309EE5004085E5000053E30400000A0030A0E3003037 +S31A50007D728EE50F00A0E3BEFEFFEB222000EB0F00A0E3BBFEFF84 +S31A50007D87EB1F2000EB000086E570A81BE9D04301003484000029 +S31A50007D9C98860000A8440100384401000DC0A0E100D82DE904B4 +S31A50007DB1B04CE260109FE50000A0E301E0A0E158C09FE50020F4 +S31A50007DC69EE500319CE7003182E7010080E20A0050E3F9FFFFEA +S31A50007DDBDA001091E52C309CE52C3081E530209CE5402081E5A7 +S31A50007DF034309CE5303081E538209CE5342081E53C309CE538C5 +S31A50007E053081E564209CE53C2081E50100A0E3DAFEFFEB00A8C7 +S31A50007E1A1BE938440100D04301000DC0A0E100D82DE90000A08C +S31A50007E2FE304B04CE200A81BE90DC0A0E100D82DE930209FE567 +S31A50007E4430309FE530109FE5003082E52C309FE52C209FE500E4 +S31A50007E593081E528309FE528109FE5003082E524309FE504B06D +S31A50007E6E4CE2003081E500A81BE90C840000247E00500884002B +S31A50007E8300607F005014840000C47C005010840000A87D005034 +S31A50007E980DC0A0E170D82DE99C209FE5006092E504B04CE200DA +S31A50007EAD0056E32200001A0130A0E3003082E584509FE50C2125 +S31A50007EC200EB343095E50000E0E30FE0A0E103F0A0E10040A005 +S31A50007ED7E1343095E50200E0E30FE0A0E103F0A0E1141095E53A +S31A50007EEC58309FE558209FE5043081E554309FE5082081E50CE7 +S31A50007F013081E54C209FE54C309FE5102081E5143081E502004D +S31A50007F1674E3000054130300000A343095E50400A0E10FE0A043 +S31A50007F2BE103F0A0E1303095E50600A0E10FE0A0E103F0A0E151 +S31A50007F4070A81BE940840000500000001C7C0050647C00504846 +S31A50007F557A0050187A0050AC7C00500DC0A0E100D82DE9183019 +S31A50007F6A9FE5403093E504B04CE2000053E30100000A0FE0A08E +S31A50007F7FE103F0A0E100A81BE9500000000DC0A0E1F0D92DE919 +S31A50007F945430A0E304B04CE20CD04DE20160A0E10680A0E100A5 +S31A50007FA950A0E32C500BE50040A0E10130C8E44402A0E158F57C +S31A50007FBEFFEB0100C6E5018088E20400A0E154F5FFEB0100C856 +S31A50007FD3E47430A0E30130C8E46820A0E30120C8E4023043E22C +S31A50007FE80130C8E4032042E20120C8E4113043E20130C8E401F9 +S31A50007FFD2042E20120C8E43A60A0E30160C8E4561600EB00C0C7 +S31A50008012A0E124004BE24C3CA0E124304BE54C28A0E123204B21 +S31A50008027E50810A0E121C04BE54C34A0E122304BE50420A0E335 +S31A5000803C0530A0E14AF6FFEB0080A0E13B40A0E30140C8E40508 +S31A5000805100A0E132F5FFEB0100C8E40F00A0E32FF5FFEB0100E4 +S31A50008066C8E40160C8E40F00A0E300FEFFEB0810A0E10420A01F +S31A5000807BE30530A0E128000BE528704BE20700A0E137F6FFEB85 +S31A500080900080A0E12C004BE20810A0E10520A0E10530A0E13105 +S31A500080A5F6FFEB0080A0E10140C8E40500A0E11AF5FFEB010022 +S31A500080BAC8E40D00A0E317F5FFEB0100C8E40160C8E40D00A0C2 +S31A500080CFE3E8FDFFEB0810A0E10420A0E328000BE50530A0E186 +S31A500080E40700A0E120F6FFEB0080A0E10140C8E40050C8E5F0CE +S31A500080F9A91BE90DC0A0E100D82DE904B04CE2030050E300F12A +S31A5000810E9F97250000EAAC81005024810050388100506881005D +S31A5000812350101F11EE011A81E3031081E3101F01EE1C0000EA59 +S31A50008138101F11EE011AC1E3101F01EE0010A0E3151F07EE0015 +S31A5000814D00A0E10000A0E10000A0E10000A0E10000A0E1000042 +S31A50008162A0E1100000EA0E02A0E3021A80E2202090E400003141 +S31A50008177E1FCFFFF1A0000A0E3160F07EE9A0F07EE0010A0E3DA +S31A5000818C151F07EE151F08EE0000A0E10000A0E10000A0E100B2 +S31A500081A100A0E10000A0E10000A0E1100F11EE2006A0E101002A +S31A500081B600E200A81BE90DC0A0E100D82DE904B04CE20300505F +S31A500081CBE300F19F97150000EA2C820050E4810050F4810050C8 +S31A500081E00C820050101F11EE0F1081E3101F01EE0D0000EA1080 +S31A500081F51F11EE0C10C1E3101F01EE0010A0E3161F07EE07005F +S31A5000820A00EA0E02A0E3021A80E2202090E4000031E1FCFFFF4E +S31A5000821F1A0000A0E3160F07EE9A0F07EE100F11EE2001A0E1DF +S31A50008234010000E200A81BE90DC0A0E170D82DE9D0209FE5D060 +S31A50008249409FE504B04CE2CCC09FE50130A0E300308CE5C430CB +S31A5000825E9FE50260A0E1003082E50C50A0E1003094E504C0A0CD +S31A50008273E1000053E32200000A04E0A0E100309EE5030053E30C +S31A500082880900009A030011E30700001A030010E30500001A04B7 +S31A5000829D3090E4043081E400209EE5042042E200208EE51100AA +S31A500082B200EA00309CE5010053E30900009A010011E3070000F0 +S31A500082C71A010010E30500001AB230D0E0B230C1E000309CE559 +S31A500082DC023043E200308CE5040000EA0120D0E40120C1E400B6 +S31A500082F1309EE5013043E200308EE5003094E5000053E3DDFFBB +S31A50008306FF1A0030A0E3003085E50030A0E3003086E570A81B25 +S31A5000831BE94484000028B800001C840000108300500DC0A0E195 +S31A5000833030D82DE90030A0E10100A0E10310A0E118409FE5021F +S31A5000834550A0E1005084E504B04CE2B9FFFFEB000094E5050041 +S31A5000835A60E030A81BE928B800000DC0A0E130D82DE918409F59 +S31A5000836FE50250A0E1005084E504B04CE2AEFFFFEB000094E540 +S31A50008384050060E030A81BE928B800000DC0A0E100D82DE90051 +S31A5000839900A0E304B04CE200A81BE90DC0A0E100D82DE900002C +S31A500083AEA0E304B04CE200A81BE90DC0A0E100D82DE90000A077 +S31A500083C3E304B04CE200A81BE90DC0A0E130D82DE904B04CE290 +S31A500083D868C09FE500309CE5000053E31600000A0C50A0E100AA +S31A500083ED000FE100400FE1C04084E304F029E100C095E5143022 +S31A500084029CE5003085E518109CE50020A0E318208CE500300FC0 +S31A50008417E1C04000E2C030C3E3043083E103F029E100009CE58B +S31A5000842C10209CE50FE0A0E10CF09CE5003095E5000053E3E97E +S31A50008441FFFF1A30A81BE92CB800000DC0A0E100D82DE904B008 +S31A500084564CE20C209FE5003092E5013083E2003082E500A81B46 +S31A5000846BE9AC4401000DC0A0E110D82DE904B04CE234409FE5A6 +S31A50008480003094E5010053E30000001ACEFFFFEB0030A0E3002D +S31A500084953084E51C309FE5002093E5000052E30200000A013009 +S31A500084AAA0E3003084E5F2FFFFEA10A81BE9AC4401002CB800E0 +S31A500084BF000DC0A0E100D82DE904B04CE2B7F1FFEB00A81BE9F6 +S31A500084D40DC0A0E100D82DE904B04CE2BFF1FFEB00A81BE90DCC +S31A500084E9C0A0E100D82DE90100A0E304B04CE200A81BE90DC01A +S31A500084FEA0E100D82DE90100A0E304B04CE200A81BE90DC0A025 +S31A50008513E100D82DE904B04CE23EF1FFEB00A81BE90DC0A0E139 +S31A5000852810D82DE904B04CE200300FE100400FE1C04084E3044D +S31A5000853DF029E108209FE50130A0E3003082E5FEFFFFEA0000FC +S31A50008552039010A81BE90DC0A0E100D82DE904B04CE2EEFFFF65 +S31A50008567EB0000A0E300A81BE90DC0A0E100D82DE90000A0E3D0 +S31A5000857C04B04CE200A81BE90DC0A0E170D82DE904B04CE20078 +S31A5000859140A0E10000A0E30160A0E30010A0E1020074E30D0060 +S31A500085A6000A020000CA030074E30F00000A100000EA010074B2 +S31A500085BBE30E00001ABC309FE5003093E5000053E3016043E276 +S31A500085D00B0000CA0360A0E10260E003080000EAA0309FE59864 +S31A500085E5209FE5180083E5004082E5030000EA0040A0E10000B2 +S31A500085FA00EA014084E20110A0E3000051E31B00000A74509F35 +S31A5000860FE5183095E5000053E30400000A000093E5143093E5E1 +S31A500086240410A0E30FE0A0E103F0A0E154309FE548209FE584F8 +S31A500086393283E0183085E5004082E5183095E5000050E30500EE +S31A5000864E000A000093E5143093E50510A0E30FE0A0E103F0A0E8 +S31A50008663E1040000EA000093E5143093E50410A0E30FE0A0E1A2 +S31A5000867803F0A0E10600A0E170A81BE948840000500000003034 +S31A5000868DB800000DC0A0E100D82DE90010A0E304B04CE201C058 +S31A500086A2A0E3020070E30D00000A020000CA030070E30F00004D +S31A500086B70A100000EA010070E30E00001A64309FE5003093E518 +S31A500086CC000053E301C043E20B0000CA03C0A0E102C0E0030861 +S31A500086E10000EA48309FE540209FE5141083E5000082E503006E +S31A500086F600EA0100A0E1000000EA010080E20110A0E30000517B +S31A5000870BE30500000A18309FE51C209FE5000083E510309FE559 +S31A50008720802282E0142083E50C00A0E100A81BE94C84000050F5 +S31A5000873500000030B800000DC0A0E100D82DE904B04CE200A82B +S31A5000874A1BE90DC0A0E100D82DE904B04CE200A81BE90DC0A089 +S31A5000875FE100D82DE904B04CE2E21E00EB00A81BE90DC0A0E119 +S31A5000877410D82DE9FF1000E254309FE504B04CE2142093E50312 +S31A5000878940A0E1000052E30400000A000092E50C3092E50FE068 +S31A5000879EA0E103F0A0E1040000EA182094E5000092E50C309297 +S31A500087B3E50FE0A0E103F0A0E1443094E5000053E30200000A63 +S31A500087C80000A0E3440084E57B0000EB10A81BE9500000000D97 +S31A500087DDC0A0E100D82DE904B04CE200A81BE90DC0A0E110D83E +S31A500087F22DE90030A0E350209FE504B04CE204D04DE214300B2B +S31A50008807E518E092E500309EE50020A0E10300A0E10130A0E128 +S31A5000881C18C09EE514104BE20FE0A0E10CF0A0E114301BE50014 +S31A5000883140A0E1000053E30200000A10309FE5000093E55E003F +S31A5000884600EB0400A0E1010000EA50000000B044010010A81B54 +S31A5000885BE90DC0A0E1F0D82DE9E8009FE5E8609FE50020A0E3C2 +S31A50008870E4509FE504B04CE2E0709FE50510A0E10231A0E101E4 +S31A500088852082E2030081E73F0052E3FAFFFFDAC8C09FE5003017 +S31A5000889AA0E3B0009FE5011083E28332A0E10720A0E303008CD7 +S31A500088AFE7012052E2043083E2FBFFFF5A0130A0E1020053E34C +S31A500088C4F5FFFFDA98209FE51330A0E3003085E5042085E58CC6 +S31A500088D9309FE58C209FE5083085E5402085E584309FE5842008 +S31A500088EE9FE5103085E5482085E57C309FE5306085E578209FBE +S31A50008903E5347085E5203085E50140E0E31C2085E50400A0E12D +S31A500089180FE0A0E106F0A0E10400A0E10FE0A0E107F0A0E100A0 +S31A5000892D30A0E3243085E5283085E54C3085E5443085E53C00AC +S31A5000894285E2981300EB34309FE58C3085E5F0A81BE97085002E +S31A500089575084850050500000009086005030B8000004800000EA +S31A5000896C200000002485005058850050108500503C8700504C16 +S31A5000898187005090FE00500DC0A0E100D82DE9000051E304B0B2 +S31A500089964CE20700000A011041E20130D0E7030053E3010000E1 +S31A500089AB1A0100A0E300A81BE9000051E3F7FFFF1A0000A0E351 +S31A500089C000A81BE90DC0A0E100D82DE9000050E31C109FE5047D +S31A500089D5B04CE23810901514309FE58C2093E50100A0E10FE00F +S31A500089EAA0E102F0A0E100A81BE9F0890050500000000DC0A0FC +S31A500089FFE130D82DE950309FE504B04CE20150A0E1182093E5A6 +S31A50008A140610A0E300C092E50040A0E1143092E50C00A0E10F0F +S31A50008A29E0A0E103F0A0E1000054E10400001A0400A0E1051020 +S31A50008A3EA0E169FFFFEB000050E30200001A0400A0E10510A071 +S31A50008A53E1BAEFFFEB30A81BE9500000000DC0A0E110D82DE9CC +S31A50008A68FF0000E204B04CE20040A0E10A0054E30100001A0DB6 +S31A50008A7D00A0E33AFFFFEB0400A0E138FFFFEB10A81BE90DC0B9 +S31A50008A92A0E110D82DE90040A0E10030D4E504B04CE20000531B +S31A50008AA7E30400000A0000D4E5EAFFFFEB0130F4E5000053E3A7 +S31A50008ABCFAFFFF1A10A81BE90DC0A0E100D82DE90030A0E31082 +S31A50008AD110A0E32B20A0E304D04DE200308DE504B04CE244000E +S31A50008AE600EB00A81BE90DC0A0E1F0DF2DE904B04CE224D04D38 +S31A50008AFBE20150A0E10040A0E129104BE24C300BE548A04BE2B4 +S31A50008B1004309BE50A00A0E1000053E32090A0033090A01301BE +S31A50008B259041E4000051E1FCFFFFAA0080A0E3053094E10300AA +S31A50008B3A001A3030A0E348304BE5018088E2150000EA05309478 +S31A50008B4FE11300000A0260A0E10070A0E30510A0E10400A0E1CC +S31A50008B640730A0E10620A0E1BB2300EB68309FE50010D3E70890 +S31A50008B7910CAE70730A0E10620A0E10510A0E10400A0E10180D5 +S31A50008B8E88E24F2200EB0150A0E10040A0E1053094E1EDFFFF8E +S31A50008BA31A08309BE5080053E10380A0A14C301BE52D0053E3B6 +S31A50008BB80600001A013048E20320DAE7090052E10380A0014C47 +S31A50008BCD301BE50830CAE7050000EA018048E2030000EAA033CA +S31A50008BE201500800DAE7018048E29BFFFFEB000058E3FAFFFFAC +S31A50008BF7AAF0AF1BE90DC0A0E100D82DE908D04DE200308DE5E1 +S31A50008C0C04B04CE204309BE501C0A0E104308DE50010A0E302EA +S31A50008C2130A0E10C20A0E1AFFFFFEB00A81BE90DC0A0E100D820 +S31A50008C362DE9000050E304B04CE201C0A0E31500000A0010A095 +S31A50008C4BE10030D1E5000053E31000000A44E09FE5013060E08E +S31A50008C600E0053E10020D1E500C0A0A30D0052E30A00521302DB +S31A50008C7500000A203042E25E0053E300C0A083011081E200002B +S31A50008C8A5CE30200000A0030D1E5000053E3EFFFFF1A0C00A065 +S31A50008C9FE100A81BE9010100000DC0A0E1F0DF2DE904B04CE2C6 +S31A50008CB40CD04DE20060A0E12C100BE5DAFFFFEB004050E217F1 +S31A50008CC901001AA4039FE56EFFFFEB0600A0E179FFFFEB98031F +S31A50008CDE9FE56AFFFFEB2000A0E35CFFFFEB2C301BE504019378 +S31A50008CF3E772FFFFEB014084E2070054E3F7FFFFDA74039FE525 +S31A50008D0860FFFFEB090100EA0040D6E5250054E30200000A045C +S31A50008D1D00A0E14EFFFFEBFF0000EA0070A0E32BC0A0E30140A8 +S31A50008D32F6E50710A0E1300054E30090A0130190A003303044E1 +S31A50008D47E2090053E30600008A073187E0833084E00140F6E53E +S31A50008D5C307043E2302044E2090052E3F8FFFF9A6C0054E303FD +S31A50008D7100001A0140F6E56C0054E30110A0030140F605253079 +S31A50008D8644E2530053E303F19F97E00000EA0C91005018910049 +S31A50008D9B50189100501891005018910050189100501891005040 +S31A50008DB018910050189100501891005018910050189100501863 +S31A50008DC5910050189100501891005018910050189100501891D5 +S31A50008DDA00501891005018910050189100501891005018910051 +S31A50008DEF501891005018910050189100501891005018910050EC +S31A50008E0418910050DC900050988F0050E48E0050189100501804 +S31A50008E1991005018910050189100501891005018910050189180 +S31A50008E2E005018910050189100501891005018910050189100FC +S31A50008E43501891005018910050B48F00501891005018910050FD +S31A50008E581891005018910050408F005018910050189100501894 +S31A50008E6D9100501891005018910050189100501891005018912C +S31A50008E82005018910050DC900050988F0050E48E00501891009E +S31A50008E9750189100501891005018910050189100501891005043 +S31A50008EAC18910050189100501891005018910050189100501866 +S31A50008EC19100501891005018910050B48F00501891005018913E +S31A50008ED600501891005018910050408F0050000051E30B000091 +S31A50008EEB0A2C301BE50300B3E82C300BE5000051E3020000AAEC +S31A50008F00000070E20010E1E22DC0A0E30A20A0E300908DE50CB6 +S31A50008F1530A0E1100000EA2C301BE5040093E42C300BE5000023 +S31A50008F2A50E3000060B22DC0A0B30A10A0E30C20A0E1100000FD +S31A50008F3FEA000051E30900000A00908DE50C30A0E12CC01BE5EB +S31A50008F540300BCE82CC00BE51020A0E304708DE5016086E2DFEE +S31A50008F69FEFFEB6E0000EA0C20A0E12CC01BE504009CE4101020 +S31A50008F7EA0E32CC00BE50930A0E100708DE5016086E219FFFFAD +S31A50008F93EB640000EA2C301BE50000D3E5043083E22C300BE541 +S31A50008FA8016086E2ABFEFFEB5D0000EA0050A0E32CC01BE505F7 +S31A50008FBD80A0E104409CE405A0A0E12CC00BE5050054E1AC405C +S31A50008FD29F050C00000A0400A0E113FFFFEB000050E3080000BE +S31A50008FE71A98009FE50A90A0E1A6FEFFEB0400A0E1B1FEFFEB22 +S31A50008FFC193047E2190057E30370A0C17C409FE50530D4E70140 +S31A500090116086E2000053E30300000A015085E20530D4E7000041 +S31A5000902653E3FBFFFF1A000057E3070055110750A0C1000059DE +S31A5000903BE30780651007A065000830A0E1018048E2000053E345 +S31A5000905001704AE2050000DA2000A0E37FFEFFEB0830A0E10175 +S31A500090658048E2000053E3F9FFFFCA0030D4E5080000EAB4333D +S31A5000907A0150CC330150D0330150D4330150DC330150F03301BA +S31A5000908F500000D4E571FEFFEB0130F4E5000053E30200000AC8 +S31A500090A4015045E2010075E3F7FFFF1A0A30A0E107A0A0E1009E +S31A500090B90053E31A0000DA2000A0E365FEFFEB0A30A0E101A0D6 +S31A500090CE4AE2000053E3F9FFFFCA130000EA000057E32C301B66 +S31A500090E3E5014047121F40A003005093E55534A0E1010013E3D8 +S31A500090F82E00A0033100A01356FEFFEB014044E2F8FFFFEA25AE +S31A5000910D00A0E352FEFFEB030000EA2500A0E34FFEFFEB04006A +S31A50009122A0E14DFEFFEB016086E20030D6E5000053E3F5FEFF50 +S31A500091371AF0AF1BE90DC0A0E10F002DE900D82DE914B04CE2BD +S31A5000914C20D04DE208309BE50C209BE504009BE52C300BE5283D +S31A50009161200BE510309BE514209BE524300BE520200BE5183063 +S31A500091769BE51C209BE51C300BE518200BE520309BE524209B3F +S31A5000918BE514300BE510200BE52C104BE2C2FEFFEB00A81BE981 +S31A500091A00DC0A0E1F0DF2DE904B04CE20060A0E1060051E10630 +S31A500091B57041800170A091000057E30290A0E13B0000DA00001A +S31A500091CA59E30300000AE4009FE5061069E0D7FFFFEB02000068 +S31A500091DFEAD4009FE50610A0E1D3FFFFEB0050A0E3108047E204 +S31A500091F410A086E2070055E1030000AAB8009FE50510D6E7CB35 +S31A50009209FFFFEB010000EAAC009FE5C8FFFFEBC54FA0E105307B +S31A5000921E64E00130C3E3053063E0010053E30100001A90009FD1 +S31A50009233E5C0FFFFEBA43EA0E1033085E00730C3E3053063E0F2 +S31A50009248070053E30100001A70009FE5B8FFFFEB015085E20F07 +S31A5000925D0055E3E4FFFFDA60009FE5B3FFFFEB0050A0E3070058 +S31A5000927255E1040000AA0510D6E7203041E25E0053E32E10A0F6 +S31A5000928783000000EA2010A0E338009FE5A8FFFFEB015085E257 +S31A5000929C0F0055E3F2FFFFDA28009FE5A3FFFFEB0A60A0E10033 +S31A500092B17058E2C3FFFFCAF0AF1BE9F4330150FC33015004344A +S31A500092C60150083401500C34015010340150143401500DC0A033 +S31A500092DBE100D82DE90020A0E304B04CE2ACFFFFEB00A81BE993 +S31A500092F00DC0A0E100D82DE904B04CE216FDFFEB00A81BE90D3F +S31A50009305C0A0E100D82DE904B04CE202C0A0E100E0A0E1030045 +S31A5000931A5CE30200009A003081E1030013E30A00000A0C30A092 +S31A5000932FE101C04CE2000053E30500000A0C20A0E10130D1E42B +S31A5000934401C04CE20130CEE4000052E3F9FFFF1A00A81BE900FA +S31A50009359E0A0E10F005CE30E00009A043091E404308EE40420DF +S31A5000936E91E404208EE4043091E404308EE4042091E410C04C85 +S31A50009383E204208EE40F005CE3F4FFFF8A020000EA043091E4A8 +S31A5000939804C04CE204308EE403005CE3FAFFFF8A0C30A0E10150 +S31A500093ADC04CE2000053E30500000A0C20A0E10130D1E401C0CE +S31A500093C24CE20130CEE4000052E3F9FFFF1A00A81BE90DC0A0D0 +S31A500093D7E100D82DE9030052E304B04CE200C0A0E10100009A66 +S31A500093EC030010E30900000A0230A0E1012042E2000053E304DB +S31A5000940100000A0230A0E1012042E20110CCE4000053E3FAFF0E +S31A50009416FF1A00A81BE900C0A0E1FF1001E2013481E10338839E +S31A5000942BE10F0052E30900009A04308CE404308CE404308CE422 +S31A50009440102042E204308CE40F0052E3F8FFFF8A010000EA0416 +S31A500094552042E204308CE4030052E3FBFFFF8A0C30A0E100004C +S31A5000946A52E30200000A0110C3E4012052E2FCFFFF1A00A81B72 +S31A5000947FE90DC0A0E1F0DF2DE904B04CE250D04DE20170A0E143 +S31A5000949478404BE200A0A0E3005050E20260A0E10380A0E104F8 +S31A500094A990A0E10300001A3030A0E378304BE577404BE2090082 +S31A500094BE00EA0500A0E10610A0E19A2200EB0030D8E70610A0F0 +S31A500094D3E10130C4E40500A0E1392100EB005050E2F5FFFF1A1A +S31A500094E8090054E10500000A0920A0E1013074E501A08AE2018A +S31A500094FD30C7E4020054E1FAFFFF1A0A00A0E10030A0E3003072 +S31A50009512C7E5F0AF1BE90DC0A0E1F0DF2DE904B04CE234D04D39 +S31A50009527E24C200BE50180A0E148204BE250200BE50060A0E3C1 +S31A5000953C0140D8E40070A0E158600BE5060054E1FE00000A25C6 +S31A500095510054E3ED00001A0030A0E354300BE50140D8E40350FA +S31A50009566A0E12D0054E30200001A0120A0E354200BE50140D878 +S31A5000957BE4300054E30200001A0140D8E40190A0E3060000EA1D +S31A500095900390A0E1040000EA053185E08330A0E1303043E20416 +S31A500095A55083E00140D8E4303044E2090053E3F7FFFF9A2E0029 +S31A500095BA54E30600001A0140D8E4019089E2000000EA0140D8F3 +S31A500095CFE4303044E2090053E3FBFFFF9A00A0A0E36C0054E32F +S31A500095E40140D804584044E2200054E304F19F97720000EA9CC7 +S31A500095F9960050C4970050C4970050C4970050C4970050C4971A +S31A5000960E0050C4970050C4970050C4970050C4970050C497009A +S31A5000962350A09700509C960050C4970050C4970050C497005082 +S31A50009638C4970050C4970050C4970050C4970050C4970050C4AC +S31A5000964D970050C4970050C49700507C960050C4970050C4970D +S31A50009662005080970050C4970050C4970050C4970050C497008A +S31A50009677509C9600503000A0E30FE0A0E107F0A0E17800A0E320 +S31A5000968C0FE0A0E107F0A0E10190A0E30850A0E34C301BE5041C +S31A500096A10093E44C300BE5200054E304F19F972F0000EA6097E9 +S31A500096B600507497005074970050749700507497005074970082 +S31A500096CB5074970050749700507497005074970050749700501D +S31A500096E074970050389700507497005074970050749700507420 +S31A500096F5970050749700507497005074970050749700507497AC +S31A5000970A0050749700507497005054970050749700507497004D +S31A5000971F507497005074970050749700507497005074970050C8 +S31A5000973454970050000050E32DA0A0B3000060B248104BE2B4F1 +S31A50009749319FE50A20A0E3050000EA48104BE2A8319FE5010081 +S31A5000975E00EA48104BE2A0319FE51020A0E343FFFFEB58000B9A +S31A50009773E548204BE250200BE5140000EA4C301BE5042093E49C +S31A5000978850200BE54C300BE50200A0E19C0000EB58000BE50C4C +S31A5000979D0000EA4C301BE5043083E24C300BE5016086E2040029 +S31A500097B253E5019088E20FE0A0E107F0A0E15D0000EA3F00A00B +S31A500097C7E30FE0A0E107F0A0E1016086E258201BE5055062E094 +S31A500097DC00005AE301504512000059E30800000A3040A0E300FC +S31A500097F1005AE30600000A0A00A0E10FE0A0E107F0A0E10160EC +S31A5000980686E200A0A0E3000000EA2040A0E358201BE50190880E +S31A5000981BE254301BE5012042E25C200BE5000053E30800001A73 +S31A50009830030000EA0400A0E10FE0A0E107F0A0E1016086E205A5 +S31A5000984530A0E1015045E2000053E3F7FFFFCA00005AE303005A +S31A5000985A000A0A00A0E10FE0A0E107F0A0E1016086E25C201BC6 +S31A5000986FE558301BE50F0000EA50301BE50140D3E4016086E2E7 +S31A5000988450300BE50400A0E10FE0A0E107F0A0E10A0054E30358 +S31A5000989900001A0D00A0E30FE0A0E107F0A0E1016086E2583081 +S31A500098AE1BE50320A0E1012042E258200BE5000053E3ECFFFFDE +S31A500098C3CA54301BE5000053E31A00000A0530A0E1015045E264 +S31A500098D8000053E3160000DA2000A0E30FE0A0E107F0A0E10173 +S31A500098ED6086E20530A0E1015045E2000053E3F7FFFFCA0D0018 +S31A5000990200EA1834015024340150383401500400A0E10FE0A0F9 +S31A50009917E107F0A0E1016086E20A0054E3019088E20300001A6A +S31A5000992C0D00A0E30FE0A0E107F0A0E1016086E20040D8E50989 +S31A5000994180A0E1000054E300FFFF1A0600A0E1F0AF1BE90DC074 +S31A50009956A0E100D82DE918309FE5002093E50100C2E40010A07C +S31A5000996BE3002083E504B04CE20010C2E500A81BE990B8000099 +S31A500099800DC0A0E10E002DE900D82DE918309FE5000083E510D8 +S31A50009995B04CE204109BE50C009FE508208BE2DBFEFFEB01000C +S31A500099AA00EA90B800005499005000A81BE90DC0A0E10F002DAD +S31A500099BFE900D82DE910009FE514B04CE204109BE508208BE2B7 +S31A500099D4CFFEFFEB000000EA409C005000A81BE90DC0A0E10061 +S31A500099E9D82DE90030A0E10120A0E10310A0E108009FE504B0FE +S31A500099FE4CE2C4FEFFEB00A81BE9409C00500DC0A0E100D82DF9 +S31A50009A13E90020A0E3000050E304B04CE20600000A0130D0E452 +S31A50009A28020053E10300000A0130D0E4012082E2000053E3FBF5 +S31A50009A3DFFFF1A0200A0E100A81BE90DC0A0E100D82DE901300A +S31A50009A52D1E40020A0E10100D2E404B04CE2030050E105000081 +S31A50009A671A000050E30400000A0100D2E40130D1E4030050E168 +S31A50009A7CF9FFFF0A000063E000A81BE90DC0A0E100D82DE90152 +S31A50009A9130D1E40020A0E1000053E304B04CE20300000A01308E +S31A50009AA6C0E40130D1E4000053E3FBFFFF1A0030A0E30030C0DF +S31A50009ABBE50200A0E100A81BE90DC0A0E100D82DE900E0A0E18F +S31A50009AD00120DEE404B04CE2020000EA000050E30F00000A012D +S31A50009AE520DEE401C0D1E4200082E2FF0000E2413042E21900AB +S31A50009AFA53E30200A08120308CE2FF2003E241304CE2190053DB +S31A50009B0FE30C30A0810230A091030050E1EEFFFF0A000063E0DB +S31A50009B2400A81BE90DC0A0E100D82DE9000052E304B04CE200D7 +S31A50009B39C0A0E10300001A0200A0E100A81BE9000063E000A849 +S31A50009B4E1BE90100DCE40130D1E4030050E1F9FFFF1A0000506C +S31A50009B63E30100000A012052E2F7FFFF1A0000A0E300A81BE916 +S31A50009B780DC0A0E110D82DE9000052E304B04CE20040A0E10559 +S31A50009B8D00001A0200A0E110A81BE9000063E010A81BE90120F4 +S31A50009BA252E21000000A01C0D4E401E0D1E420008CE2FF00006E +S31A50009BB7E241304CE2190053E30C00A08120308EE2FFC003E2E2 +S31A50009BCC41304EE2190053E30E30A0810C30A091030050E1EC52 +S31A50009BE1FFFF1A000050E3ECFFFF1A0000A0E310A81BE90DC0BE +S31A50009BF6A0E100D82DE904B04CE202C0A0E1070000EA0120D08E +S31A50009C0BE40130D1E4030052E10300000A013050E5010051E544 +S31A50009C20030060E000A81BE90C30A0E101C04CE2000053E3F315 +S31A50009C35FFFF1A0000A0E300A81BE90DC0A0E1F0D92DE9BC3064 +S31A50009C4A9FE504B04CE2004093E5FF6000E2000054E319000000 +S31A50009C5F1AA8309FE50000E0E30380A0E1342093E50850A0E1B8 +S31A50009C740FE0A0E102F0A0E10070A0E1343095E50400A0E10F3F +S31A50009C89E0A0E103F0A0E1143095E5000093E5014084E20C3082 +S31A50009C9E93E50610A0E10FE0A0E103F0A0E1000054E3F2FFFF41 +S31A50009CB3DA343098E50700A0E10FE0A0E103F0A0E1F0A91BE982 +S31A50009CC840209FE5143092E5000053E30500000A000093E50CC9 +S31A50009CDD3093E50610A0E10FE0A0E103F0A0E1F0A91BE9183014 +S31A50009CF292E5000093E50C3093E50610A0E10FE0A0E103F0A0CA +S31A50009D07E1F0A91BE9F0440100500000000DC0A0E110D82DE9A2 +S31A50009D1C30209FE504B04CE2143092E50040A0E1000053E3056F +S31A50009D3100000A000093E5103093E50FE0A0E103F0A0E10000A9 +S31A50009D46C4E510A81BE9183092E5F7FFFFEA500000000DC0A0F2 +S31A50009D5BE1F0DF2DE9E8309FE504B04CE20060A0E1004093E5C0 +S31A50009D700390A0E1000054E31E00001AD0309FE50000E0E303BB +S31A50009D8570A0E1342093E507A0A0E10FE0A0E102F0A0E100802B +S31A50009D9AA0E1343097E50400A0E10FE0A0E103F0A0E1143097B9 +S31A50009DAFE5000093E51C3093E50610A0E10FE0A0E103F0A0E1AD +S31A50009DC4005050E20200000A0030D6E5000053E30C00001A015E +S31A50009DD94084E2000054E3EDFFFFDA34309AE50800A0E10FE022 +S31A50009DEEA0E103F0A0E1130000EA54209FE5143092E500005312 +S31A50009E03E30800000A080000EA0130A0E3003089E5302097E5EF +S31A50009E180400A0E10FE0A0E102F0A0E10500A0E1F0AF1BE91836 +S31A50009E2D3092E5000093E51C3093E50610A0E10FE0A0E103F0ED +S31A50009E42A0E10050A0E10500A0E1F0AF1BE9F0440100500000B5 +S31A50009E57000DC0A0E1F0D92DE9D8309FE504B04CE2004093E54D +S31A50009E6C0060A0E1000054E31C00001AC4309FE50000E0E303FF +S31A50009E8180A0E1342093E50850A0E10FE0A0E102F0A0E100707D +S31A50009E96A0E1343095E50400A0E10FE0A0E103F0A0E114C09530 +S31A50009EABE500005CE30500000A00009CE50710A0E314309CE539 +S31A50009EC00620A0E10FE0A0E103F0A0E1014084E2000054E3EFDF +S31A50009ED5FFFFDA343098E50700A0E10FE0A0E103F0A0E10A00F3 +S31A50009EEA00EA50309FE514C093E50380A0E100005CE30500008B +S31A50009EFF0A00009CE50710A0E314309CE50620A0E10FE0A0E1F7 +S31A50009F1403F0A0E118C098E500005CE30500000A00009CE50743 +S31A50009F2910A0E314309CE50620A0E10FE0A0E103F0A0E1F0A951 +S31A50009F3E1BE9F0440100500000000DC0A0E1F0DD2DE904B04CFE +S31A50009F53E204D04DE20250A0E10060A0E10640A0E10070A0E350 +S31A50009F68F0819FE5002098E5000052E30600000A0030D2E500D0 +S31A50009F7D0053E30300000A0130D2E425304BE5002088E5160027 +S31A50009F9200EA060054E10030A0130130A003000055E30030A080 +S31A50009FA7D3000053E30D00000A0500A0E1A7FFFFEB000000EA2F +S31A50009FBC325045E2000055E3030000DA25004BE261FFFFEB00E0 +S31A50009FD17050E2F8FFFF0A000057E30300001A0000E0E3610008 +S31A50009FE600EA25004BE248FFFFEB25205BE50030A0E30D00520C +S31A50009FFBE30030C4E50200A0E11B00000A080000CA080050E38A +S31A5000A0103300000A020000CA030050E30C00000A430000EA0A59 +S31A5000A0250050E31200000A400000EA2B0050E33900000A0200B4 +S31A5000A03A00CA240050E33600000A3A0000EA7F0050E324000060 +S31A5000A04F0A370000EA060054E10300001A00019FE554FEFFEB62 +S31A5000A0640100E0E3400000EA0100C4E4F0A09FE5360000EA25A1 +S31A5000A079205BE5E4A09FE50A0052E30200001A0030DAE50D00BD +S31A5000A08E53E30400000A0D0052E30500001A0030DAE50A005376 +S31A5000A0A3E30200001A0030A0E325304BE5270000EAB0309FE5A6 +S31A5000A0B8002093E5000052E30300000A0D00A0E3DCFEFFEB0A05 +S31A5000A0CD00A0E3DAFEFFEB25305BE50030CAE50100A0E32200C9 +S31A5000A0E200EA7CA09FE5060054E11800000A74309FE500209351 +S31A5000A0F7E5000052E30500000A0800A0E3CDFEFFEB2000A0E3F2 +S31A5000A10CCBFEFFEB0800A0E3C9FEFFEB014044E20C0000EA0696 +S31A5000A1210054E10200001A74F2FFEB0000A0E30E0000EA303057 +S31A5000A1369FE5002093E5000052E30000000ABDFEFFEB25305B0E +S31A5000A14BE514A09FE50130C4E425305BE50030CAE582FFFFEAD5 +S31A5000A160944501004C340150508400008C450100F0AD1BE90D95 +S31A5000A175C0A0E1F0DF2DE904B04CE204D04DE20170A0E107007B +S31A5000A18A52E1078042800280A091000058E32C300BE50060A0B4 +S31A5000A19FE14D0000DA2C301BE5000053E30400000AD0009FE559 +S31A5000A1B4071063E00FE0A0E106F0A0E1030000EABC009FE507CB +S31A5000A1C910A0E10FE0A0E106F0A0E10050A0E310A048E2109066 +S31A5000A1DE87E2080055E1040000AA9C009FE50510D7E70FE0A03F +S31A5000A1F3E106F0A0E1020000EA8C009FE50FE0A0E106F0A0E1C6 +S31A5000A208C54FA0E1053064E00130C3E3053063E0010053E30255 +S31A5000A21D00001A6C009FE50FE0A0E106F0A0E1A43EA0E103304F +S31A5000A23285E00730C3E3053063E0070053E30200001A48009FC7 +S31A5000A247E50FE0A0E106F0A0E1015085E20F0055E3E0FFFFDA29 +S31A5000A25C34009FE50FE0A0E106F0A0E10050A0E3080055E109DE +S31A5000A2710000AA0510D7E7203041E25E0053E32E10A083050098 +S31A5000A28600EA503401505C34015064340150683401506C340156 +S31A5000A29B502010A0E328009FE50FE0A0E106F0A0E1015085E20A +S31A5000A2B00F0055E3ECFFFFDA14009FE50FE0A0E106F0A0E109B0 +S31A5000A2C570A0E100805AE2010000EA7034015074340150B1FFF8 +S31A5000A2DAFFCAF0AF1BE90DC0A0E100D82DE90230A0E104B04CBE +S31A5000A2EFE201C0A0E10010A0E108009FE50C20A0E19BFFFFEB92 +S31A5000A30400A81BE9B89900500DC0A0E100D82DE90020A0E304BE +S31A5000A319B04CE2EFFFFFEB00A81BE90DC0A0E10F002DE930D8FC +S31A5000A32E2DE914B04CE208D04DE248409FE504009BE500509441 +S31A5000A343E508108BE2A5FDFFEB38009FE598FDFFEB1C004BE235 +S31A5000A3580020A0E3002084E50810A0E3F7FEFFEB1C305BE5590F +S31A5000A36D0053E30000A0130100A003790053E30100A003005055 +S31A5000A38284E5010000EA944501007834015030A81BE90DC0A0FC +S31A5000A397E100D82DE928309FE5FA0FA0E3482093E504B04CE262 +S31A5000A3AC0FE0A0E102F0A0E114109FE5003091E5013083E2037C +S31A5000A3C100A0E1003081E500A81BE950000000548400000DC079 +S31A5000A3D6A0E110D82DE90030D0E504B04CE2FF0053E30A000097 +S31A5000A3EB1A0130D0E5FF0053E30700001A0230D0E5FF0053E395 +S31A5000A4000400001A0330D0E5FF0053E30100001A0100A0E31007 +S31A5000A415A81BE94C409FE50420A0E30410A0E1F2FDFFEB00000B +S31A5000A42A50E3F7FFFF0A0030D4E5000053E30900001A0130D44E +S31A5000A43FE5000053E30600001A0230D4E5000053E30300001A39 +S31A5000A4540330D4E50100A0E3000053E30000000A0000A0E3105A +S31A5000A469A81BE9588400000DC0A0E1F0D82DE904B04CE20CD016 +S31A5000A47E4DE20050A0E1044095E50160A0E1100084E2CFFFFF90 +S31A5000A493EB000050E30700000A0400A0E10010D4E50020A0E33E +S31A5000A4A80F1001E20111A0E1E60000EB0008B0E10200000A0539 +S31A5000A4BD00A0E1D40000EB2D0000EA28704BE20700A0E10C1074 +S31A5000A4D284E20420A0E389FBFFEB24004BE20610A0E10620A0F6 +S31A5000A4E7E385FBFFEB0030D4E5B200D4E10F3003E20361A0E164 +S31A5000A4FC700100EB000066E0BC00C5E10930D4E5060053E30CB7 +S31A5000A51100000A020000CA010053E30300000A140000EA1100B6 +S31A5000A52653E30C00000A110000EA0500A0E1063084E0083085A6 +S31A5000A53BE50710A0E17C0100EB0D0000EA0500A0E1063084E0B9 +S31A5000A550083085E50710A0E1FD0200EB070000EA0500A0E106FF +S31A5000A5653084E0083085E50710A0E1AB1700EB010000EA050020 +S31A5000A57AA0E1A50000EBF0A81BE90DC0A0E1F0DF2DE90060A096 +S31A5000A58FE1083086E2080113E8038048E004B04CE2045096E580 +S31A5000A5A44801A0E1BC30D6E10F0000E2083083E0BC30C6E14080 +S31A5000A5B90080E30000C5E50070A0E30170C5E501A0A0E1BC003E +S31A5000A5CED6E10290A0E13A0100EB80409FE5B200C5E1B000D412 +S31A5000A5E3E1360100EBB400C5E1B030D4E16C109FE5013083E285 +S31A5000A5F8B030C4E1B670C5E14030A0E30830C5E509A0C5E5047B +S31A5000A60D20A0E3BA70C5E10C0085E239FBFFEB100085E209104E +S31A5000A622A0E10420A0E335FBFFEB0500A0E10810A0E10720A0A5 +S31A5000A637E1840000EB0008A0E12008A0E11E0100EB041089E2AD +S31A5000A64CBA00C5E1022BA0E30600A0E1F00000EBF0AF1BE994FA +S31A5000A661B80000588400000DC0A0E1F0D82DE97C209FE500307E +S31A5000A67692E504B04CE2000053E31A00001A03E0A0E10130A081 +S31A5000A68BE3003082E50E40A0E15C709FE504C0A0E158509FE55A +S31A5000A6A003E0A0E354609FE50500A0E1001096E507208CE0020B +S31A5000A6B53002E2022083E05ECE8CE2103085E2042083E70CC006 +S31A5000A6CA8CE2001080E501E05EE228309FE50010A0E1BE30C006 +S31A5000A6DFE1144084E2140081E2F0FFFF5A001086E5F0A81BE99F +S31A5000A6F468840000E8B8000098B8000098D00000EA0500000DBB +S31A5000A709C0A0E1F0DD2DE904B04CE20CD04DE20060A0E3605041 +S31A5000A71E9FE50670A0E15CA09FE50580A0E1BE30D5E10A00A081 +S31A5000A733E1BCE0D5E10610A0E1004095E5016086E200308DE5CC +S31A5000A74810C088E207309CE70520A0E104E08DE5145085E208E3 +S31A5000A75D408DE5147087E293FCFFEB030056E3EEFFFFDA143033 +S31A5000A7729FE514009FE5001093E58DFCFFEB030000EA98B80028 +S31A5000A787009034015098D00000BC340150F0AD1BE90DC0A0E1BA +S31A5000A79C00D82DE960309FE504B04CE200C093E500005CE312E5 +S31A5000A7B100000A00209CE5002083E510309CE504308CE5401054 +S31A5000A7C69FE5143083E208308CE538E09FE50030A0E3BC30CC4B +S31A5000A7DBE1003091E52C209FE5013083E2003081E5001092E509 +S31A5000A7F000009EE5033061E0000053E100308EC50C00A0E100C3 +S31A5000A805A81BE998D00000608400005C840000648400000DC05B +S31A5000A81AA0E100D82DE920209FE5003092E51C109FE5013043D5 +S31A5000A82FE2003082E5003091E5003080E504B04CE2000081E5C2 +S31A5000A84400A81BE96084000098D000000DC0A0E100D82DE90273 +S31A5000A8591051E204B04CE202C0A0E10300004AB230D0E002103B +S31A5000A86E51E203C08CE0FBFFFF5A010071E30500001A0030D056 +S31A5000A883E5FF20CEE302E083E1FFECCEE30E38A0E123C88CE0B5 +S31A5000A8980C08A0E12C28A0E130109FE520C882E00C3061E0015F +S31A5000A8AD005CE103C0A0C10C00E0E10008A0E12E0880E160E8AA +S31A5000A8C2A0E1200CA0E10008A0E10E0C80E12008A0E100A81B8D +S31A5000A8D7E9FFFF00000DC0A0E100D82DE90020A0E304D04DE24D +S31A5000A8ECBC30D0E104B04CE210204BE50910D0E50F104BE5BE47 +S31A5000A90120D0E1B011D0E1B2C1D0E1023083E0013083E0B0218A +S31A5000A9165BE10C3083E0B200D0E1023083E0000083E000A81BDD +S31A5000A92BE90DC0A0E110D82DE904B04CE210D04DE2B8009FE55F +S31A5000A94094FFFFEB004050E20300001AAC009FE518FCFFEB6B07 +S31A5000A955FFFFEBFEFFFFEA101094E594209FE520004BE24C0A54 +S31A5000A96A00EBBC00C4E10008B0E12600000A84209FE500309283 +S31A5000A97FE5B4015BE1013083E2003082E54C0000EB020B50E3F3 +S31A5000A9940500000A68309FE5030050E10C00000A0400A0E19AC4 +S31A5000A9A9FFFFEBE2FFFFEA54309FE5002093E5101094E5012036 +S31A5000A9BE82E2002083E5041084E50400A0E11A104BE2A6FEFF46 +S31A5000A9D3EBD8FFFFEA30309FE5002093E5101094E5012082E2D4 +S31A5000A9E8002083E5041084E50400A0E1E60300EBCFFFFFEAEA05 +S31A5000A9FD050000CC34015074840000060800006C8400007084AF +S31A5000AA1200000400A0E17EFFFFEB10A81BE90DC0A0E170D82D6E +S31A5000AA27E904B04CE210D04DE20050A0E128604BE20600A0E1DD +S31A5000AA3C0240A0E10620A0E32EFAFFEB22004BE238109FE50610 +S31A5000AA5120A0E32AFAFFEB0448A0E12408A0E1170000EBBC01B0 +S31A5000AA664BE1101095E5BC20D5E10600A0E18C0900EB10209F57 +S31A5000AA7BE5003092E5013083E2003082E5010000EAE0440100A7 +S31A5000AA907884000070A81BE90DC0A0E1203CA0E1003C83E1FF79 +S31A5000AAA52800E200D82DE9FF0C00E20004A0E1220480E1000055 +S31A5000AABA83E104B04CE200A81BE90DC0A0E100D82DE90008A05B +S31A5000AACFE1FF3800E2200CA0E1230480E104B04CE200A81BE95F +S31A5000AAE40DC0A0E100D82DE920209FE5003092E504B04CE2007E +S31A5000AAF90053E30200001A000082E50300A0E100A81BE9000009 +S31A5000AB0EE0E300A81BE99CD000000DC0A0E100D82DE90030A0F5 +S31A5000AB23E308209FE504B04CE2003082E500A81BE99CD00000A7 +S31A5000AB380DC0A0E130D82DE90040A0E1080094E504B04CE2B072 +S31A5000AB4D30D0E10150A0E1080053E31700001ABC10D4E10020DA +S31A5000AB62A0E339FFFFEB0008A0E120C8B0E11100001A083094EA +S31A5000AB77E500C0C3E5082094E5B2C0C2E1080094E5BC10D4E16E +S31A5000AB8C0C20A0E12EFFFFEB0008A0E12008A0E1C8FFFFEB08AF +S31A5000ABA13094E50110A0E3B200C3E10520A0E10400A0E172FE1B +S31A5000ABB6FFEB070000EA24309FE5003093E5000053E3030000A0 +S31A5000ABCB0A0400A0E10510A0E10FE0A0E103F0A0E10400A0E191 +S31A5000ABE00CFFFFEB30A81BE99CD000000DC0A0E1F0DF2DE90496 +S31A5000ABF5B04CE204D04DE20060A0E10140A0E1307086E20480E5 +S31A5000AC0A97E5020014E3085097E50290A0E10F00000A1830A082 +S31A5000AC1FE3BC30C7E10C30D5E550019FE59030C3E3603083E32C +S31A5000AC340C30C5E596FFFFEB2C104BE22C000BE50420A0E31410 +S31A5000AC490085E2ACF9FFEB0030A0E3B831C6E1060000EAB8318E +S31A5000AC5ED6E1143083E2BC30C7E10C20D5E5A020C2E35020825A +S31A5000AC73E30C20C5E50C30D5E50F30C3E30C30C5E5580096E529 +S31A5000AC8882FFFFEB040085E5540096E57FFFFFEB0030A0E3B0EE +S31A5000AC9D31C5E1000059E3080085E508A086E21800001AB401D0 +S31A5000ACB2D6E182FFFFEBB000C5E1B601D6E17FFFFFEBB200C572 +S31A5000ACC7E10D40C5E5B831D6E1000053E3083084130D30C5158E +S31A5000ACDCA0009FE577FFFFEBBE00C5E1B291C5E10420A0E39005 +S31A5000ACF1109FE50C0088E281F9FFEB100088E20A10A0E1042051 +S31A5000AD06A0E37DF9FFEB0630A0E30930C8E5BC00D7E169FFFF85 +S31A5000AD1BEBB200C8E1BC40D7E10800A0E1EBFEFFEB0020A0E1D6 +S31A5000AD300500A0E10410A0E1C4FEFFEB0008A0E12008A0E15E61 +S31A5000AD45FFFFEB0610A0E3B001C5E10A20A0E10700A0E109FE90 +S31A5000AD5AFFEB043096E50A0053E30A00001A1C109FE51C00863F +S31A5000AD6FE218209FE50630A0E1B20200EB110000EAB2050402CD +S31A5000AD84B205000058840000C0D4010094AF00500D30D5E503AF +S31A5000AD990013E30200001AB831D6E1000053E30600000A1C003B +S31A5000ADAE86E2FA1FA0E308209FE50630A0E1A10200EB00000045 +S31A5000ADC3EA78AF0050F0AF1BE90DC0A0E1F0DF2DE904B04CE20C +S31A5000ADD808D04DE22C000BE52C301BE5089090E5046093E508A0 +S31A5000ADED0099E530100BE527FFFFEB00A0A0E1040099E524FF77 +S31A5000AE02FFEB0080A0E1B200D9E12CFFFFEB0058A0E1B000D917 +S31A5000AE17E14558A0E128FFFFEB149086E20048A0E12C301BE58F +S31A5000AE2C1470A0E3BC70C3E10A00A0E15030A0E30C30C9E54428 +S31A5000AE4148A0E113FFFFEB040089E50800A0E110FFFFEB0800E5 +S31A5000AE5689E5010BA0E318FFFFEBBE00C9E10030A0E3B231C9CC +S31A5000AE6BE10558A0E1B031C9E12508A0E111FFFFEBB401C6E12E +S31A5000AE800448A0E12408A0E10DFFFFEBB200C9E10D70C9E5046C +S31A5000AE9520A0E370109FE50C0086E217F9FFEB100086E2301085 +S31A5000AEAA1BE50420A0E313F9FFEB0650A0E30950C6E52C301B4C +S31A5000AEBFE5BC00D3E1FEFEFFEBB200C6E12C301BE5BC40D3E188 +S31A5000AED40600A0E17FFEFFEB0020A0E10900A0E10410A0E1580D +S31A5000AEE9FEFFEB0008A0E12008A0E1F2FEFFEBB001C9E130205F +S31A5000AEFE1BE52C001BE50510A0E19DFDFFEB000000EA588400DD +S31A5000AF1300F0AF1BE90DC0A0E100D82DE94C309FE50010A0E361 +S31A5000AF28002093E504B04CE2010052E10D00000A03C0A0E100B5 +S31A5000AF3D0052E10600001A000051E30200000A003092E500303F +S31A5000AF5281E5010000EA003092E500308CE50210A0E1002092B6 +S31A5000AF67E5000052E3F2FFFF1A00A81BE9A0D000000DC0A0E1F1 +S31A5000AF7C00D82DE90010A0E30120A0E304B04CE216FFFFEB0064 +S31A5000AF91A81BE90DC0A0E100D82DE90030A0E3043080E504B06D +S31A5000AFA64CE2DAFFFFEB00A81BE90DC0A0E110D82DE90040A077 +S31A5000AFBBE1440094E504B04CE2000050E30500000A003090E5C4 +S31A5000AFD0443084E50FFEFFEB440094E5000050E3F9FFFF1A1031 +S31A5000AFE5A81BE90DC0A0E110D82DE90030A0E304B04CE2004034 +S31A5000AFFAA0E1043084E51C0084E2290200EB0400A0E1E7FFFFCC +S31A5000B00FEB0400A0E1BFFFFFEB10A81BE90DC0A0E1F0D82DE9D6 +S31A5000B0240170A0E1082097E5BC10D7E104B04CE20C30D2E500D2 +S31A5000B03950A0E1040092E52332A0E10331A0E1014063E00360EE +S31A5000B04E82E090FEFFEB542095E5003062E0000053E317000010 +S31A5000B063CA023060E0044063E0036086E0000054E3120000DAD3 +S31A5000B078043082E0543085E5442095E50030A0E3003087E503B9 +S31A5000B08D0052E10600000A000000EA002092E5003092E50000ED +S31A5000B0A253E3FBFFFF1A007082E5020000EA447085E54C408508 +S31A5000B0B7E5486085E50100A0E3F0A81BE90000A0E3F0A81BE9F8 +S31A5000B0CC0DC0A0E130D82DE9083091E50040A0E1080093E504BA +S31A5000B0E1B04CE26BFEFFEB583094E50050A0E1053063E0000089 +S31A5000B0F653E3140000DA1C0084E2EA0100EB582094E5B831D4C5 +S31A5000B10BE1051062E0030051E10310A0A1000051E30B0000DAFF +S31A5000B120B831D4E1033061E0B831C4E1012082E0582084E503BD +S31A5000B13538B0E10400000A380094E5B821D4E1140080E2011012 +S31A5000B14A80E06CF8FFEB30A81BE90DC0A0E1F0DD2DE90080A0BF +S31A5000B15FE1BC00D8E1086098E504B04CE2044098E50170A0E1B5 +S31A5000B17452FEFFEBB200C4E100A0A0E3BC50D8E10400A0E1D39F +S31A5000B189FDFFEB0020A0E10600A0E10510A0E1ACFDFFEB00081B +S31A5000B19EB0E1F600001AC4339FE5005093E5000000EA00509593 +S31A5000B1B3E5000055E31200000AB200D6E1B441D5E13EFEFFEBBE +S31A5000B1C8000054E1F7FFFF1AB631D5E1000053E30A00000AB041 +S31A5000B1DD00D6E10340A0E136FEFFEB000054E1EFFFFF1A07002B +S31A5000B1F2A0E1081085E20420A0E37CFAFFEB000050E3E9FFFFD1 +S31A5000B2071A000055E3D800000A0C0085E2041087E20620A0E30F +S31A5000B21C38F8FFEB043095E5020053E30700000A0D30D6E504BA +S31A5000B2310013E30400000A0500A0E169FFFFEB0800A0E173FDDD +S31A5000B246FFEBF0AD1BE9043095E5013043E2090053E303F19F3C +S31A5000B25B97C20000EA88B20050E8B2005080B5005050B30050F9 +S31A5000B27050B30050FCB3005040B40050D4B4005018B500505C8C +S31A5000B285B500500D30D6E5020013E31000000A0230A0E3043066 +S31A5000B29A85E5040096E5FCFDFFEB013080E2B000D6E15430857A +S31A5000B2AFE503FEFFEBB601C5E1002097E51210A0E3082085E534 +S31A5000B2C40030A0E3B831C5E10500A0E1B035C5E18C0000EA084E +S31A5000B2D900A0E10710A0E1B9FEFFEBA50000EA1C0085E26F01CE +S31A5000B2EE00EB0D30D6E5041013E20200000A0130A0E304308590 +S31A5000B303E59D0000EA020013E30300000A0500A0E10120A0E344 +S31A5000B31833FEFFEB970000EA100013E39500000A080096E5D92D +S31A5000B32DFDFFEB583095E5013083E2030050E18F00001A043025 +S31A5000B342A0E3043085E5580085E58B0000EA0D30D6E554409527 +S31A5000B357E5100013E30200000A0500A0E10810A0E157FFFFEB35 +S31A5000B36C0500A0E10810A0E128FFFFEB0D30D6E500A0A0E1012C +S31A5000B3810013E30800000A040096E5C1FDFFEB543095E5030031 +S31A5000B39650E10300001A013080E2543085E50520A0E30420852C +S31A5000B3ABE5543095E5040053E10200001AB035D5E1000053E32F +S31A5000B3C06E00000AB841D5E1000054E30700001A1C0085E235EB +S31A5000B3D50100EB0500A0E11010A0E30420A0E100FEFFEBB04576 +S31A5000B3EAC5E1630000EA0130A0E3B035C5E1600000EA0D30D669 +S31A5000B3FFE5100013E35D00000A0500A0E10810A0E12DFFFFEB5C +S31A5000B414080096E59EFDFFEB583095E5013083E2030050E154A5 +S31A5000B42900001A0030A0E3043085E50500A0E1B6FEFFEB4F00DA +S31A5000B43E00EA0D30D6E5100013E31700000A0500A0E10810A05C +S31A5000B453E11CFFFFEB080096E58DFDFFEB583095E5013083E219 +S31A5000B468030050E10E00001A0D30D6E5010013E30900000A0516 +S31A5000B47D00A0E11010A0E3543095E50A20A0E3042085E50130D6 +S31A5000B49283E2543085E50A2042E2D2FDFFEB010000EA0830A032 +S31A5000B4A7E3043085E50D30D6E5010013E33100000A1C0085E20C +S31A5000B4BCFB0000EB0500A0E11110A0E3543095E50920A0E30A61 +S31A5000B4D10000EA0500A0E10810A0E1CEFEFFEB0D30D6E500A0B9 +S31A5000B4E6A0E1010013E32300000A0500A0E11010A0E354309514 +S31A5000B4FBE50A20A0E3042085E5013083E2543085E50020A0E39F +S31A5000B510B5FDFFEB190000EA0D30D6E5100013E31600000A050E +S31A5000B52500A0E10810A0E1E6FEFFEB080096E557FDFFEB58308A +S31A5000B53A95E5013083E2030050E10D00001A1C0085E2D70000E1 +S31A5000B54FEB0A30A0E3043085E5080000EA0500A0E10010A0E340 +S31A5000B5640120A0E39FFDFFEB030000EAA0D000000800A0E10765 +S31A5000B57910A0E112FEFFEB00005AE30100001A0800A0E1A1FC5E +S31A5000B58EFFEBF0AD1BE90DC0A0E100D82DE904B04CE2E1FCFFCD +S31A5000B5A3EBD90000EB00A81BE90DC0A0E130D82DE954209FE57E +S31A5000B5B804B04CE20040A0E10158A0E14558A0E10010A0E3807A +S31A5000B5CDF7FFEB0130A0E3043084E5B451C4E15C2084E24020F5 +S31A5000B5E284E5342084E524109FE524209FE5703084E238308466 +S31A5000B5F7E5BE23C4E1003091E5003084E50000A0E3004081E516 +S31A5000B60C30A81BE948060000A0D00000EA0500000DC0A0E110EC +S31A5000B621D82DE90040A0E1043094E504B04CE2010000EAD6FFC0 +S31A5000B636FFEB043094E5000053E30200000AB831D4E1000053DF +S31A5000B64BE3F8FFFF1A10A81BE90DC0A0E110D82DE904B04CE2B7 +S31A5000B6600040A0E1ECFFFFEB041094E5020051E30030A0130142 +S31A5000B67530A003040051E30320A0110120A003000052E306008C +S31A5000B68A000A0400A0E11110A0E30730A0E3043084E50020A00B +S31A5000B69FE351FDFFEB060000EA050051E30400001A0400A0E159 +S31A5000B6B40630A0E3043084E51110A0E349FDFFEB0400A0E13844 +S31A5000B6C9FEFFEB10A81BE90DC0A0E1F0D82DE904B04CE2016003 +S31A5000B6DEA0E1005052E20040A0E1020000DA4C3094E500005317 +S31A5000B6F3E30300001A0000A0E3F0A81BE94C0084E52B0000EA03 +S31A5000B708043094E5040053E30070A0E3170000EA481094E50624 +S31A5000B71D00A0E1F7F6FFEB4C3094E5440094E5037087E00020BD +S31A5000B73290E5036086E0442084E5055063E034FCFFEB44009417 +S31A5000B747E5000050E3EBFFFF0A081090E50C30D1E5BC20D0E180 +S31A5000B75C2332A0E1032142E04C2084E50C30D1E52332A0E103C6 +S31A5000B7711181E0481084E5000055E30D00000A4C2094E5020004 +S31A5000B78655E1E2FFFFAA0600A0E1481094E50520A0E1D9F6FFCC +S31A5000B79BEB483094E5057087E04C2094E5053083E0483084E52D +S31A5000B7B0022065E04C2084E50700A0E1F0A81BE90DC0A0E17010 +S31A5000B7C5D82DE904B04CE20040A0E1380094E5005052E2010052 +S31A5000B7DA00CA0000A0E370A81BE9043094E5043043E201005341 +S31A5000B7EFE30100009A0000E0E370A81BE9B861D4E1000056E38B +S31A5000B8040C00001A34309FE5140080E2030055E10350A0210503 +S31A5000B81920A0E1B8F6FFEB0400A0E11010A0E3B851C4E106208F +S31A5000B82EA0E1EDFCFFEB0500A0E170A81BE90000A0E370A81B03 +S31A5000B843E9B20500000DC0A0E170D82DE904B04CE20060A0E18B +S31A5000B8580240A0E1041086E50350A0E1CAFAFFEB080086E50C42 +S31A5000B86D4086E534309FE5002093E50310A0E1105086E50000E6 +S31A5000B88252E30400000A060052E10500000A002092E5000052E7 +S31A5000B897E3FAFFFF1A003091E5003086E5006081E570A81BE92E +S31A5000B8ACA4D000000DC0A0E100D82DE94C109FE50020A0E300FE +S31A5000B8C13091E504B04CE2020053E10D00000A000053E107000C +S31A5000B8D6001A000052E30200000A003093E5003082E500A81BAA +S31A5000B8EBE9003093E5003081E500A81BE90320A0E1003093E5D3 +S31A5000B900000053E3F1FFFF1A00A81BE9A4D000000DC0A0E170BF +S31A5000B915D82DE970309FE504B04CE20050A0E3004093E50360E5 +S31A5000B92AA0E1050054E11500000A96FAFFEB0C0094E900006372 +S31A5000B93FE0020050E10C00003A000055E30200000A003094E557 +S31A5000B954003085E5010000EA003094E5003086E5100094E50F27 +S31A5000B969E0A0E10CF094E5004096E50050A0E3010000EA0450D0 +S31A5000B97EA0E1004094E5000054E3E9FFFF1A70A81BE9A4D0005C +S31A5000B993000DC0A0E1F0D92DE90070A0E1045097E5B200D5E1F3 +S31A5000B9A804B04CE244FCFFEB0040A0E1B000D5E141FCFFEB01D9 +S31A5000B9BD0050E3020B54033B00001A186085E20600A0E1EC8061 +S31A5000B9D29FE50420A0E30810A0E184F8FFEB000050E33300007A +S31A5000B9E71AB600D5E134FCFFEB010050E31C00001A0200A0E366 +S31A5000B9FC30FCFFEB0E4085E20410A0E1B600C5E10420A0E30677 +S31A5000BA1100A0E13AF6FFEB126085E20600A0E1085085E20510FB +S31A5000BA26A0E10620A0E334F6FFEB0400A0E10810A0E10420A095 +S31A5000BA3BE330F6FFEB0500A0E17C109FE50620A0E32CF6FFEB62 +S31A5000BA501C30A0E3BC30C7E10700A0E168209FE50610A0E1ED10 +S31A5000BA65FBFFEB120000EAB600D5E113FCFFEB020050E30E00ED +S31A5000BA7A001A4C409FE5003094E5000053E30A00000A0E1085A1 +S31A5000BA8FE2080094E50420A0E355F8FFEB006050E20400001A5B +S31A5000BAA4081085E2040094E50620A0E313F6FFEB006084E507CF +S31A5000BAB900A0E155FBFFEBF0A91BE958840000E04401000608BB +S31A5000BACE0000A8D000000DC0A0E1F0DF2DE90420A0E304B04CBB +S31A5000BAE3E208D04DE200A0A0E114519FE50180A0E10510A0E16D +S31A5000BAF83DF8FFEB004050E20500001A0800A0E1FC109FE50614 +S31A5000BB0D20A0E3FBF5FFEB0400A0E14D0000EA2C00A0E31CFBCE +S31A5000BB22FFEB007050E20400001A470000EA0700A0E137FBFF24 +S31A5000BB37EB0400A0E1440000EA044097E50100A0E3DDFBFFEBFF +S31A5000BB4CB600C4E10100A0E3DAFBFFEBB000C4E1020BA0E3D734 +S31A5000BB61FBFFEB0510A0E10660A0E3B200C4E10450A0E3046083 +S31A5000BB76C4E50520A0E10550C4E50E0084E2DEF5FFEB0800845A +S31A5000BB8BE278109FE50620A0E1DAF5FFEB180084E20A10A0E1E8 +S31A5000BBA00520A0E1D6F5FFEBFF30A0E330304BE52F304BE52EE0 +S31A5000BBB5304BE52D304BE52C304BE52B304BE544209FE50160D8 +S31A5000BBCA86E2048082E530904BE208A082E5FE3043E2003082BC +S31A5000BBDFE50280A0E11C30A0E3BC30C7E10700A0E11C209FE568 +S31A5000BBF40910A0E188FBFFEBE4F9FFEB0050A0E1070000EA58FE +S31A5000BC09840000E0440100A8D000000608000043FBFFEB004039 +S31A5000BC1E98E5000054E3C1FFFF0AD9F9FFEB000065E0F90050F4 +S31A5000BC33E3F7FFFF9A0630A0E1016046E2000053E3E6FFFFCA10 +S31A5000BC480700A0E1F1FAFFEB0000E0E3F0AF1BE90DC0A0E1F090 +S31A5000BC5DDD2DE904B04CE20080A0E10150A0E1A0A09FE50070A0 +S31A5000BC72A0E30A60A0E10800A0E10640A0E10410A0E10420A050 +S31A5000BC87E3D9F7FFEB003050E20E00000A0C6084E2017087E28F +S31A5000BC9C0F0057E3F4FFFFDA0500A0E10810A0E10420A0E393CF +S31A5000BCB1F5FFEB0800A0E1041085E284FFFFEB000050E30500A0 +S31A5000BCC600AA0000E0E3F0AD1BE9070096E8070085E80300A069 +S31A5000BCDBE1F0AD1BE930E09FE500C09EE5070095E88C308CE0F9 +S31A5000BCF003318AE0070083E801C08CE200C08EE510005CE30028 +S31A5000BD0530A00300308E050000A0E3F0AD1BE9B4D000007C8495 +S31A5000BD1A00000DC0A0E1F0DF2DE904B04CE204D04DE20050A0B6 +S31A5000BD2FE10180A0E164419FE50260A0E12CC014E50390A0E1C1 +S31A5000BD4400005CE30A30A0133F00001A0100A0E35AFBFFEB004C +S31A5000BD5900C4E52004A0E10100C4E50500A0E10030D0E50220FA +S31A5000BD6E84E2000053E30300000A0130C2E40130F0E500005391 +S31A5000BD83E3FBFFFF1A0030A0E30130C2E4030056E108019F05EE +S31A5000BD980300000A010056E30A30A0132900001AF8009FE5004D +S31A5000BDAD30D0E5F4709FE5000053E30300000A0130C2E4013013 +S31A5000BDC2F0E5000053E3FBFFFF1A0050A0E3D8609FE50510A0B4 +S31A5000BDD7E10050C2E50600A0E10C20A0E37AF5FFEB144046E21E +S31A5000BDEC01A0A0E3BAA1C4E10500A0E126FBFFEB140084E500BA +S31A5000BE013097E5B000D7E10A3083E0003087E52BFBFFEBB801C0 +S31A5000BE16C4E1B430D8E1050053E10200001A4500A0E325FBFF43 +S31A5000BE2BEBB400C8E1180086E20820A0E174109FE50630A0E17C +S31A5000BE40F81100EB000050E3030000AA0930A0E3003089E50069 +S31A5000BE5500E0E31D0000EA4C309FE514A003E50C5084E50060F7 +S31A5000BE6AE0E3106084E529004BE2085084E50A10A0E104508447 +S31A5000BE7FE50920A0E11B0000EB010050E30900000A18309FE5B0 +S31A5000BE94145003E50000E0E30C0000EAA0D10000EC340150F864 +S31A5000BEA93401508484000088D1000005020000343294E505005D +S31A5000BEBEA0E10C2094E5013043E2343284E5012082E20C208499 +S31A5000BED3E5F0AF1BE90DC0A0E100D82DE90000A0E308309FE501 +S31A5000BEE804B04CE2000083E500A81BE974D100000DC0A0E1F076 +S31A5000BEFDDF2DE904B04CE218D04DE234000BE50030A0E33C30A9 +S31A5000BF120BE538100BE50280A0E10C629FE5010053E1870000EB +S31A5000BF27AA2C5046E20C3095E5000053E3150000DA34001BE552 +S31A5000BF3C38C01BE53C201BE5341295E50C4062E0040053E103BD +S31A5000BF5140A0B10420A0E1E9F4FFEB34C01BE5343295E504C0F0 +S31A5000BF668CE034C00BE50C2095E5043083E0343285E50220648D +S31A5000BF7BE00C2085E53C101BE5041081E03C100BE5690000EA95 +S31A5000BF90103095E5020C53E36A00003A0130A0E388019FE500E3 +S31A5000BFA520A0E330300BE5209085E22C200BE514A085E274114B +S31A5000BFBA9FE530304BE200308DE50920A0E10A30A0E1DC110017 +S31A5000BFCFEB004050E20470A0E31C0000AA043095E5013083E2A9 +S31A5000BFE4043085E50F0053E3020000CA083095E5000053E3015A +S31A5000BFF900001A0830A0E3470000EA0700A0E1ADFAFFEB0000BE +S31A5000C00EC6E52004A0E10100C6E5B800D5E1A8FAFFEB0200C609 +S31A5000C023E50710A0E12004A0E10300C6E50920A0E1F4009FE5C0 +S31A5000C0380A30A0E1791100EB000050E33B0000AA0930A0E33465 +S31A5000C04D0000EA0030D6E50100D6E5000483E198FAFFEB030010 +S31A5000C06250E32000001A0230D6E50300D6E5000483E192FAFF68 +S31A5000C077EB083095E5013083E2030050E10500001A044044E26E +S31A5000C08C104085E50C4085E5043086E2343285E5080085E507F4 +S31A5000C0A100A0E186FAFFEB0000C6E52004A0E10100C6E5B80095 +S31A5000C0B6D5E181FAFFEB0200C6E50710A0E12004A0E10300C651 +S31A5000C0CBE50920A0E158009FE50A30A0E1521100EB000050E363 +S31A5000C0E0140000AA0930A0E30D0000EA0030D6E50100D6E500DD +S31A5000C0F50483E171FAFFEB050050E30600001A0230D6E50300DB +S31A5000C10AD6E5000483E16BFAFFEB000088E50000E0E30A00001E +S31A5000C11FEA0B30A0E3003088E50000E0E3060000EAA0D100004C +S31A5000C134050200003C201BE538301BE5030052E178FFFFBA3C33 +S31A5000C149001BE5F0AF1BE90DC0A0E100D82DE9010040E204B0D5 +S31A5000C15E4CE20B0050E300F19F97230000EA9CC10050A4C100C4 +S31A5000C17350ACC10050B4C10050BCC10050C4C10050CCC1005010 +S31A5000C188D4C10050DCC10050E4C10050ECC10050F4C100506023 +S31A5000C19D009FE500A81BE95C009FE500A81BE958009FE500A8F7 +S31A5000C1B21BE954009FE500A81BE950009FE500A81BE94C009F2F +S31A5000C1C7E500A81BE948009FE500A81BE944009FE500A81BE990 +S31A5000C1DC40009FE500A81BE93C009FE500A81BE938009FE50060 +S31A5000C1F1A81BE934009FE500A81BE930009FE500A81BE910352E +S31A5000C2060150203501503435015058350150703501508435018E +S31A5000C21B5098350150A8350150BC350150D8350150EC3501500A +S31A5000C23000360150003501500DC0A0E1F0DF2DE904B04CE20081 +S31A5000C24540A0E10190A0E100A0A0E30A80A0E10160A0E3007039 +S31A5000C25AA0E301C0D4E40A50A0E307005CE13500000A30005C91 +S31A5000C26FE30030A0130130A003030016E10A00000A0030D4E5D3 +S31A5000C284411043E2202083E2FF2002E2190051E30230A0917809 +S31A5000C2990053E30200001A1050A0E3014084E201C0D4E400E005 +S31A5000C2AEA0E30E60A0E130104CE2FF0001E241204CE2FF3002A3 +S31A5000C2C3E2050053E3090050830200009A61304CE2050053E381 +S31A5000C2D80000008A01E0A0E300005EE31200000A0000A0E3FF2E +S31A5000C2ED3001E2090053E30100A0910600009A61304CE20500FE +S31A5000C30253E357004C920200009AFF3002E2050053E337004CF8 +S31A5000C31792050050E1040000AA01C0D4E4950727E000005CE3EA +S31A5000C32CCEFFFF1A030000EA2E005CE30100000A0000A0E3F0E8 +S31A5000C341AF1BE9033068E28331A0E117A38AE1018088E2030019 +S31A5000C35658E3BDFFFFDA0A00A0E1CCF9FFEB000089E50100A063 +S31A5000C36BE3F0AF1BE90DC0A0E110D82DE90010A0E108D04DE2FD +S31A5000C3800230D1E528409FE500308DE50320D1E504208DE5006D +S31A5000C39520D1E50130D1E504B04CE210109FE50400A0E174F50C +S31A5000C3AAFFEB0400A0E1010000EAACD300001C36015010A81BD9 +S31A5000C3BFE90DC0A0E1F0D82DE904B04CE200E0A0E108C09EE570 +S31A5000C3D4FF1001E204609BE50250A0E1000096E50370A0E108DE +S31A5000C3E9208EE2140092E8044082E000C08CE0140000EA0100FA +S31A5000C3FE52E10E00001A0230DCE508009EE502E093E20500009F +S31A5000C4130A0E10A0E10030DCE5011051E20130C5E402C08CE2D6 +S31A5000C428FAFFFF1A00E087E50C3060E0003086E50100A0E3F0C0 +S31A5000C43DA81BE90230DCE58330A0E1043083E203C08CE00400F5 +S31A5000C4525CE10300002A0020DCE5FF3002E2FF0053E3E4FFFF0A +S31A5000C4671A0000A0E3F0A81BE90DC0A0E100D82DE9083090E548 +S31A5000C47CFF2002E20120C3E704B04CE200A81BE90DC0A0E100AB +S31A5000C491D82DE90610A0E3002090E504B04CE201C0D2E45C313E +S31A5000C4A6A0E1010013E30100000A0130D2E4A32382E001105137 +S31A5000C4BBE2F8FFFF5A002080E500A81BE90DC0A0E100D82DE977 +S31A5000C4D0002090E50130D2E404B04CE21C1003E21C0051E30141 +S31A5000C4E5208212033003E2030053E301208212002080E500A805 +S31A5000C4FA1BE90DC0A0E1F0DF2DE904B04CE20040A0E30090A0CB +S31A5000C50FE100C099E50460A0E10120DCE401E0A0E1603002E206 +S31A5000C524A332A0E14430CEE5800012E34100000A0120DCE4048A +S31A5000C53970A0E10F3002E2013083E240308EE5030057E13A0095 +S31A5000C54E00AA303002E223A2A0E12283A0E10750A0E103005AF3 +S31A5000C563E30AF19F97130000EABCC500507CC5005084C5005061 +S31A5000C57898C500500160DCE40D0000EA0120DCE50030DCE502BE +S31A5000C58D6483E102C08CE2080000EA0300DCE50020DCE5023082 +S31A5000C5A2DCE50110DCE5002C82E10338A0E1013483E1036082D2 +S31A5000C5B7E104C08CE20E6085E7030058E308F19F97130000EAC2 +S31A5000C5CC1CC60050DCC50050E4C50050F8C500500140DCE40DCD +S31A5000C5E10000EA0120DCE50030DCE5024483E102C08CE2080050 +S31A5000C5F600EA0300DCE50020DCE50230DCE50110DCE5002C82D8 +S31A5000C60BE10338A0E1013483E1034082E104C08CE2014084E20F +S31A5000C62020308EE2054083E7017087E240309EE5045085E203B5 +S31A5000C6350057E1C8FFFFBA00C089E5F0AF1BE90DC0A0E130D8BB +S31A5000C64A2DE904B04CE204D04DE200C0A0E118000BE50C10A085 +S31A5000C65FE10130D1E40250A0E1FF3003E218100BE51B0053E359 +S31A5000C6740800000A18C00BE510009FE510109FE50020DCE5ABBD +S31A5000C689F2FFEB0000A0E3240000EA283601504C360150010056 +S31A5000C69E81E218000BE50120D1E5011080E218100BE53F3002F3 +S31A5000C6B3E20030C5E5800012E30300000A0130D0E50130C5E51D +S31A5000C6C8012081E218200BE518301BE50140D3E40240C5E51817 +S31A5000C6DD300BE5010014E30100000A18004BE266FFFFEB020039 +S31A5000C6F214E30100000A18004BE262FFFFEB040014E30100004F +S31A5000C7070A18004BE26DFFFFEB080014E30200000A18004BE2D2 +S31A5000C71C041085E275FFFFEB0100A0E330A81BE90DC0A0E1002B +S31A5000C731D82DE904B04CE200C0A0E10130DCE402E0A0E11A001E +S31A5000C74653E30500000A90009FE590109FE501205CE577F2FF41 +S31A5000C75BEB0000A0E300A81BE901C08CE20100DCE40030A0E3B6 +S31A5000C77001C08CE200308EE5031010E20500004A0320A0E10193 +S31A5000C78530DCE7022483E1011051E2FBFFFF5A00208EE503306F +S31A5000C79A00E2013083E203C08CE00010A0E33C3000E22331A0B8 +S31A5000C7AFE1013083E204308EE5030051E1060000AA08008EE2A4 +S31A5000C7C40130DCE40130C0E704209EE5011081E2020051E1F9F9 +S31A5000C7D9FFFFBA0100A0E300A81BE928360150603601500DC0AA +S31A5000C7EEA0E100D82DE9001050E204B04CE20300000A10009F91 +S31A5000C803E54CF2FFEB0000A0E300A81BE904009FE500A81BE95A +S31A5000C81870360150CCD300000DC0A0E130D82DE904B04CE200D1 +S31A5000C82D50A0E31C409FE5005084E50400A0E12DE2FFEB2C404A +S31A5000C84284E2015085E2000055E3F8FFFFDA30A81BE9CCD300EA +S31A5000C857000DC0A0E100D82DE904B04CE271E2FFEB00A81BE96F +S31A5000C86C0DC0A0E100D82DE904B04CE29EE2FFEB00A81BE90D20 +S31A5000C881C0A0E110D82DE940409FE51C3094E504B04CE2000062 +S31A5000C89653E30100000A0000A0E310A81BE9030084E898E2FFCF +S31A5000C8ABEB000050E30500001A083094E50120A0E31C2084E5EB +S31A5000C8C0003063E2103084E510A81BE910A81BE9C04401000D65 +S31A5000C8D5C0A0E100D82DE93C209FE50010A0E11C3092E504B0E1 +S31A5000C8EA4CE2000053E30100001A0700A0E300A81BE914309258 +S31A5000C8FFE5030051E10300003A183092E50000A0E3030051E100 +S31A5000C9140000003A0100A0E300A81BE9C04401000DC0A0E100FB +S31A5000C929D82DE930009FE504B04CE21C3090E502C0A0E100001B +S31A5000C93E53E30500000A143090E5003081E5182090E500208CA1 +S31A5000C953E50000A0E300A81BE90700A0E300A81BE9C04401002A +S31A5000C9680DC0A0E100D82DE92C209FE51C3092E504B04CE200B3 +S31A5000C97D0053E30500000A083092E5003080E50C2092E5002003 +S31A5000C99281E50000A0E300A81BE90700A0E300A81BE9C044016A +S31A5000C9A7000DC0A0E1F0DF2DE904B04CE200A0A0E30050A0E11C +S31A5000C9BC0180A0E1F8C09FE50290A0E11C309CE50C70A0E10AEB +S31A5000C9D10053E10100001A0700A0E3F0AF1BE9006097E5D810BB +S31A5000C9E69FE5D8209FE50600A0E1022061E042F2FFEB0E02A02E +S31A5000C9FBE3021A80E2202090E4000031E1FCFFFF1A0000A0E313 +S31A5000CA10160F07EE9A0F07EE101F11EE011AC1E3101F01EE00F8 +S31A5000CA2510A0E3151F07EE0000A0E10000A0E10000A0E1000067 +S31A5000CA3AA0E10000A0E10000A0E1103097E5034005E00410A076 +S31A5000CA4FE1085085E070009FE50520A0E1D5F3FFEB68809FE526 +S31A5000CA64040000EA083097E560009FE50130C3E3034084E0CE95 +S31A5000CA79F3FFEB050054E10600002A0400A0E10FE0A0E106F020 +S31A5000CA8EA0E173E2FFEB00A050E2F2FFFF0A004089E5101F11C3 +S31A5000CAA3EE011A81E3031081E3101F01EE0800A0E1BFF3FFEB01 +S31A5000CAB80A00A0E1F0AF1BE9C044010024F2005030F300508C7B +S31A5000CACD360150A8360150A43601500DC0A0E1F0DF2DE904B036 +S31A5000CAE24CE204D04DE20270A0E10090A0E30050A0E194C09FEE +S31A5000CAF7E50160A0E11C209CE50CA0A0E12C300BE5090052E19B +S31A5000CB0C0700A0033F00000A00809AE574109FE574209FE508A4 +S31A5000CB2100A0E1022061E0F5F1FFEB0E02A0E3021A80E22020A4 +S31A5000CB3690E4000031E1FCFFFF1A0000A0E3160F07EE9A0F07AD +S31A5000CB4BEE101F11EE011AC1E3101F01EE0010A0E3151F07EECA +S31A5000CB600000A0E10000A0E10000A0E10000A0E10000A0E100E5 +S31A5000CB7500A0E11C009FE50610A0E1072086E00530A0E18AF3DD +S31A5000CB8AFFEB090000EAC044010030F3005060F40050AC360164 +S31A5000CB9F5070009FE5077064E082F3FFEB0130C4E3035085E03D +S31A5000CBB4036086E0000057E30D0000DA0500A0E108309AE506E9 +S31A5000CBC910A0E1030057E10740A0B10340A0A10420A0E10FE085 +S31A5000CBDEA0E108F0A0E11EE2FFEB009050E2EBFFFF0A2C301BDC +S31A5000CBF3E5005083E5101F11EE011A81E3031081E3101F01EEF8 +S31A5000CC080C009FE569F3FFEB0900A0E1010000EAA4360150A8A3 +S31A5000CC1D360150F0AF1BE90DC0A0E1F0DF2DE904B04CE200A0CD +S31A5000CC32A0E30050A0E10180A0E1F8C09FE50290A0E11C309C0A +S31A5000CC47E50C70A0E10A0053E10100001A0700A0E3F0AF1BE91A +S31A5000CC5C006097E5D8109FE5D8209FE50600A0E1022061E0A31C +S31A5000CC71F1FFEB0E02A0E3021A80E2202090E4000031E1FCFFAB +S31A5000CC86FF1A0000A0E3160F07EE9A0F07EE101F11EE011AC1E5 +S31A5000CC9BE3101F01EE0010A0E3151F07EE0000A0E10000A0E16F +S31A5000CCB00000A0E10000A0E10000A0E10000A0E1103097E50356 +S31A5000CCC54005E00410A0E1085085E070009FE50520A0E136F3CA +S31A5000CCDAFFEB68809FE5040000EA083097E560009FE50130C31F +S31A5000CCEFE3034084E02FF3FFEB050054E10600002A0400A0E155 +S31A5000CD040FE0A0E106F0A0E1D4E1FFEB00A050E2F2FFFF0A0072 +S31A5000CD194089E5101F11EE011A81E3031081E3101F01EE0800B7 +S31A5000CD2EA0E120F3FFEB0A00A0E1F0AF1BE9C044010050D500C4 +S31A5000CD435018D60050CC360150A8360150A43601500DC0A0E1FC +S31A5000CD58F0DF2DE904B04CE200A0A0E30050A0E10180A0E100B3 +S31A5000CD6DC19FE50290A0E11C309CE50C60A0E10A0053E101000A +S31A5000CD82001A0700A0E3F0AF1BE9007096E5E0109FE5E0209F01 +S31A5000CD97E50700A0E1022061E057F1FFEB0E02A0E3021A80E21E +S31A5000CDAC202090E4000031E1FCFFFF1A0000A0E3160F07EE9A0B +S31A5000CDC10F07EE101F11EE011AC1E3101F01EE0010A0E3151F31 +S31A5000CDD607EE0000A0E10000A0E10000A0E10000A0E10000A059 +S31A5000CDEBE10000A0E1103096E5034005E00410A0E1085085E046 +S31A5000CE0078009FE50520A0E1EAF2FFEB70809FE5040000EA08F5 +S31A5000CE153096E568009FE50130C3E3034084E0E3F2FFEB0500D9 +S31A5000CE2A54E10800002A081096E50C2096E50400A0E10FE0A0E8 +S31A5000CE3FE107F0A0E186E1FFEB00A050E2F0FFFF0A004089E566 +S31A5000CE54101F11EE011A81E3031081E3101F01EE0800A0E1D2D6 +S31A5000CE69F2FFEB0A00A0E1F0AF1BE9C044010018D60050ACD78E +S31A5000CE7E0050E4360150A8360150A43601500DC0A0E100D82DE1 +S31A5000CE93E904B04CE20B0050E300F19F97210000EAD4CE005007 +S31A5000CEA8ECCE0050F4CE0050FCCE005004CF00500CCF00501487 +S31A5000CEBDCF00501CCF00502CCF0050DCCE0050E4CE005024CF76 +S31A5000CED2005058009FE500A81BE954009FE500A81BE950009FAA +S31A5000CEE7E500A81BE94C009FE500A81BE948009FE500A81BE95B +S31A5000CEFC44009FE500A81BE940009FE500A81BE93C009FE50027 +S31A5000CF11A81BE938009FE500A81BE934009FE500A81BE930000D +S31A5000CF269FE500A81BE92C009FE500A81BE9FC3601501C37013D +S31A5000CF3B5040370150643701507C37015094370150B03701502F +S31A5000CF50C8370150D8370150FC37015020380150443801500DBF +S31A5000CF65C0A0E100D82DE9003090E5000053E104B04CE2050072 +S31A5000CF7A000A043090E5001083E5043090E5090081E804108072 +S31A5000CF8FE500A81BE9041083E5001083E5043081E5003081E582 +S31A5000CFA400A81BE90DC0A0E100D82DE90010A0E1000091E5042F +S31A5000CFB9B04CE2010050E10400000A003090E5003081E5002094 +S31A5000CFCE90E5041082E500A81BE90000A0E300A81BE90DC0A0C0 +S31A5000CFE3E170D82DE93C309FE53C209FE53C509FE5043083E528 +S31A5000CFF804B04CE2003083E50F40A0E3042082E50260A0E10014 +S31A5000D00D2082E50600A0E10510A0E1D1FFFFEB615E85E20140F3 +S31A5000D02254E2F9FFFF5A70A81BE900D40000F8D3000008D40085 +S31A5000D037000DC0A0E130D82DE90620A0E304B04CE20050A0E1C6 +S31A5000D04C100085E20140A0E1AAF0FFEB0410A0E118009FE50685 +S31A5000D06120A0E3A6F0FFEB10309FE5005083E50500A0E102003D +S31A5000D07600EB30A81BE9E0440100EC4401000DC0A0E100D82DDF +S31A5000D08BE90030A0E1101080E204B04CE200C093E50020A0E361 +S31A5000D0A00FE0A0E100F09CE500A81BE90DC0A0E1F0DF2DE94421 +S31A5000D0B5319FE504B04CE288D04DE23CC19FE50540A0E34C80DD +S31A5000D0CA93E50090A0E100509CE50270A0E1AC100BE5000058AA +S31A5000D0DFE31000000A0850A0E100C095E514219FE524309CE548 +S31A5000D0F428308CE50C3095E524208CE5000053E30700001A0541 +S31A5000D10900A0E1F8109FE50320A0E10FE0A0E100F09CE50C30ED +S31A5000D11E95E5013083E30C3085E5D0609FE50A0000EA00309582 +S31A5000D133E50500A0E10FE0A0E11CF093E5C8009FE5483096E5F3 +S31A5000D148014044E20FE0A0E103F0A0E1000054E3370000DA00E9 +S31A5000D15D3095E50500A0E10FE0A0E10CF093E5000050E3EEFF33 +S31A5000D172FF0AA8900BE50EA0A0E3A4A00BE5AC301BE59C700BC9 +S31A5000D187E584209FE584009FE5A0300BE50060A0E1001092E500 +S31A5000D19C0030A0E3003080E5030051E10B00000A030F00EB0099 +S31A5000D1B140A0E160009FE5FEF1FFEB0900A0E10A10A0E150F42C +S31A5000D1C6FFEBAC001BE50710A0E14DF4FFEB0400A0E1080F0009 +S31A5000D1DBEB0500A0E1A8104BE200C095E50220A0E300608DE5E2 +S31A5000D1F00E3087E20FE0A0E110F09CE50B0000EA50000000EC0B +S31A5000D20544010088840000E0440100400D0300E844010008358E +S31A5000D21A010054380150002095E50500A0E10FE0A0E11CF0929D +S31A5000D22FE5003096E5000053E3F8FFFF0A000058E30400000A85 +S31A5000D244003095E5282093E5242083E50010A0E3281083E5F046 +S31A5000D259AF1BE90DC0A0E100D82DE930309FE5030051E104B0AE +S31A5000D26E4CE200C0A0E10200001A0130A0E3003081E500A81BBD +S31A5000D283E900309CE50C00A0E128C093E50FE0A0E108F09CE5D0 +S31A5000D29800A81BE9083501000DC0A0E1F0D92DE9DC309FE5DCA8 +S31A5000D2AD209FE504B04CE20070A0E14C6093E50180A0E1005029 +S31A5000D2C292E5000056E31000000A0650A0E100C095E5B8209FAF +S31A5000D2D7E524309CE528308CE50C3095E524208CE5000053E3C8 +S31A5000D2EC0700001A0500A0E19C109FE50320A0E10FE0A0E100EC +S31A5000D301F09CE50C3095E5013083E30C3085E5003095E50500AE +S31A5000D316A0E10FE0A0E11CF093E574009FE51FFFFFEB004050A7 +S31A5000D32BE20D00000A0700A0E10C1084E20E20A0E3F0EFFFEB1A +S31A5000D3400800A0E1082094E51A1084E20E2042E2EBEFFFEB446E +S31A5000D355009FE50410A0E100FFFFEB080094E5000000EA0400FC +S31A5000D36AA0E1000056E30400000A003095E5282093E52420835F +S31A5000D37FE50010A0E3281083E5F0A91BE950000000EC4401000D +S31A5000D39488840000E044010000D40000F8D300000DC0A0E1F020 +S31A5000D3A9D92DE904B04CE20050A0E30280A0E1080055E10160D3 +S31A5000D3BEA0E10D0000AA34709FE58541A0E1060094E700109735 +S31A5000D3D3E5064084E0042094E5C8EFFFEB003097E5042094E5D9 +S31A5000D3E8015085E2023083E0003087E5080055E1F2FFFFBAF019 +S31A5000D3FDA91BE90C3501000DC0A0E1F0D92DE904B04CE280D077 +S31A5000D4124DE20060A0E1E8009FE50170A0E1E0FEFFEB008050A9 +S31A5000D427E20C5088120050A003A0500BE50600A0E19C700BE56C +S31A5000D43CA0104BE2003096E50120A0E30FE0A0E114F093E5B4B9 +S31A5000D451209FE5003092E5000053E30B00000A560E00EB00404B +S31A5000D466A0E1A0009FE551F1FFEB0500A0E10E10A0E3A3F3FFCE +S31A5000D47BEB0E0085E20E1047E2A0F3FFEB0400A0E15B0E00EB49 +S31A5000D490003096E5282093E5000052E31200000A1E1085E26878 +S31A5000D4A5009FE50420A0E3D0F1FFEB000050E30C00000A583075 +S31A5000D4BA9FE5002096E5005083E5144092E528C092E548309FEF +S31A5000D4CFE50600A0E1143082E50710A0E10FE0A0E104F09CE55E +S31A5000D4E4003096E5144083E5000058E30B00000A087088E52021 +S31A5000D4F9009FE50810A0E197FEFFEB060000EAF8D30000E84445 +S31A5000D50E010064380150588400000C350100A4D3005000D4000B +S31A5000D52300F0A91BE90DC0A0E100D82DE914309FE5000093E584 +S31A5000D538002090E504B04CE20FE0A0E120F092E500A81BE9EC82 +S31A5000D54D4401000DC0A0E130D82DE904B04CE200E0A0E1FE443D +S31A5000D5620EE294509FE5103F11EE23C1A0E101C01CE20C000088 +S31A5000D5770A0E02A0E3021A80E2202090E4000031E1FCFFFF1A54 +S31A5000D58C0000A0E3160F07EE9A0F07EE101F11EE0C10C1E310FB +S31A5000D5A11F01EE0010A0E3161F07EE50109FE550309FE55020FC +S31A5000D5B69FE5003084E54C309FE500208EE500308EE500009423 +S31A5000D5CBE5013000E0010053E10100000A015055E2F9FFFF1A26 +S31A5000D5E02C309FE5003084E500005CE30200000A101F11EE0FDF +S31A5000D5F51081E3101F01EE30A81BE9404B4C0080008000500036 +S31A5000D60A50006000600001000100FF00FF000DC0A0E1F0DF2D5B +S31A5000D61FE904B04CE280D04DE200E0A0E101A0A0E10260A0E1F0 +S31A5000D634103F11EE2371A0E1017017E20C00000A0E02A0E30213 +S31A5000D6491A80E2202090E4000031E1FCFFFF1A0000A0E3160F78 +S31A5000D65E07EE9A0F07EE101F11EE0C10C1E3101F01EE0010A012 +S31A5000D673E3161F07EEFE540EE20520A0E130309FE50010A0E3E0 +S31A5000D688003085E5060051E1100000AAA8004BE20180A0E103D1 +S31A5000D69DC0CAE314409FE5004082E50E0052E10300001A018057 +S31A5000D6B2C0E7030000EA5000500098009800083092E50130C009 +S31A5000D6C7E70C2082E0011081E2060051E1F2FFFFBAB0109FE5E9 +S31A5000D6DCB0C09FE5B0309FE5B0209FE500308EE500208EE50001 +S31A5000D6F10095E50C3000E00C0053E10100000A011051E2F9FFB1 +S31A5000D706FF1A0520A0E10010A0E3060051E1150000AAA8804BFC +S31A5000D71BE274909FE52AE1A0E10130D8E7014081E2000053E3E3 +S31A5000D7300A00000A009082E550109FE55C309FE54CC09FE500FF +S31A5000D7453082E5000095E50C3000E00C0053E10100000A0110F0 +S31A5000D75A51E2F9FFFF1A0E2182E00410A0E1060051E1EBFFFFD9 +S31A5000D76FBA2C309FE5003085E5000057E30200000A101F11EEA7 +S31A5000D7840F1081E3101F01EE050000EA404B4C00800080006073 +S31A5000D799006000D000D00001000100FF00FF00F0AF1BE90DC0B5 +S31A5000D7AEA0E100D82DE908309FE504B04CE2000083E500A81BD8 +S31A5000D7C3E9103501000DC0A0E100D82DE930109FE530309FE5E8 +S31A5000D7D8000081E5002093E5002092E504B04CE2000052E30139 +S31A5000D7ED00001A0200A0E100A81BE90200A0E30FE0A0E102F0A1 +S31A5000D802A0E100A81BE914350100103501000DC0A0E100D82DAB +S31A5000D817E934309FE504B04CE230C09FE507008CE8002093E56C +S31A5000D82C002092E5000052E30100001A0200A0E100A81BE90378 +S31A5000D84100A0E30C10A0E10FE0A0E102F0A0E100A81BE9103588 +S31A5000D8560100143501000DC0A0E100D82DE934309FE504B04CF8 +S31A5000D86BE230C09FE503008CE8002093E5002092E5000052E321 +S31A5000D8800100001A0200A0E100A81BE90400A0E30C10A0E10FC0 +S31A5000D895E0A0E102F0A0E100A81BE910350100143501000DC04B +S31A5000D8AAA0E100D82DE934309FE504B04CE230C09FE507008CD3 +S31A5000D8BFE8002093E5002092E5000052E30100001A0200A0E114 +S31A5000D8D400A81BE90500A0E30C10A0E10FE0A0E102F0A0E10035 +S31A5000D8E9A81BE910350100143501000DC0A0E100D82DE93430F8 +S31A5000D8FE9FE504B04CE230C09FE507008CE8002093E500209220 +S31A5000D913E5000052E30100001A0200A0E100A81BE90700A0E3BB +S31A5000D9280C10A0E10FE0A0E102F0A0E100A81BE910350100140E +S31A5000D93D3501000DC0A0E12034A0E1FF3C03E2203C83E100D86E +S31A5000D9522DE90024A0E1FF2802E2023083E1000C83E104B04C9E +S31A5000D967E200A81BE90DC0A0E100D82DE904B04CE208D04DE2A2 +S31A5000D97C14004BE290FFFFEB000050E30300000A10001BE5EA4C +S31A5000D991FFFFEB0008A0E12008A0E100A81BE90DC0A0E1F0DD49 +S31A5000D9A62DE904B04CE20040A0E10050A0E30170A0E10260A096 +S31A5000D9BBE1FC809FE5FCA09FE52C0000EA054186E70030D4E54E +S31A5000D9D0015085E2220000EA0030D4E5220053E31D00001A05AB +S31A5000D9E52186E0043012E5040053E101408402044002050030AB +S31A5000D9FAD4E50400A0E1000053E3220053130900000A0430A0DF +S31A5000DA0FE10110D3E45C0051E30340A0010020D4E50120C0E4F1 +S31A5000DA240130F4E5000053E322005313F5FFFF1A0030D4E500D9 +S31A5000DA390053E30200001A80009FE5DBEFFFEB040000EA040086 +S31A5000DA4E50E10030A0130030C015050000EA014084E20030D4BA +S31A5000DA63E5000053E30300000A200053E3D8FFFF1A0030A0E337 +S31A5000DA780130C4E40030D4E5000053E30700000A200053E302E2 +S31A5000DA8D00001A0130F4E5200053E3FCFFFF0A0030D4E50000C7 +S31A5000DAA253E3C7FFFF1A005087E50800A0E1002096E50A10A06A +S31A5000DAB7E1030000EBF0AD1BE97487000024880000AC380150B8 +S31A5000DACC0DC0A0E1F0DF2DE904B04CE20040A0E10280A0E1080E +S31A5000DAE100A0E101A0A0E1C7EFFFEB0450A0E10A0055E10090F2 +S31A5000DAF6A0E12C00000A0800A0E1001095E50920A0E11AF0FF48 +S31A5000DB0BEB000050E32300001A000095E5BBEFFFEB090050E10C +S31A5000DB201D0000DA0170A0E30A0054E11400000A040055E10F09 +S31A5000DB3500000A0800A0E1001094E50920A0E10BF0FFEB00607A +S31A5000DB4A50E20900001A000057E30400000A58009FE50810A03F +S31A5000DB5FE1002095E50670A0E192EFFFEB48009FE5001094E529 +S31A5000DB748FEFFFEB104084E20A0054E1EAFFFF1A000057E303AA +S31A5000DB8900001A2C009FE588EFFFEB0700A0E1F0AF1BE90500D6 +S31A5000DB9EA0E1F0AF1BE9105085E20A0055E1D2FFFF1A0000A067 +S31A5000DBB3E3F0AF1BE9C0380150E8380150EC3801500DC0A0E104 +S31A5000DBC870D82DE904B04CE20040A0E10150A0E130009FE50269 +S31A5000DBDD60A0E174EFFFEB050054E10700000A20009FE50020A0 +S31A5000DBF294E5083094E50610A0E16DEFFFEB104084E2050054B2 +S31A5000DC07E1F7FFFF1A70A81BE9F0380150F83801500DC0A0E15E +S31A5000DC1C00D82DE90010C0E50C0080E904B04CE204309BE50CE3 +S31A5000DC313080E508209BE5102080E50C309BE5143080E500A8A9 +S31A5000DC461BE90DC0A0E1F0DF2DE904B04CE20CD04DE200C0A0EF +S31A5000DC5BE334C00BE50CE09BE501A0A0E32C000BE50A005EE1A2 +S31A5000DC7000C0A01301C0A00308E09BE50180A0E130300BE500B8 +S31A5000DC85005EE300C0A00300005CE334101B1500108E153430C6 +S31A5000DC9A1BE504C09BE530401BE50C0053E1110000AA03C0A00D +S31A5000DCAFE104009BE5103094E5000053E300C08315041094E5D1 +S31A5000DCC4000051E30600001A083094E5000053E30100000A02AD +S31A5000DCD90053E30100001A0C3094E5001083E5184084E20100A3 +S31A5000DCEE50E2EFFFFF1A2CE01BE50270A0E10E0057E1860000C7 +S31A5000DD03AA071198E70030D1E52D0053E35300001A0050A0E3EB +S31A5000DD1830401BE50500A0E104209BE5016087E20190D1E502F3 +S31A5000DD2D0055E1440000AA0030D4E5030059E13C00001A1030AB +S31A5000DD4294E5000053E30600000A003093E5000053E3030000D6 +S31A5000DD570A94019FE5141094E500A0A0E313EFFFEB043094E5E5 +S31A5000DD6C000053E32000000A070198E70230D0E53D0053E30308 +S31A5000DD815080020200000A073188E0017087E2045093E50820EB +S31A5000DD9694E5000052E30200000A010052E30C00000A0D00000F +S31A5000DDABEA0500A0E10C1094E50230A0E15C0000EB006050E27C +S31A5000DDC00700001A2C019FE50510A0E1142094E506A0A0E1F7C5 +S31A5000DDD5EEFFEB010000EA0C3094E5005083E5102094E50130D9 +S31A5000DDEAA0E3003082E5036087E00C0000EA083094E5000053F0 +S31A5000DDFFE30200000A020053E30400000A060000EA0C2094E5EF +S31A5000DE14003092E5013083E2010000EA0C2094E50130A0E30022 +S31A5000DE293082E50150A0E3040000EA010080E204309BE51840C6 +S31A5000DE3E84E2030050E1BAFFFFBA000055E32F00001A0910A033 +S31A5000DE53E1A0009FE505A0A0E1D5EEFFEB2A0000EA08C09BE530 +S31A5000DE6800005CE32300000A34E01BE500005EE30300000A1071 +S31A5000DE7D109BE56C009FE500A0A0E3CAEEFFEB0C109BE5000059 +S31A5000DE9251E30200000A010051E30D00000A0F0000EA08109BED +S31A5000DEA7E50C209BE5070198E70230A0E11D0000EB004050E2CB +S31A5000DEBC0800001A30009FE510209BE5071198E704A0A0E1B801 +S31A5000DED1EEFFEB020000EA073198E708209BE5003082E50130FB +S31A5000DEE6A0E334300BE5036087E0060000EA0439015024390154 +S31A5000DEFB504C39015020009FE5016087E2AAEEFFEB08A09BE57E +S31A5000DF102CC01BE50670A0E10C0057E178FFFFBA0A00A0E100C4 +S31A5000DF250000EA6C390150F0AF1BE90DC0A0E1F0D92DE904B02D +S31A5000DF3A4CE200C0A0E10140A0E30A50A0E30060A0E30180A068 +S31A5000DF4FE10270A0E10000DCE503E0A0E1200050E30200001AFF +S31A5000DF640130FCE5200053E3FCFFFF0A0030DCE5000053E33F80 +S31A5000DF7900000A000054E30B00000AFF3003E2300053E3080065 +S31A5000DF8E001A0130DCE5411043E2202083E2FF2002E219005194 +S31A5000DFA3E30230A091780053E31050A00302C08C020040A0E309 +S31A5000DFB80110DCE40400A0E1302041E2413041E2050053E3095D +S31A5000DFCD0052830200009A613041E2050053E30000008A0100FE +S31A5000DFE2A0E3000050E31300000A0000A0E3302041E2FF3002DA +S31A5000DFF7E2090053E30200A0910600009A613041E2050053E3DC +S31A5000E00C570041920200009A413041E2050053E3370041920505 +S31A5000E0210050E1040000AA0030DCE5950626E0000053E3D0FF1E +S31A5000E036FF1A0F0000EA00005EE30B00000A0E20A0E10030D266 +S31A5000E04BE5010000EA0130F2E5FF3003E2000053E30100000A3D +S31A5000E060030051E1F9FFFF1A0030D2E5000053E30100001A00D7 +S31A5000E07500A0E3F0A91BE9006088E5000057E300C087150100BC +S31A5000E08AA0E3F0A91BE90DC0A0E100D82DE90030D0E504B04CEA +S31A5000E09FE2200053E30200001A0130F0E5200053E3FCFFFF0A62 +S31A5000E0B40000D0E5540050E30030A0130130A003740050E30166 +S31A5000E0C930A003000053E30400001A460050E366005013020081 +S31A5000E0DE000A0300A0E100A81BE90130A0E3003081E50100A0B2 +S31A5000E0F3E300A81BE90DC0A0E100D82DE93C009FE504B04CE255 +S31A5000E1082AEEFFEB34009FE534109FE534209FE534309FE52545 +S31A5000E11DEEFFEB30009FE523EEFFEB2C009FE52C309FE52CC094 +S31A5000E1329FE5001093E500209CE51DEEFFEB00A81BE9D48200DE +S31A5000E14700C43A0150DC3A0150F83A0150A0390150083B015076 +S31A5000E15C343B015088450100F44401000DC0A0E1F0DF2DE9005E +S31A5000E17100E0E304D04DE244429FE5343094E504B04CE20FE0C5 +S31A5000E186A0E103F0A0E12C000BE50060A0E3343094E50600A0B7 +S31A5000E19BE10FE0A0E103F0A0E11C029FE51C329FE51C229FE51E +S31A5000E1B0006083E50180A0E3008082E5483094E50FE0A0E103ED +S31A5000E1C5F0A0E104229FE504129FE5006082E50234A0E300308A +S31A5000E1DA81E5F8519FE5EF0100EB0600A0E10610A0E1C1FFFFEF +S31A5000E1EFEBE8319FE5E8A19FE5E8719FE5030055E10340A0E156 +S31A5000E2040300000A0FE0A0E104F095E4040055E1FBFFFF1A0078 +S31A5000E219E09AE500005EE33500000AC0219FE5C0419FE5C01100 +S31A5000E22E9FE50E90A0E1003092E50400A0E1832263E002318318 +S31A5000E243E08351A0E19125CCE0C52FA0E14C2362E00210A0E120 +S31A5000E258823262E0032182E0822145E0D3EDFFEB0030A0E300BA +S31A5000E26D308AE5090055E31A0000DA0700A0E1011CA0E30A2020 +S31A5000E282A0E32FEFFFEB0060A0E1010056E30A00001A58319F3F +S31A5000E297E50400A0E19325C1E0C52FA0E1412362E00210A0E1AB +S31A5000E2AC823262E0032182E0822145E0BEEDFFEBEBFFFFEA015A +S31A5000E2C10076E30600001A28319FE5002093E5000052E30000CF +S31A5000E2D6000A4B0B00EB0A5045E2E2FFFFEA020076E3020000EA +S31A5000E2EB1A0030A0E300308AE5000000EA00908AE5000058E338 +S31A5000E3000200000AF0009FE50080A0E3A9EDFFEB0700A0E10126 +S31A5000E3151CA0E3FA20A0E309EFFFEB0060A0E1010076E305003F +S31A5000E32A001AC4309FE5002093E5000052E3EFFFFF0A320B00F5 +S31A5000E33FEBEDFFFFEA000056E30700001A70209FE52C001BE519 +S31A5000E354343092E50FE0A0E103F0A0E198009FE559DBFFEBE382 +S31A5000E369FFFFEA0700A0E1A5EDFFEB000050E30F0000DA805071 +S31A5000E37E9FE50700A0E17C409FE50510A0E10420A0E182FDFF2F +S31A5000E393EB003050E20400000A000095E50410A0E10FE0A0E145 +S31A5000E3A80CF093E5020000EA54009FE5001094E57EEDFFEB01F3 +S31A5000E3BD80A0E3CDFFFFEA50000000400D0300F04401008C4597 +S31A5000E3D2010088450100F4440100E4880000EC8800009445011E +S31A5000E3E70020350100F8440100403B0150D34D6210CC460100C7 +S31A5000E3FC843B0150704900508445010000450100903B0150F081 +S31A5000E411AF1BE90DC0A0E110D82DE9020050E304B04CE2014049 +S31A5000E426A0E15400001A040094E554119FE5A2EDFFEB0000506D +S31A5000E43BE31000001A00C00FE100400FE1C04084E304F029E124 +S31A5000E450101F11EE011A81E3031081E3101F01EE101F11EE0FE2 +S31A5000E4651081E3101F01EE00300FE1C0400CE2C030C3E30430E2 +S31A5000E47A83E103F029E110A81BE9040094E500119FE58CEDFF90 +S31A5000E48FEB000050E33500001A00C00FE100400FE1C04084E36E +S31A5000E4A404F029E10E02A0E3021A80E2202090E4000031E1FC3C +S31A5000E4B9FFFF1A0000A0E3160F07EE9A0F07EE101F11EE011A5C +S31A5000E4CEC1E3101F01EE0010A0E3151F07EE0000A0E10000A044 +S31A5000E4E3E10000A0E10000A0E10000A0E10000A0E1101F11EEBB +S31A5000E4F80C10C1E3101F01EE0010A0E3161F07EE0E02A0E30289 +S31A5000E50D1A80E2202090E4000031E1FCFFFF1A0000A0E3160FA5 +S31A5000E52207EE9A0F07EE0010A0E3151F07EE151F08EE0000A075 +S31A5000E537E10000A0E10000A0E10000A0E10000A0E10000A0E113 +S31A5000E54C0010A0E3161F07EE171F08EE00300FE1C0400CE2C0AD +S31A5000E56130C3E3043083E103F029E110A81BE91C009FE5041074 +S31A5000E57694E50EEDFFEB10A81BE910009FE50BEDFFEB10A81BD7 +S31A5000E58BE9B43B0150B83B0150BC3B0150D43B01500DC0A0E1C2 +S31A5000E5A070D82DE90030A0E304B04CE214D04DE21C300BE503CB +S31A5000E5B550A0E11C304BE204308DE500508DE524309FE50C3035 +S31A5000E5CA8DE50120A0E308208DE50530A0E19AFDFFEB000050AF +S31A5000E5DFE30400001A08009FE5F2ECFFEB230000EAE03B015003 +S31A5000E5F4E83B01501C001BE5000050E30100000A00EDFFEB0017 +S31A5000E60950A0E15C409FE55C309FE5030054E10360A0E1170072 +S31A5000E61E000A1C001BE50130A0E3000050E30500000A001094D1 +S31A5000E633E50520A0E14EEDFFEB000050E30030A0130130A003E2 +S31A5000E648000053E30400000A20009FE5041094E5002094E50851 +S31A5000E65D3094E5D4ECFFEB104084E2060054E1020000EA748727 +S31A5000E672000024880000FC3B0150E7FFFF1A70A81BE90DC0A081 +S31A5000E687E170D82DE904B04CE250D04DE20060A0E148404BE222 +S31A5000E69C0400A0E14C304BE200308DE550204BE204208DE5010F +S31A5000E6B150A0E18C309FE56210A0E308308DE50120A0E300307A +S31A5000E6C6A0E352FDFFEB54304BE200308DE558204BE204208D84 +S31A5000E6DBE530004BE264309FE56C10A0E308308DE50120A0E32D +S31A5000E6F00030A0E347FDFFEB0230A0E300308DE50020A0E304E0 +S31A5000E705208DE508208DE50600A0E138309FE50510A0E10C3038 +S31A5000E71A8DE5012082E20430A0E147FDFFEB000050E310000077 +S31A5000E72F0A50301BE5000053E30600001A10009FE59CECFFEB99 +S31A5000E7440A0000EA0C3C01501C3C0150A0390150243C01505801 +S31A5000E759301BE5000053E32030A00354300B054C001BE55410B8 +S31A5000E76E1BE5E5EEFFEB70A81BE90DC0A0E170D82DE904B04CBB +S31A5000E783E23CD04DE23C304BE240204BE200308DE50040A0E185 +S31A5000E79804208DE530604BE26C319FE50600A0E108308DE50170 +S31A5000E7AD50A0E160319FE57710A0E300C093E50120A0E344C031 +S31A5000E7C20BE50030A0E312FDFFEB0120A0E300208DE544304B5B +S31A5000E7D7E204308DE50010A0E308108DE530319FE50400A0E1C8 +S31A5000E7EC0C308DE50510A0E10630A0E112FDFFEB000050E34754 +S31A5000E80100000A40301BE5000053E30C00000A08019FE5441005 +S31A5000E8161BE53C201BE565ECFFEB38004BE23C201BE50810A087 +S31A5000E82BE3823262E0032182E08221A0E1C2EDFFEB020070E311 +S31A5000E8403700000A44301BE500C00FE100400FE1C04084E3046D +S31A5000E855F029E10E02A0E3021A80E2202090E4000031E1FCFF8C +S31A5000E86AFF1A0000A0E3160F07EE9A0F07EE101F11EE011AC1E5 +S31A5000E87FE3101F01EE0010A0E3151F07EE0000A0E10000A0E16F +S31A5000E8940000A0E10000A0E10000A0E10000A0E1101F11EE0CDB +S31A5000E8A910C1E3101F01EE0010A0E3161F07EE0E02A0E3021AC6 +S31A5000E8BE80E2202090E4000031E1FCFFFF1A0000A0E3160F0704 +S31A5000E8D3EE9A0F07EE0010A0E3151F07EE151F08EE0000A0E1E7 +S31A5000E8E80000A0E10000A0E10000A0E10000A0E10000A0E10040 +S31A5000E8FD10A0E3161F07EE171F08EE0300A0E1EFD9FFEB03008E +S31A5000E91200EA3C3C0150904501004C3C0150603C015070A81B18 +S31A5000E927E90DC0A0E110D82DE950009FE504B04CE21EECFFEBA6 +S31A5000E93C48409FE548009FE5483094E50FE0A0E103F0A0E13C87 +S31A5000E951009FE517ECFFEB38009FE5482094E50FE0A0E102F0EB +S31A5000E966A0E100300FE100400FE1C04084E304F029E11C209F35 +S31A5000E97BE50130A0E3003082E5FEFFFFEAA43C0150500000009A +S31A5000E990400D0300B43C015050C300000000039010A81BE90D1C +S31A5000E9A5C0A0E100D82DE904B04CE200A81BE90DC0A0E110D814 +S31A5000E9BA2DE904B04CE204D04DE21C409FE5003094E5000093DB +S31A5000E9CFE51C2093E511104BE20FE0A0E102F0A0E1000050E3E0 +S31A5000E9E4000000EA20360100F5FFFF1A10A81BE90DC0A0E1F080 +S31A5000E9F9D82DE904B04CE204D04DE20060A0E398529FE51D7002 +S31A5000EA0E4BE20540A0E1003095E5000093E51C2093E50710A01D +S31A5000EA23E10FE0A0E102F0A0E1000050E39A00000A1D305BE560 +S31A5000EA38013043E2170053E303F19F97290000EAA8EA0050B4FD +S31A5000EA4DEA0050F0EA0050E8EA0050F0EA0050F0EA0050F0EAAA +S31A5000EA620050F0EA0050F0EA0050F0EA0050F0EA0050F0EA0077 +S31A5000EA7750F0EA0050F0EA0050F0EA0050F0EA0050F0EA005012 +S31A5000EA8CF0EA0050F0EA0050F0EA0050F0EA0050F0EA0050F05D +S31A5000EAA1EA0050D4EA00501C3494E5013083E21C3484E51D305D +S31A5000EAB65BE5020053E30200001A203494E5013083E220348426 +S31A5000EACBE50160A0E3060000EA243494E5013083E2243484E5FF +S31A5000EAE00400E0E38C0000EA0300E0E38A0000EA000056E3C655 +S31A5000EAF5FFFF0A003095E5000093E5011B85E21C2093E508103D +S31A5000EB0A81E20FE0A0E102F0A0E1000050E36000000A003095F8 +S31A5000EB1FE5000093E5011B85E21C2093E5091081E20FE0A0E10B +S31A5000EB3402F0A0E1000050E35700000A0040A0E31D305BE5041B +S31A5000EB492085E2010053E3042485E5013BA0138030A00310348B +S31A5000EB5E85E5030054E10E0000AA0260A0E1003095E5000093D2 +S31A5000EB73E51C2093E50710A0E10FE0A0E102F0A0E1000050E3F0 +S31A5000EB884400000A1D305BE50430C6E7102495E5014084E2020F +S31A5000EB9D0054E1F1FFFFBA003095E5000093E5011B85E21C204E +S31A5000EBB293E50A1081E20FE0A0E102F0A0E1000050E3350000B8 +S31A5000EBC70A283495E5000053E30800000A003095E5000093E599 +S31A5000EBDC011B85E21C2093E50B1081E20FE0A0E102F0A0E10036 +S31A5000EBF10050E32900000AAC209FE5AC109FE50200D5E70130D4 +S31A5000EC06D5E7003023E0FF0053E30200000A66FFFFEB0500E03F +S31A5000EC1BE33E0000EA282495E5000052E32400000A00C0A0E317 +S31A5000EC30103495E50C40A0E103005CE10D0000AA046085E20329 +S31A5000EC4500A0E164E09FE50430D6E70C18A0E1014084E2213C81 +S31A5000EC5A23E08330A0E1B3209EE1000054E1212422E00228A080 +S31A5000EC6FE142C8A0E1F4FFFFBA38209FE538109FE50200D5E7BC +S31A5000EC840130D5E70C28A0E1003483E1220853E11F00000A065E +S31A5000EC9900E0E31E0000EA0200E0E31C0000EA20360100080417 +S31A5000ECAE000009040000948400000A0400000B04000002C0A057 +S31A5000ECC3E1103495E50C40A0E103005CE1090000AA040085E21C +S31A5000ECD80310A0E10430D0E70C28A0E1223883E00338A0E143E1 +S31A5000ECEDC8A0E1014084E2010054E1F7FFFFBA0600E0E31830D6 +S31A5000ED029FE50C20A0E10310D5E7FF2002E2020051E10000006F +S31A5000ED171A0000A0E3000000EA0A040000F0A81BE90DC0A0E112 +S31A5000ED2CF0DF2DE904B04CE20A80A0E30170A0E1030057E30277 +S31A5000ED4190A0E10300001A0130E0E3003089E50000E0E3F0AF45 +S31A5000ED561BE954519FE5343095E50000E0E30FE0A0E103F0A081 +S31A5000ED6BE10060A0E1342095E53C419FE50FE0A0E102F0A0E1C9 +S31A5000ED80143095E5003084E5342095E50600A0E10FE0A0E1020A +S31A5000ED95F0A0E100C094E500009CE50710A0E314309CE57D2EDE +S31A5000EDAAA0E30FE0A0E103F0A0E10020A0E3102484E50130A086 +S31A5000EDBFE3283484E52C2484E5147484E5182484E505A0A0E1CC +S31A5000EDD41C2484E50460A0E1202484E50650A0E1242484E513FE +S31A5000EDE970A0E300FFFFEB004050E20F00001ABC309FE50320B5 +S31A5000EDFED5E7000052E30500001A003095E5000093E50C2093B9 +S31A5000EE13E50610A0E30FE0A0E102F0A0E1104485E594209FE53D +S31A5000EE280130A0E30230C5E70400A0E1F0AF1BE9030074E31358 +S31A5000EE3D00001A018048E2000058E30030A0D3283485D56C00A5 +S31A5000EE529FE548309AE50FE0A0E103F0A0E100C096E5281496E9 +S31A5000EE67E500009CE5000051E30C209CE51510A0034310A0132B +S31A5000EE7C0FE0A0E102F0A0E1183496E5013083E2183486E5052F +S31A5000EE910074E30300000A0730A0E1017047E2000053E3D0FF5B +S31A5000EEA6FFCA0000E0E3004089E5F0AF1BE9500000002036017D +S31A5000EEBB00080400000C04000020A107000DC0A0E1F0DF2DE9D5 +S31A5000EED004B04CE20CD04DE22C000BE50030A0E334300BE501C6 +S31A5000EEE590A0E1A4019FE5030059E10030A0D30130A0C32C14D4 +S31A5000EEFA90E50060A0E1000051E30030A01330200BE5000053AD +S31A5000EF0FE37F00000A00A0A0E1103490E5000053E35E00001AA3 +S31A5000EF241380A0E364719FE5B0FEFFEB005050E21100001A5876 +S31A5000EF39119FE558419FE50120D6E70430D6E7030052E1460070 +S31A5000EF4E000A013043E2FF3003E2030052E10600001A003096C8 +S31A5000EF63E5000093E50C2093E50610A0E30FE0A0E102F0A0E1C6 +S31A5000EF78300000EA0750E0E3050075E33100000A040075E31FE7 +S31A5000EF8D00001A003096E5000093E50C2093E50610A0E30FE0B0 +S31A5000EFA2A0E102F0A0E1143496E5020053E31300001A00309622 +S31A5000EFB7E5281496E5000093E5000051E30C2093E51510A0033B +S31A5000EFCC4310A0130FE0A0E102F0A0E1183496E5013083E2187C +S31A5000EFE13486E582FEFFEB003096E50050A0E1000093E50C209C +S31A5000EFF693E50610A0E30FE0A0E102F0A0E10130A0E32C348622 +S31A5000F00BE50F0000EA003097E5281497E5000093E5000051E3AC +S31A5000F0200C2093E51510A0034310A0130FE0A0E102F0A0E11818 +S31A5000F0353497E5013083E2183487E50830A0E1018048E200000E +S31A5000F04A53E3B6FFFFCA000055E3110000AA30201BE500508292 +S31A5000F05FE50030E0E3103486E5290000EA003096E5000093E589 +S31A5000F0740C2093E50610A0E30FE0A0E102F0A0E10430D6E7011F +S31A5000F0893083E20430C6E7EEFFFFEA20360100080400000C045D +S31A5000F09E000010449AE52C001BE504149AE5040059E10940A04A +S31A5000F0B3B10420A0E191E8FFEB2C301BE534201BE5043083E0F2 +S31A5000F0C82C300BE510349AE5042082E034200BE5099064E00423 +S31A5000F0DD249AE5033064E010348AE5042082E004248AE50A00D4 +S31A5000F0F2A0E12C249AE5000059E30030A0D30130A0C30000529E +S31A5000F107E30030A013000053E380FFFF1A34001BE5F0AF1BE932 +S31A5000F11C0DC0A0E100D82DE93C009FE53C109FE504B04CE238A2 +S31A5000F131E09FE508D04DE234C09FE524349CE500308DE51824D9 +S31A5000F1469CE504208DE528349CE51C249CE5000053E320349C83 +S31A5000F15BE50E10A00114EAFFEB030000EAE83C01502C3D0150A1 +S31A5000F170303D01502036010000A81BE90DC0A0E100D82DE9082F +S31A5000F1850080E204B04CE2070050E300F19F97170000EAF0F198 +S31A5000F19A0050E8F10050E0F10050D8F10050D0F10050C8F1008D +S31A5000F1AF50C0F10050B8F1005040009FE500A81BE93C009FE57B +S31A5000F1C400A81BE938009FE500A81BE934009FE500A81BE93038 +S31A5000F1D9009FE500A81BE92C009FE500A81BE928009FE500A8EB +S31A5000F1EE1BE924009FE500A81BE920009FE500A81BE9383D0198 +S31A5000F203504C3D01506C3D0150783D0150843D0150903D015046 +S31A5000F218A03D0150B43D0150CC3D01500DC0A0E130D82DE90451 +S31A5000F22DB04CE20040A0E1103F11EE2351A0E1015015E20C0040 +S31A5000F242000A0E02A0E3021A80E2202090E4000031E1FCFFFF86 +S31A5000F2571A0000A0E3160F07EE9A0F07EE101F11EE0C10C1E309 +S31A5000F26C101F01EE0010A0E3161F07EE94C09FE594E09FE594F8 +S31A5000F281309FE594209FE5FE1404E2003081E58C309FE5002048 +S31A5000F29681E5003084E5000091E50E3000E00E0053E101000037 +S31A5000F2AB0A01C05CE2F9FFFF1A6C309FE56C209FE5033000E09B +S31A5000F2C0002081E5000053E30B00000A043094E40128A0E301B9 +S31A5000F2D50073E30500001A042042E2000052E3020000DA0430CC +S31A5000F2EA94E4010073E3F9FFFF0A000052E30000A003000055BC +S31A5000F2FFE30200000A101F11EE0F1081E3101F01EE30A81BE90A +S31A5000F314404B4C00800080005000500020002000D000D0007EB9 +S31A5000F329007E00FF00FF000DC0A0E1F0D92DE904B04CE200608E +S31A5000F33EA0E10150A0E10240A0E100C0A0E3103F11EE2371A089 +S31A5000F353E1017017E20C00000A0E02A0E3021A80E2202090E429 +S31A5000F368000031E1FCFFFF1A0000A0E3160F07EE9A0F07EE10C9 +S31A5000F37D1F11EE0C10C1E3101F01EE0010A0E3161F07EEAC3090 +S31A5000F3929FE5AC809FE5FE0406E2003080E5070000EAA0309FFD +S31A5000F3A7E5003080E5042096E4045085E20E0052E190C09F15E3 +S31A5000F3BC1700001A044044E2000054E3140000DA80309FE58072 +S31A5000F3D1109FE5003080E5002095E5002086E500C090E502E06C +S31A5000F3E6A0E108300CE0080053E10600000A4C209FE501105179 +S31A5000F3FBE20700000A00C090E502300CE0020053E1F9FFFF1A1A +S31A5000F41044309FE503300CE0000053E3E0FFFF0A24309FE50084 +S31A5000F4253080E5000057E30200000A101F11EE0F1081E3101FC1 +S31A5000F43A01EE0C00A0E1F0A91BE95000500080008000FF00FFB0 +S31A5000F44F001099109910001000404B4C007E007E000DC0A0E1BF +S31A5000F46400D82DE904B04CE200E0A0E1103F11EE23C1A0E10158 +S31A5000F479C01CE21000000A0E02A0E3021A80E2202090E400008B +S31A5000F48E31E1FCFFFF1A160F07EE9A0F07EE0000A0E10000A014 +S31A5000F4A3E10000A0E10000A0E10000A0E10000A0E1101F11EEEB +S31A5000F4B80C10C1E3101F01EE161F07EE50209FE550309FE505E4 +S31A5000F4CD12A0E3003081E5012042E2000052E3FCFFFFCA00204B +S31A5000F4E2A0E3043091E4012082E20130CEE4330052E3FAFFFFCB +S31A5000F4F79A24309FE5003081E500005CE30200000A101F11EE29 +S31A5000F50C0F1081E3101F01EE0000A0E300A81BE9400D030098DC +S31A5000F521009800FF00FF000DC0A0E100D82DE9030040E204B0D4 +S31A5000F5364CE2040050E300F19F97080000EA58F5005058F50002 +S31A5000F54B5058F5005060F5005060F500500A00A0E300A81BE9E5 +S31A5000F5600200A0E300A81BE90500A0E300A81BE90DC0A0E1008D +S31A5000F575D82DE90C309FE5002093E504B04CE2440092E500A8A0 +S31A5000F58A1BE9384401000DC0A0E100D82DE90010A0E10F00A019 +S31A5000F59FE304B04CE2BBE0FFEB00A81BE90DC0A0E110D82DE9BF +S31A5000F5B404B04CE20040A0E11900A0E3ACE0FFEB0020A0E32470 +S31A5000F5C94EA0E10F0054E304F19F97560000EA18F6005024F6DF +S31A5000F5DE00502CF6005038F6005040F6005048F6005054F60024 +S31A5000F5F35060F6005070F6005084F6005094F60050B4F6005063 +S31A5000F608D4F6005000F7005028F7005030F70050202FA0E1017F +S31A5000F61D2002E2430000EA202FA0E10D0000EAA02EA0E101201A +S31A5000F63202E23E0000EAA02EA0E1080000EAA02FA0E13A000096 +S31A5000F647EA0020E0E1A22FA0E1370000EA202EA0E1012002E246 +S31A5000F65C340000EA202EA0E1012022E2012002E2300000EA060C +S31A5000F6712200E2020252E30020A0130120A0032B0000EA06221D +S31A5000F68600E2022252E20120A013270000EA092200E20000529B +S31A5000F69BE30030A0130130A003090252E30320A0110120A00392 +S31A5000F6B01F0000EA092200E2010252E30030A0130130A00302E8 +S31A5000F6C50152E30320A0110120A003170000EA093200E20000EE +S31A5000F6DA53E309025313202FA0E1012022E20030A0130130A075 +S31A5000F6EF03000053E3012002120020A0030C0000EA093200E26C +S31A5000F704010253E302015313202FA0E10030A0130130A0030071 +S31A5000F7190053E3012002020120A013020000EA0120A0E30000C6 +S31A5000F72E00EA0020A0E30200A0E110A81BE90DC0A0E130D82D21 +S31A5000F743E904B04CE20050A0E10F0005E248E0FFEB0040A0E1F6 +S31A5000F758100015E30200001A3E3D05E2C303A0E1020000EA0F7E +S31A5000F76D0C05E22004A0E13FE0FFEB603005E2C332A0E10300A0 +S31A5000F78253E303F19F97130000EA9CF70050A4F70050ACF7004E +S31A5000F79750B4F700501440A0E10D0000EA3440A0E10B0000EA06 +S31A5000F7AC5440A0E1090000EA000050E30600001AA440A0E11919 +S31A5000F7C100A0E32BE0FFEB020210E3023184E30340A0110000E0 +S31A5000F7D600EA7440A0E10400A0E130A81BE90DC0A0E1F0D82D05 +S31A5000F7EBE904B04CE20040A0E10150A0E1033305E2233DA0E157 +S31A5000F800030053E303F19F97B90000EA1CF800509CF9005050FE +S31A5000F815FA0050ACF90050D8229FE5FF32C5E3020053E10200BA +S31A5000F82A001A0F0005E210E0FFEBF0A81BE9047084E20F3A05C5 +S31A5000F83FE20F0A53E35200001AB0329FE5B0229FE5033005E0ED +S31A5000F854020053E14D00000A0F0805E22008A0E103E0FFEB0048 +S31A5000F86960A0E1020415E30400001A050AA0E1200AA0E1AEFF4F +S31A5000F87EFFEB0040A0E1030000EAFF4005E20F3C05E2A333A0B9 +S31A5000F893E17443A0E11E3605E2A33AA0E10F0053E303F19F97E9 +S31A5000F8A8390000EAECF80050F4F80050FCF8005004F900500CC5 +S31A5000F8BDF9005014F9005030F9005054F9005094F9005094F9BA +S31A5000F8D2005094F9005094F9005078F9005080F9005088F900B6 +S31A5000F8E75090F90050047006E0270000EA047026E0250000EA99 +S31A5000F8FC067064E0230000EA047066E0210000EA047086E01F1C +S31A5000F9110000EA1900A0E3D6DFFFEBA00EA0E1010000E2043020 +S31A5000F92686E0007083E0180000EA1900A0E3CFDFFFEBA00EA0B9 +S31A5000F93BE1010000E2063064E0000050E30370A0110170430216 +S31A5000F9500F0000EA1900A0E3C6DFFFEBA00EA0E1010000E20412 +S31A5000F9653066E0000050E30370A01101704302060000EA047050 +S31A5000F97A86E1040000EA0470A0E1020000EA0470C6E1000000D1 +S31A5000F98FEA0470E0E10700A0E1F0A81BE964219FE5023005E0AA +S31A5000F9A4020053E10100001A040084E2F0A81BE9010615E3FBA7 +S31A5000F9B9FFFF0A0F3A05E20F0A53E3F8FFFF1A0F4805E22408E2 +S31A5000F9CEA0E1A8DFFFEB083080E20F0854E30060A0110360A0E0 +S31A5000F9E301010415E31600000A020415E30900001A020515E37B +S31A5000F9F80300000A053AA0E1233AA0E1036086E00E0000EA0533 +S31A5000FA0D3AA0E1233AA0E1066063E00A0000EA020515E3040055 +S31A5000FA22000A050AA0E1200AA0E142FFFFEB006086E003000040 +S31A5000FA37EA050AA0E1200AA0E13DFFFFEB066060E0000096E5F8 +S31A5000FA4CF0A81BE9027415E21A00001A010615E3D2FFFF0A0237 +S31A5000FA610915E3D0FFFF0A0F4805E22408A0E180DFFFEB0830F5 +S31A5000FA7680E20F0854E30060A0110360A00107C0A0E10C20A04C +S31A5000FA8BE178309FE5020505E2031005E05132A0E1010013E322 +S31A5000FAA001C08C12012082E20E0052E3F9FFFFDA000050E30CC4 +S31A5000FAB5618610E2FFFF1A046046E2E0FFFFEA0500A0E1B7FE66 +S31A5000FACAFFEB000050E3B5FFFF0AFF34C5E30311A0E10205156B +S31A5000FADFE33F0381E30800801208008102000084E0F0A81BE90E +S31A5000FAF40000A0E3F0A81BE910FF2F010000BF0F00000F01105B +S31A5000FB09000002FFFF00000DC0A0E170D82DE90118A0E14128E2 +S31A5000FB1EA0E1211EA0E1041041E204B04CE20060A0E102308689 +S31A5000FB33E2015083E30B0051E301F19F973E0000EA74FB005080 +S31A5000FB4840FC005040FC005040FC005040FC005040FC00504056 +S31A5000FB5DFC005040FC005040FC0050A0FB0050D4FB00500CFCC7 +S31A5000FB7200500228A0E1C8309FE52208A0E1033002E047045353 +S31A5000FB87E32C00001A780000E2A001A0E137DFFFEB0050A0E19D +S31A5000FB9C270000EA0238A0E10F0403E20002A0E12348A0E17D4E +S31A5000FBB1FEFFEB000050E32000000AFF3004E28300A0E180000B +S31A5000FBC614E3800BE011A00BE011090000EA0238A0E1020313FF +S31A5000FBDBE32318A0E11600001A813AA0E1A33AA0E18300A0E152 +S31A5000FBF0010B11E3800AE011A00AE011043080E2033086E00164 +S31A5000FC055083E30C0000EA3E1BE0E30228A0E1013802E02302E1 +S31A5000FC1AA0E1010312E38004E011A004E011B230D6E10130032E +S31A5000FC2FE0830080E1042080E2022086E0015082E30500A0E15C +S31A5000FC4470A81BE9000087FF0DC0A0E130D82DE90F00A0E304B1 +S31A5000FC59B04CE205DFFFEB0040A0E11900A0E302DFFFEB20004C +S31A5000FC6E10E30600000A0400A0E1B010D0E1A3FFFFEB88309F4F +S31A5000FC83E5000083E580109FE50F0000EA005094E50500A0E16D +S31A5000FC9843FEFFEB000050E30600000A0400A0E10510A0E15C1C +S31A5000FCAD409FE5CBFEFFEB000084E550109FE5030000EA4820D3 +S31A5000FCC29FE5043084E20210A0E1003082E5004091E5010014C4 +S31A5000FCD7E30600000A30309FE50120C4E3B000D2E128109FE504 +S31A5000FCECB000C3E1B010C2E130A81BE91C309FE5002094E51899 +S31A5000FD01109FE5002083E5001084E530A81BE994860000543A7E +S31A5000FD160100BEBEFFFF503A0100FEDEFFE70DC0A0E100D82D67 +S31A5000FD2BE944309FE50300A0E1001093E504B04CE2000051E36A +S31A5000FD400B00000A010011E30400000A28209FE5B020D2E101F0 +S31A5000FD5530C1E3B020C3E1020000EA18309FE5002093E500208B +S31A5000FD6A81E50030A0E3003080E500A81BE994860000543A012B +S31A5000FD7F00503A01000DC0A0E100D82DE904B04CE200A81BE9C4 +S31A5000FD940DC0A0E100D82DE904B04CE200A81BE90DC0A0E100EC +S31A5000FDA9D82DE90F00A0E304B04CE2AFDEFFEB0C309FE5030053 +S31A5000FDBE50E10000A0130100A00300A81BE97C4900500DC0A024 +S31A5000FDD3E110D82DE90F00A0E304B04CE2A4DEFFEB0040A0E145 +S31A5000FDE81900A0E3A1DEFFEB200010E302408412044084020FE7 +S31A5000FDFD00A0E30410A0E1A3DEFFEB10A81BE90DC0A0E100D836 +S31A5000FE122DE96C309FE504B04CE200C093E500005CE3010000F5 +S31A5000FE270A0000A0E300A81BE954209FE5001092E50130C1E3E3 +S31A5000FE3C030050E10E00001A010011E30200000AB430D2E1B0B7 +S31A5000FE5130C0E1010000EA043092E5003080E50030A0E3003067 +S31A5000FE6682E50300A0E3D2E0FFEB0300A0E3A0E0FFEB0100A017 +S31A5000FE7BE300A81BE90C00A0E100A81BE998860000583A0100A3 +S31A5000FE900DC0A0E130D82DE984209FE50030A0E380509FE50468 +S31A5000FEA5B04CE2001095E50040A0E1003082E5030051E10100FC +S31A5000FEBA000A0100A0E1D1FFFFEB003095E5000053E3130000A4 +S31A5000FECF1A1900A0E367DEFFEB200010E30600000A013084E328 +S31A5000FEE4003085E53C209FE5B030D4E1B430C5E1B020C4E104A1 +S31A5000FEF90000EA004085E528209FE5003094E5043085E50020D7 +S31A5000FF0E84E50300A0E3A8E0FFEB0300A0E376E0FFEB30A81B6E +S31A5000FF23E998860000583A0100BEBEFFFFFEDEFFE70DC0A0E14F +S31A5000FF3800D82DE910309FE5000093E504B04CE2000050E2011F +S31A5000FF4D00A01300A81BE9583A01000DC0A0E100D82DE900100B +S31A5000FF6290E50000A0E30C0081E51C30A0E31C3081E50820A081 +S31A5000FF77E3002081E504B04CE2040081E5173043E2083081E560 +S31A5000FF8C052042E20C2081E500A81BE90DC0A0E100D82DE90047 +S31A5000FFA10090E5FF1001E2203090E504B04CE2040013E30200EB +S31A5000FFB6001A203090E5040013E3FCFFFF0A141080E500A81BB7 +S31A5000FFCBE90DC0A0E100D82DE9000090E5203090E504B04CE28A +S31A5000FFE0023013E20500000A143090E50030C1E50420A0E31C2E +S31A5000FFF52080E50100A0E300A81BE90300A0E100A81BE90DC0EF +S31A5001000AA0E130D82DE904B04CE204D04DE20050A0E115404B95 +S31A5001001FE20500A0E10410A0E1E7FFFFEB000050E3FAFFFF0A73 +S31A5001003415005BE530A81BE90DC0A0E170D82DE904B04CE201A0 +S31A5001004960A0E10240A0E10430A0E1014044E2000053E3005005 +S31A5001005EA0E10600000A0110D6E40500A0E1C9FFFFEB0430A0CE +S31A50010073E1014044E2000053E3F8FFFF1A70A81BE90DC0A0E129 +S31A5001008870D82DE904B04CE20160A0E10240A0E10430A0E10171 +S31A5001009D4044E2000053E30050A0E10600000A0500A0E1D4FF21 +S31A500100B2FFEB0430A0E1014044E20100C6E4000053E3F8FFFF05 +S31A500100C71A70A81BE90DC0A0E1F0D82DE904B04CE20050A0E1B8 +S31A500100DC043095E50160A0E13C709FE5033183E08340A0E1031A +S31A500100F10000EA483097E56400A0E30FE0A0E103F0A0E10500F5 +S31A50010106A0E10610A0E1AEFFFFEB000050E30200001A0140440A +S31A5001011BE2010074E3F3FFFF1AF0A81BE9500000000DC0A0E1F9 +S31A500101300E002DE910D82DE910B04CE204309BE50040A0E304D8 +S31A500101453043E2030053E303F19F971E0000EA8C01015064014B +S31A5001015A0150B8010150C401015054209FE50130A0E30030826A +S31A5001016FE5001090E50C3091E5083083E30C3081E5080090E54B +S31A500101847DD2FFEB100000EA2C209FE5004092E50030A0E300A2 +S31A500101993082E5001090E50C3091E50830C3E30C3081E50800A4 +S31A500101AE90E566D2FFEB050000EA084090E5030000EAB486007B +S31A500101C30008309BE5044090E5043080E50400A0E110A81BE985 +S31A500101D80DC0A0E170D82DE904B04CE204D04DE200C090E520D5 +S31A500101ED409CE514309CE519304BE50420A0E31C208CE5005003 +S31A50010202A0E3080090E50160A0E1ABE0FFEB005086E502001468 +S31A50010217E30600000A19004BE20110A0E3D7E1FFEB050050E1D6 +S31A5001022C0130A013003086150150A0E30500A0E170A81BE90D34 +S31A50010241C0A0E170D82DE984509FE50000E0E3343095E504B005 +S31A500102564CE20FE0A0E103F0A0E170409FE50060A0E10400A071 +S31A5001026BE139FFFFEB343095E50000A0E30FE0A0E103F0A0E1DF +S31A50010280141095E550309FE550209FE5004081E5043081E548F4 +S31A50010295309FE5082081E50C3081E540209FE540309FE5102011 +S31A500102AA81E5143081E538209FE538309FE5182081E51C3081A5 +S31A500102BFE5342095E50600A0E10FE0A0E102F0A0E170A81BE99A +S31A500102D4500000009C8600003C0001508400015098FF005008FB +S31A500102E90001502C010150D8010150CC0001500DC0A0E100D86D +S31A500102FE2DE91C209FE5003092E504B04CE2000053E3020000FD +S31A500103131A0130A0E3003082E5C7FFFFEB00A81BE9B88600007F +S31A500103280DC0A0E170D82DE90118A0E16C309FE504B04CE20021 +S31A5001033D40A0E10250A0E14108A0E100C093E50360A0E10000DA +S31A500103525CE30900000A0038A0E12328A0E1B430DCE102005372 +S31A50010367E10100001A0000E0E370A81BE900C09CE500005CE3CF +S31A5001037CF7FFFF1A0008A0E12008A0E1CDE9FFEBB400C4E108D3 +S31A500103915084E5003096E5003084E50000A0E3004086E570A8BD +S31A500103A61BE9603A01000DC0A0E1F0D92DE90008A0E14008A0AE +S31A500103BBE15C309FE504B04CE20060A0E3005093E50380A0E154 +S31A500103D0060055E11000000A0078A0E1B440D5E12708A0E1B662 +S31A500103E5E9FFEB000054E10600001A000056E30200000A00300F +S31A500103FA95E5003086E5010000EA003095E5003088E50560A04B +S31A5001040FE1005095E5000055E3EFFFFF1AF0A91BE9603A01005F +S31A500104240DC0A0E1F0D92DE9BC309FE504D04DE20070A0E108D3 +S31A500104396097E504B04CE2B620D6E10180A0E1045097E5030037 +S31A5001044E52E10030A003B630C601B430D6E1B230C5E1B400D6E2 +S31A50010463E196E9FFEB0040A0E10500A0E119E9FFEB0020A0E10F +S31A500104780600A0E10410A0E1F2E8FFEB0008B0E11D00001A6008 +S31A5001048D309FE5005093E5000055E31900000AB420D5E1B230C0 +S31A500104A2D6E1030052E11200001AB400D6E183E9FFEB0840408C +S31A500104B7E2B000D6E180E9FFEB0038A0E10500A0E1081086E27E +S31A500104CC2338A0E100308DE50420A0E10830A0E10FE0A0E10870 +S31A500104E1F095E50700A0E1CAE8FFEB060000EAFFFF0000603A99 +S31A500104F60100005095E5000055E3E5FFFF1A0700A0E1C2E8FF69 +S31A5001050BEBF0A91BE90DC0A0E1F0DF2DE90338A0E104B04CE22B +S31A500105200160A0E100A0A0E10290A0E1E8C09FE54378A0E1F4FD +S31A5001053550DBE10C0056E13500008AD8009FE593E8FFEB00800B +S31A5001054A50E23100000A083086E2BC30C8E1084098E50508A031 +S31A5001055FE1045098E52008A0E155E9FFEBB000C4E10708A0E1C8 +S31A500105742008A0E151E9FFEBB200C4E1BC00D8E14EE9FFEB0061 +S31A5001058930A0E30A10A0E1B400C4E10620A0E1B630C4E1080025 +S31A5001059E84E257E3FFEB0C0085E274109FE50420A0E353E3FF10 +S31A500105B3EB100085E20910A0E10420A0E34FE3FFEB1170A0E319 +S31A500105C80970C5E5B430D4E1B230C5E1BC60D8E10500A0E1BE6A +S31A500105DDE8FFEB0020A0E10400A0E10610A0E197E8FFEB0008B2 +S31A500105F2A0E12008A0E131E9FFEB0710A0E1B600C4E10920A0B3 +S31A50010607E10800A0E1DCE7FFEB0800A0E17FE8FFEBF0AF1BE9F3 +S31A5001061CBE050000EA050000588400000DC0A0E1F0D92DE904B3 +S31A50010631B04CE210D04DE20080A0E10240A0E10400A0E10170B6 +S31A50010646A0E12C604BE20610A0E10350A0E17FEDFFEB000050FD +S31A5001065BE30F0000BAB400D4E116E9FFEB0048A0E1B400D5E102 +S31A500106702448A0E112E9FFEB0038A0E10800A0E10710A0E1234F +S31A5001068538A0E100308DE50620A0E10430A0E19DFFFFEB0000CC +S31A5001069AA0E3030000EA0C009FE50C109FE5C2E4FFEB0000E0E4 +S31A500106AFE3010000EADC3D0150003E0150F0A91BE90DC0A0E12D +S31A500106C4F0D92DE964009FE50240A0E1004080E55C809FE50437 +S31A500106D9B04CE2000098E50370A0E1F450DBE14C609FE504E34F +S31A500106EEFFEB003096E5000053E30900000A0508A0E12008A06C +S31A50010703E1EEE8FFEB001096E5B400C1E1003097E5003081E5C6 +S31A500107180020A0E3002088E5F0A91BE914009FE50410A0E1A1DA +S31A5001072DE4FFEBF0A91BE9683A0100643A01006C3A0100103EBE +S31A5001074201500DC0A0E1F0DF2DE904B04CE20CD04DE20050A0EA +S31A50010757E1B400D3E10160A0E104909BE50270A0E1D5E8FFEB5D +S31A5001076C0048A0E134004BE214209FE52418A0E1E9FEFFEB00B1 +S31A500107810050E3020000AA0000E0E31F0000EAC00601507810C2 +S31A500107969FE578009FE578309FE5041099E8005081E50480A0DC +S31A500107ABE1006080E501A0A0E1007083E50060E0E30070A0E12E +S31A500107C0821262E054009FE5012182E0901C83E02333A0E18233 +S31A500107D55183E0EDE6FFEB0040A0E1EBE6FFEB000064E0050082 +S31A500107EA50E10400002A4DE8FFEB00309AE5000053E3F7FFFF4B +S31A500107FF1A006097E52808A0E1E7FEFFEB0600A0E1030000EAA4 +S31A50010814643A0100683A01006C3A0100D34D6210F0AF1BE90D4D +S31A50010829C0A0E170D82DE9AC309FE504B04CE20160A0E1004060 +S31A5001083E93E50350A0E1000054E31800001A50EBFFEB90009F45 +S31A50010853E5043090E5050053E30500001AB831D0E1000053E381 +S31A500108680000001A78EBFFEB0400A0E170A81BE9000053E304E2 +S31A5001087D00001A670100EB0A30A0E30030C6E50100A0E370A86E +S31A500108921BE950409FE58020A0E30410A0E18AEBFFEB44309FB8 +S31A500108A7E5000085E5004083E5000095E5000050E30800000A2F +S31A500108BC2CC09FE500109CE50130D1E40030C6E5002095E50173 +S31A500108D100A0E300108CE5012042E2002085E570A81BE9C08686 +S31A500108E600007C3A0100D0400100504101000DC0A0E170D82D89 +S31A500108FBE904B04CE204D04DE20040A0E10150A0E1C5FFFFEB82 +S31A50010910000050E32A00000A0030D5E5FF0053E32700001A199B +S31A50010925604BE20400A0E119104BE2BCFFFFEB000050E3FAFF2D +S31A5001093AFF0A19305BE5F40053E30D00001A0400A0E10330A016 +S31A5001094FE30030C5E5FF10A0E3670000EB0400A0E1FC10A0E387 +S31A50010964640000EB0400A0E10610A0E3610000EB2E0000EB0154 +S31A5001097900A0E3100000EAFD0053E30E00001A0400A0E106109F +S31A5001098EA0E1A4FFFFEB000050E3FAFFFF0A0400A0E1FF10A086 +S31A500109A3E3540000EB0400A0E1FC10A0E3510000EB19105BE50D +S31A500109B80400A0E14E0000EB0000A0E370A81BE90DC0A0E170B8 +S31A500109CDD82DE904B04CE204D04DE26440A0E30060A0E119507A +S31A500109E24BE2090000EA014054E20200001A0F0000EB6440A0B8 +S31A500109F7E3040000EA28309FE5482093E56400A0E30FE0A0E1B0 +S31A50010A0C02F0A0E10600A0E10510A0E1B5FFFFEB000050E3F02D +S31A50010A21FFFF0A19005BE5000000EA5000000070A81BE90DC0E5 +S31A50010A36A0E1F0DD2DE9A4709FE504B04CE20760A0E19C509F03 +S31A50010A4BE59C409FE59CA09FE59C809FE50A0000EA0400A0E121 +S31A50010A60002095E50610A0E154EBFFEB000050E3030000DA00C0 +S31A50010A753095E5006086E0033060E0003085E5C2EAFFEB0030D2 +S31A50010A8A95E5000053E30800000A043094E5050053E301000055 +S31A50010A9F1A0400A0E1EAEAFFEB043094E5000053E3E9FFFF1AAA +S31A50010AB4DA0000EB00708AE50060A0E3006085E50400A0E1D32D +S31A50010AC9EAFFEB443098E5060053E10200000A446088E506009F +S31A50010ADEA0E1B7DFFFEBF0AD1BE954410100C48600007C3A0173 +S31A50010AF30054420100500000000DC0A0E110D82DE9A8209FE518 +S31A50010B08A8409FE5003092E5FF1001E20110C3E4240051E3006C +S31A50010B1D3082E504B04CE20130A00300308405002094E52300AA +S31A50010B3251E30030A0130130A003000052E30030A00300005311 +S31A50010B47E30500000A68209FE50130A0E3003082E560109FE505 +S31A50010B5C013043E2003081E558209FE5003092E5013083E20008 +S31A50010B713082E5010C53E30900000A38309FE5002093E50000A7 +S31A50010B8652E30800000A2C209FE5003092E5013083E2003082FD +S31A50010B9BE5030053E30200001AA2FFFFEB0030A0E3003084E5DD +S31A50010BB010A81BE954420100703A0100743A0100783A0100C4B5 +S31A50010BC58600000DC0A0E110D82DE904B04CE2790000EB00406C +S31A50010BDAA0E114009FE514109FE5472FA0E372E3FFEB0400A012 +S31A50010BEFE1820000EB10A81BE9FC3E0150043F01500DC0A0E123 +S31A50010C0410D82DE904B04CE26B0000EB0040A0E114009FE514E1 +S31A50010C19109FE514209FE564E3FFEB0400A0E1740000EB10A856 +S31A50010C2E1BE9FC3E0150143F01502E0100000DC0A0E1F0D82DB5 +S31A50010C43E904B04CE20060A0E10150A0E177FFFFEB44209FE57F +S31A50010C58003092E540709FE5033183E08340A0E1030000EA4845 +S31A50010C6D3097E56400A0E30FE0A0E103F0A0E10600A0E1051008 +S31A50010C82A0E11AFFFFEB000050E30200001A014044E201007457 +S31A50010C97E3F3FFFF1AF0A81BE9BC860000500000000DC0A0E187 +S31A50010CAC0E002DE930D82DE910B04CE204309BE50050A0E30421 +S31A50010CC13043E2040053E303F19F97240000EA140D0150E40C9E +S31A50010CD60150340D0150400D0150600D015068409FE568309F10 +S31A50010CEBE5001094E50120A0E3002083E5000051E30100001AB4 +S31A50010D0008F2FFEB000084E5000094E59BCFFFEB130000EA3C34 +S31A50010D15309FE534209FE5005093E5000092E50010A0E3001004 +S31A50010D2A83E587CFFFEB0B0000EA18309FE5005093E508000024 +S31A50010D3FEA14209FE508309BE5005092E5003082E5030000EAA3 +S31A50010D54C8860000CC860000BC86000033FFFFEB0500A0E1307F +S31A50010D69A81BE90DC0A0E130D82DE904B04CE204D04DE20040E1 +S31A50010D7EA0E10200A0E10150A0E1CCDDFFEB0400A0E10030A04B +S31A50010D93E3003085E515104BE2D4FEFFEB000050E30300000A29 +S31A50010DA815305BE5030053E30130A003003085050100A0E330DF +S31A50010DBDA81BE90DC0A0E130D82DE92C409FE50000E0E334309B +S31A50010DD294E504B04CE20FE0A0E103F0A0E10050A0E1343094AD +S31A50010DE7E50000A0E30FE0A0E103F0A0E10500A0E130A81BE9F2 +S31A50010DFC500000000DC0A0E100D82DE910309FE5342093E5046B +S31A50010E11B04CE20FE0A0E102F0A0E100A81BE9500000000DC0EB +S31A50010E26A0E110D82DE944109FE544209FE50030A0E3003081BD +S31A50010E3BE53C409FE5000092E5343094E504B04CE20FE0A0E1C0 +S31A50010E5003F0A0E128209FE5303094E5000092E50FE0A0E10333 +S31A50010E65F0A0E118209FE50130A0E3003082E510A81BE9F044B9 +S31A50010E7A0100C840010050000000CC4001008C4501000DC0A066 +S31A50010E8FE170D82DE970309FE570209FE50150A0E3005083E5F4 +S31A50010EA404B04CE264409FE50030A0E3003082E50060E0E33437 +S31A50010EB92094E50600A0E10FE0A0E102F0A0E148309FE50000CE +S31A50010ECE83E5342094E50500A0E10FE0A0E102F0A0E130109446 +S31A50010EE3E50600A0E10FE0A0E101F0A0E124309FE5000083E515 +S31A50010EF8302094E50500A0E10FE0A0E102F0A0E170A81BE9F050 +S31A50010F0D4401008C45010050000000C8400100CC4001000DC02E +S31A50010F22A0E170D82DE9AC609FE5003096E504B04CE200005314 +S31A50010F37E31E00001A9C409FE5343094E50000E0E30FE0A0E1C3 +S31A50010F4C03F0A0E10050A0E1343094E50100A0E30FE0A0E10320 +S31A50010F61F0A0E1141094E574309FE574209FE5043081E570309C +S31A50010F769FE5082081E50C3081E568209FE568309FE510208182 +S31A50010F8BE5143081E560209FE560309FE5182081E51C3081E503 +S31A50010FA0342094E50500A0E10FE0A0E102F0A0E10130A0E300FB +S31A50010FB53086E540309FE540409FE5B010D3E10400A0E177E9E4 +S31A50010FCAFFEB34209FE5043094E5003082E570A81BE9D0860043 +S31A50010FDF0050000000C80B0150000C0150FC0A0150C80901505C +S31A50010FF4A80C01506C0D01503C0C0150804501007C3A0100C4E8 +S31A500110094001000DC0A0E130D82DE904B04CE25DE9FFEB783014 +S31A5001101E9FE578109FE5002093E50350A0E1040091E50140A00F +S31A50011033E1000052E11400000A040050E30E00001A90FFFFEB47 +S31A5001104854309FE554009FE5000083E550109FE50130A0E3005C +S31A5001105D3081E548109FE548309FE50D20A0E30020C0E5003014 +S31A5001107281E53C209FE50030A0E3003082E5043094E500005382 +S31A50011087E30000001AA3FFFFEB043094E5003085E530A81BE951 +S31A5001109CC44001007C3A010050410100D0400100C086000054EF +S31A500110B142010054410100C48600000DC0A0E1F0DF2DE950012C +S31A500110C69FE550119FE550319FE550519FE550419FE501A0A0D5 +S31A500110DBE300A085E50080A0E3008081E504B04CE2003084E558 +S31A500110F00A20A0E1E0C8FFEB0410A0E12C019FE50220A0E3DC90 +S31A50011105C8FFEB0510A0E120019FE50A20A0E11C719FE5D7C836 +S31A5001111AFFEB0710A0E114019FE50520A0E310619FE5D2C8FF18 +S31A5001112FEB0610A0E108019FE50520A0E304419FE5CDC8FFEB55 +S31A50011144008084E5A4EFFFEB45E5FFEBF4809FE50590A0E1F0C7 +S31A50011159309FE50450A0E1030058E10360A0E10900000A0A4024 +S31A5001116EA0E10800A0E10FE0A0E104F098E5000050E30C408823 +S31A50011183150C008805108088E2060058E1F6FFFF1AB8309FE59F +S31A50011198002093E5000052E30200001AAC009FE502E2FFEBF014 +S31A500111ADAF1BE9003099E5000053E30600000A98009FE54300D0 +S31A500111C200EB000050E30200000A8C009FE5F8E1FFEB010000C3 +S31A500111D7EA0130A0E3003085E5003095E5000053E30A00000A80 +S31A500111EC0700A0E15EECFFEB0010A0E164009FE5EDE1FFEB3872 +S31A50011201009FE559ECFFEB0010A0E154009FE5E8E1FFEB41FF72 +S31A50011216FFEBF0AF1BE9783E0150E844010028230000FC44011F +S31A5001122B0080450100503E0150A83E015058840000C43E01504C +S31A50011240B4450100EC3E0150CC460100EC880000FC880000ECD6 +S31A50011255440100203F0150A0450100403F01506C3F0150743FD3 +S31A5001126A01500DC0A0E110D82DE94C309FE504B04CE200009306 +S31A5001127FE50140A0E1000050E30000000A1CE0FFEB0030D4E550 +S31A50011294020053E30900001A1C0084E224109FE50620A0E3515F +S31A500112A9E2FFEB000050E30300001A101084E210009FE504207F +S31A500112BEA0E30FE0FFEB10A81BE958420100E044010058840010 +S31A500112D3000DC0A0E1F0DF2DE90010A0E34B2FA0E36C319FE5CB +S31A500112E804B04CE252DF4DE2000083E5165E4BE20500A0E13495 +S31A500112FDE0FFEB54419FE554119FE50030A0E30030C4E50130FC +S31A50011312C4E50230C4E50330C4E50100A0E33C219FE528304B07 +S31A50011327E20200C3E734319FE528204BE20300C2E72CC19FE551 +S31A5001133C0620A0E328304BE20C20C3E720319FE55C310BE5519E +S31A500113510F4BE2EADFFFEBFFC0A0E3053DE0E328104BE203C0D2 +S31A50011366C1E74F2FE0E30130A0E102C0C3E7F8309FE503C0C1E4 +S31A5001137BE7F4109FE528304BE201C0C3E7EC309FE528104BE2A2 +S31A5001139003C0C1E7E4109FE528304BE201C0C3E70270A0E3D851 +S31A500113A5309FE528104BE203C0C1E70590A0E1CC109FE528308A +S31A500113BA4BE201C0C3E70480A0E1C0309FE528104BE203C0C1CD +S31A500113CFE70850A0E1013083E203C0C1E734004BE2A8209FE544 +S31A500113E44410A0E3CEFBFFEB5BAF4BE2E7E3FFEB0060A0E1093E +S31A500113F900A0E14B1FA0E34430A0E300308DE50A20A0E10130A5 +S31A5001140E43E23EFCFFEB44E5FFEB0030D5E5000053E3080000EE +S31A500114231A0130D8E5000053E30500001A0230D5E5000053E3DE +S31A500114380200001A0340D5E5000054E31200000A4400A0E3D63F +S31A5001144DFBFFEB0000A0E31B0000EA5842010058840000E0442B +S31A500114620100C8FEFFFFC9FEFFFFCAFEFFFF55553412BCFEFF25 +S31A50011477FFBDFEFFFFBEFEFFFFC0FEFFFFC1FEFFFFC2FEFFFF60 +S31A5001148CC4FEFFFF6C120150BEE3FFEB000066E07D0E50E3DBFB +S31A500114A1FFFF3A0730A0E1017047E2000053E3CEFFFFCA440045 +S31A500114B6A0E3BBFBFFEB08309FE50000E0E3004083E500000080 +S31A500114CBEAE8440100F0AF1BE90DC0A0E1F0DF2DE904B04CE2E6 +S31A500114E014D04DE20270A0E101A0A0E12C000BE5006053E2BF08 +S31A500114F500001A0A0057E14200009A010857E30300002AFF00E4 +S31A5001150A57E30800A0830000A093020000EA010457E31800A0FA +S31A5001151F231000A03340139FE53220A0E10230D1E7003083E033 +S31A50011534200073E20600000A1770A0E12C101BE5203060E231BF +S31A5001154933A0E11AA083E11110A0E12C100BE50798A0E12998B5 +S31A5001155EA0E10A00A0E12788A0E10810A0E1710200EB0040A00E +S31A50011573E10A00A0E10810A0E1110100EB0060A0E1990602E0A8 +S31A500115882C101BE52138A0E1044883E1020054E10500002A01CA +S31A5001159D6046E2074094E00200002A020054E10160463207401C +S31A500115B28430044062E00400A0E10810A0E15C0200EB0050A03C +S31A500115C7E10400A0E10810A0E1FC0000EB990002E02C101BE51B +S31A500115DC0138A0E12338A0E1055883E1020055E10400002A01E5 +S31A500115F10040E2075095E00100002A020055E10100403206C8FC +S31A5001160680E1E60000EA000057E30300001A0100A0E30210A0BA +S31A5001161BE1E90000EB0070A0E1010857E30720A0E10300002AA5 +S31A50011630FF0057E30800A0830000A093020000EA010457E31874 +S31A5001164500A0231000A03318129FE53220A0E10230D1E70030F8 +S31A5001165A83E0200073E20130A00330300B050AA06700340000C3 +S31A5001166F0A202060E21770A0E12C101BE53A52A0E13132A0E14E +S31A500116841110A0E12C100BE51AA083E12788A0E10798A0E12995 +S31A5001169998A0E10500A0E10810A0E1230200EB0040A0E10500D7 +S31A500116AEA0E10810A0E1C30000EB0060A0E1990602E02A38A0A4 +S31A500116C3E1044883E1020054E10500002A016046E2074094E080 +S31A500116D80200002A020054E10160463207408430044062E004E5 +S31A500116ED00A0E10810A0E10F0200EB0050A0E10400A0E108100D +S31A50011702A0E1AF0000EB990002E00A38A0E12338A0E105588366 +S31A50011717E1020055E10500002A010040E2075095E00200002A03 +S31A5001172C020055E10100403207508530066880E105A062E030B4 +S31A50011741600BE50798A0E12998A0E10A00A0E12788A0E10810B7 +S31A50011756A0E1F60100EB0040A0E10A00A0E10810A0E196000049 +S31A5001176BEB0060A0E1990602E02C101BE52138A0E1044883E1FF +S31A50011780020054E10500002A016046E2074094E00200002A0225 +S31A500117950054E10160463207408430044062E00400A0E10810BC +S31A500117AAA0E1E10100EB0050A0E10400A0E10810A0E181000015 +S31A500117BFEB990002E02C101BE50138A0E12338A0E1055883E1C5 +S31A500117D4020055E10400002A010040E2075095E00100002A0227 +S31A500117E90055E10100403206C880E16D0000EA0A0056E1002004 +S31A500117FEA08330200B8502C0A0816800008A010856E30620A09F +S31A50011813E10300002AFF0056E30800A0830000A093020000EAD9 +S31A50011828010456E31800A0231000A03330109FE53220A0E102BF +S31A5001183D30D1E7003083E0200073E20800001A2C301BE50600CB +S31A500118525AE10700539101C0A0E300C0A0310010A0E330100B51 +S31A50011867E5500000EA8C3F0150202060E23732A0E1166083E194 +S31A5001187C1770A0E12C101BE53A52A0E13132A0E11110A0E12CFD +S31A50011891100BE51AA083E12698A0E10628A0E12228A0E105000F +S31A500118A6A0E134200BE50910A0E1A00100EB0040A0E10500A085 +S31A500118BBE10910A0E1400000EB34201BE50080A0E1980202E04A +S31A500118D02A38A0E1044883E1020054E10500002A018048E20602 +S31A500118E54094E00200002A020054E10180483206408430044047 +S31A500118FA62E00400A0E10910A0E18B0100EB0050A0E10400A035 +S31A5001190FE10910A0E12B0000EB34201BE5900202E00A38A0E150 +S31A500119242338A0E1055883E1020055E10500002A010040E2062A +S31A500119395095E00200002A020055E1010040320650853008C8CB +S31A5001194E80E105A062E02C08A0E12738A0E10018CCE10328C799 +S31A50011963E191020EE0900202E0930101E0900303E0011092E0D4 +S31A500119780138832201E89EE02138A3E00A0053E10500008A2CE9 +S31A5001198D101BE50030A0130130A003000053E301005E11000081 +S31A500119A2009A01C04CE20020A0E330200BE53CC00BE530301B06 +S31A500119B7E540204BE238300BE5030092E9F0AF1BE9000051E3A5 +S31A500119CC1F00000A0130A0E30020A0E3010050E11900003A01A9 +S31A500119E10251E3000051310112A0310332A031FAFFFF3A0201C3 +S31A500119F651E3000051318110A0318330A031FAFFFF3A01005066 +S31A50011A0BE10100402003208221A10050E1A1004020A32082212E +S31A50011A20210150E12101402023218221A10150E1A1014020A326 +S31A50011A35218221000050E32332B0112112A011EFFFFF1A02004B +S31A50011A4AA0E10EF0A0E104E02DE5640100EB0000A0E30080BD2A +S31A50011A5FE80DC0A0E1F0DF2DE904B04CE224D04DE20260A0E118 +S31A50011A740180A0E138000BE530C04BE234C00BE5007053E2979F +S31A50011A8900001A080056E11800009A010856E30300002AFF0078 +S31A50011A9E56E30800A0830000A093020000EA010456E31800A063 +S31A50011AB3231000A033D4129FE53220A0E10230D1E7003083E007 +S31A50011AC8203073E23C300BE55200000A1663A0E138101BE520F3 +S31A50011ADD3063E23C201BE53133A0E1188283E11112A0E13810FD +S31A50011AF20BE5490000EA000056E30300001A0100A0E30210A0D9 +S31A50011B07E1AEFFFFEB0060A0E1010856E30620A0E10300002A03 +S31A50011B1CFF0056E30800A0830000A093020000EA010456E31885 +S31A50011B3100A0231000A03354129FE53220A0E10230D1E70030CB +S31A50011B4683E0203073E23C300BE5088066003100000A3C201B2F +S31A50011B5BE53C304BE2081093E83C101BE5202062E21663A0E143 +S31A50011B703852A0E13C32A0E140200BE51CC1A0E138C00BE51861 +S31A50011B858183E12678A0E106A8A0E12AA8A0E10500A0E10710D1 +S31A50011B9AA0E1E50000EB0040A0E10500A0E10710A0E185FFFF2C +S31A50011BAFEB9A0002E02838A0E1044883E1020054E10300002A6E +S31A50011BC4064094E00100002A020054E106408430044062E00415 +S31A50011BD900A0E10710A0E1D40000EB0050A0E10400A0E107105B +S31A50011BEEA0E174FFFFEB9A0002E00838A0E12338A0E1055883B4 +S31A50011C03E1020055E10300002A065095E00100002A020055E101 +S31A50011C1806508530058062E006A8A0E12AA8A0E10800A0E1265D +S31A50011C2D78A0E10710A0E1BF0000EB0040A0E10800A0E10710AF +S31A50011C42A0E15FFFFFEB9A0002E038C01BE52C38A0E104488345 +S31A50011C57E1020054E10300002A064094E00100002A020054E1C0 +S31A50011C6C06408430044062E00400A0E10710A0E1AD0000EB00D7 +S31A50011C8150A0E10400A0E10710A0E14DFFFFEB9A0002E038100F +S31A50011C961BE50138A0E12338A0E1055883E1020055E103000050 +S31A50011CAB2A065095E00100002A020055E106508530055062E0D3 +S31A50011CC038500BE534201BE5000052E39600000A38301BE53C73 +S31A50011CD5C01BE5333CA0E148300BE50010A0E344100BE58B0029 +S31A50011CEA00EA080057E10500009A48000BE544800BE540204B2E +S31A50011CFFE20C0012E930C04BE2860000EA010857E30720A0E118 +S31A50011D140300002AFF0057E30800A0830000A093020000EA01B2 +S31A50011D290457E31800A0231000A03358109FE53220A0E1023061 +S31A50011D3ED1E7003083E0203073E23C300BE51100001A38301B3F +S31A50011D53E5070058E1060053910200003A06C053E00780C8E0B1 +S31A50011D6838C00BE534101BE5000051E36C00000A38201BE54899 +S31A50011D7D200BE544800BE540204BE20C0012E901C0A0E16400FC +S31A50011D9200EA8C4001503C301BE53CC01BE538201BE52030636B +S31A50011DA7E240300BE540101BE53633A0E1177C83E1166CA0E15A +S31A50011DBC3851A0E13231A0E1122CA0E138200BE5188C83E12797 +S31A50011DD198A0E10738A0E12338A0E10500A0E14C300BE50910E6 +S31A50011DE6A0E1520000EB0040A0E10500A0E10910A0E1F2FEFF03 +S31A50011DFBEB4C201BE500A0A0E19A0202E02838A0E1044883E1F5 +S31A50011E10020054E10500002A01A04AE2074094E00200002A024A +S31A50011E250054E101A04A3207408430044062E00400A0E10910E0 +S31A50011E3AA0E13D0000EB0050A0E10400A0E10910A0E1DDFEFFC9 +S31A50011E4FEB4C201BE5900202E00838A0E12338A0E1055883E1FE +S31A50011E64020055E10500002A010040E2075095E00200002A028E +S31A50011E790055E10100403207508530058062E00A3880E12308B3 +S31A50011E8EA0E126C8A0E10018C3E10C28C6E191020EE09002024C +S31A50011EA3E09C0101E0900C0CE0011092E001C88C2201E89EE08C +S31A50011EB821C8ACE008005CE10500008A38101BE50030A0130149 +S31A50011ECD30A003000053E301005E110200009A06205EE007C069 +S31A50011EE2CCE002E0A0E134301BE5000053E30D00000A38201B61 +S31A50011EF7E50E1052E00C80C8E03CC01BE5313CA0E140101BE5DC +S31A50011F0C183183E148300BE5388CA0E144800BE534C01BE54027 +S31A50011F21204BE20C0012E90C008CE830304BE2030093E8F0AFD6 +S31A50011F361BE9000051E32600000A0130A0E3010050E10EF0A053 +S31A50011F4B31010251E3000051310112A0310332A031FAFFFF3A24 +S31A50011F60020151E3000051318110A0318330A031FAFFFF3A0044 +S31A50011F7520A0E3010050E101004020A10050E1A1004020E320F4 +S31A50011F8A8221210150E12101402063218221A10150E1A1014097 +S31A50011F9F20E321822103C0A0E1000050E32332B0112112A0119E +S31A50011FB4EEFFFF1A0E2212E20EF0A001EC0112E1A10180106C7A +S31A50011FC90112E121018010EC0012E1A10080100EF0A0E104E093 +S31750011FDE2DE5010000EB0000A0E30080BDE80EF0A0E175 +S31A50011FF05B2D772074696D656F75745D205B3C656E7472795FBA +S31A50012005706F696E743E5D000000004578656375746520616EE8 +S31A5001201A20696D616765202D2077697468204D4D55206F6666A4 +S31A5001202F006578656300000000776169742074696D656F7574C4 +S31A50012044000000007374617274696E67206164647265737300BE +S31A5001205900000041626F757420746F207374617274206578656D +S31A5001206E637574696F6E206174202570202D2061626F72742025 +S31A5001208377697468205E432077697468696E20256420736563BD +S31A500120986F6E64730A0000004C6F616420612066696C65006CF1 +S31A500120AD6F616400000000454C4620696D61676573206E6F74B5 +S31A500120C220737570706F727465640A000000496E76616C6964DB +S31A500120D720532D7265636F7264206174206F666673657420259D +S31A500120EC702C20696E7075743A2025630A000000426164205336 +S31A500121012D7265636F726420636F756E74206174206F666673BA +S31A5001211665742025700A0000000041646472657373206F6666A4 +S31A5001212B736574203D2025700A00000000417474656D707420E1 +S31A50012140746F206C6F616420532D7265636F72642064617461B7 +S31A5001215520746F20616464726573733A202570205B6E6F74203A +S31A5001216A696E2052414D5D0A00002A2A2A205761726E696E6757 +S31A5001217F2120436865636B73756D206661696C757265202D200B +S31A50012194416464723A20256C782C202530326C58203C3E20258B +S31A500121A930326C580A0000456E74727920706F696E743A2025BF +S31A500121BE702C20616464726573732072616E67653A2025702DCA +S31A500121D325700A0000496E76616C696420532D7265636F72641B +S31A500121E8206174206F6666736574203078256C782C2074797075 +S31A500121FD653A2025780A00256308000A000000766572626F73E5 +S31A5001221265006C6F61642072617720646174610000006C6F61FB +S31A5001222764206164647265737300000000646F776E6C6F616489 +S31A5001223C206D6F6465202854465450206F722078797A4D4F447F +S31A50012251454D2900000000686F7374206E616D652028495020E6 +S31A500122666164647265737329000066696C65206E616D6500009C +S31A5001227B00496E76616C696420495020616464726573733A2017 +S31A5001229025730A006D6F64656D000000496E76616C6964202720 +S31A500122A56D6F6465273A2025730A0074667470000000005446AD +S31A500122BA5450206D6F6465207265717569726573206120776F38 +S31A500122CF726B696E67206E6574776F726B0A00000046696C65D4 +S31A500122E4206E616D65206D697373696E670A0000757361676594 +S31A500122F93A206C6F61642025730A005370656369666965642011 +S31A5001230E616464726573732028257029206973206E6F74206981 +S31A500123236E2052414D2E0A000043616E2774206C6F61642027F4 +S31A500123382573273A2025730A00000000526177206C6F61642074 +S31A5001234D72657175697265732061206D656D6F72792061646431 +S31A50012362726573730A005261772066696C65206C6F61646564D5 +S31A500123772025702D25700A0000454C4600556E7265636F676E61 +S31A5001238C697A656420696D61676520747970653A20256C780AC7 +S31A500123A10000007B636D64737D00004D616E61676520464C41F5 +S31A500123B6534820696D6167657300666973005B2D6C5D000000F7 +S31A500123CB004D616E61676520636F6E66696775726174696F6EC5 +S31A500123E0206B65707420696E20464C415348206D656D6F72797F +S31A500123F500000066636F6E666967005B2D665D00000000496E9E +S31A5001240A697469616C697A6520464C41534820496D616765205A +S31A5001241F53797374656D205B4649535D00696E6974000000005E +S31A500124345B2D635D00000000446973706C617920636F6E7465E5 +S31A500124496E7473206F6620464C41534820496D61676520537960 +S31A5001245E7374656D205B4649535D000000006C697374000000E3 +S31A500124730000000000446973706C61792066726565205B617613 +S31A5001248861696C61626C655D206C6F636174696F6E73207769D5 +S31A5001249D7468696E20464C41534820496D6167652053797374BC +S31A500124B2656D205B4649535D000066726565000000002D6620DD +S31A500124C73C666C6173685F616464723E202D6C203C6C656E676C +S31A500124DC74683E00457261736520464C41534820636F6E7465C3 +S31A500124F16E74730000000065726173650000004C4F434B20468B +S31A500125064C41534820636F6E74656E7473006C6F636B0000000A +S31A5001251B00554E4C4F434B20464C41534820636F6E74656E74DF +S31A5001253073000000756E6C6F636B00006E616D6500000000445B +S31A500125456973706C617920616E20696D6167652066726F6D2092 +S31A5001255A464C41534820496D6167652053797374656D205B463E +S31A5001256F49535D000064656C65746500005B2D62203C6D656D0F +S31A500125846F72795F6C6F61645F616464726573733E5D205B2D0A +S31A50012599635D206E616D65000000004C6F616420696D616765B2 +S31A500125AE2066726F6D20464C41534820496D61676520537973FD +S31A500125C374656D205B4649535D20696E746F2052414D000000D2 +S31A500125D86C6F6164000000002D62203C6D656D5F626173653E95 +S31A500125ED202D6C203C696D6167655F6C656E6774683E205B2DA3 +S31A5001260273203C646174615F6C656E6774683E5D200A202020FD +S31A50012617202020202020202020202020205B2D66203C666C613A +S31A5001262C73685F616464723E5D205B2D65203C656E7472795FD8 +S31A50012641706F696E743E5D205B2D72203C72616D5F61646472B8 +S31A500126563E5D205B2D6E5D203C6E616D653E00000000437265B5 +S31A5001266B61746520616E20696D61676500637265617465000043 +S31A500126802A2A2A20696E76616C696420276669732720636F6D5A +S31A500126956D616E643A2025730A00006669732000000000667500 +S31A500126AA6C6C20696E697469616C697A6174696F6E2C206572C1 +S31A500126BF6173657320616C6C206F6620666C6173680000000087 +S31A500126D441626F757420746F20696E697469616C697A65205BCF +S31A500126E9666F726D61745D20464C41534820696D61676520735B +S31A500126FE797374656D002A2A2041626F727465640A002A2A2A81 +S31A5001271320496E697469616C697A6520464C41534820496D6163 +S31A5001272867652053797374656D0A0000202020696E69746961EC +S31A5001273D6C697A6174696F6E206661696C65642025703A203002 +S31A50012752782578282573290A0000202020205761726E696E67BD +S31A500127673A2064657669636520636F6E74656E7473206E6F743D +S31A5001277C206572617365642C20736F6D6520626C6F636B73209F +S31A500127916D6179206E6F7420626520757361626C650A005265E0 +S31A500127A664426F6F7400526564426F6F745B6261636B75705DF2 +S31A500127BB00526564426F6F7420636F6E6669670000464953206B +S31A500127D06469726563746F72790000004572726F72207772694C +S31A500127E574696E6720696D6167652064657363726970746F7254 +S31A500127FA732061742025703A2030782578282573290A000000C4 +S31A5001280F00646973706C617920636865636B73756D7300000081 +S31A500128244E616D652020202020202020202020202020464C4134 +S31A50012839534820616464722020202573202020204C656E67746B +S31A5001284E68202020202020456E74727920706F696E740A000090 +S31A5001286300436865636B73756D000000004D656D2061646472FC +S31A5001287800000000252D313673202030782530386C582020202F +S31A5001288D30782530386C58202030782530386C582020307825A0 +S31A500128A230386C580A00202030782530386C58202E2E20307817 +S31A500128B72530386C580A0000006D656D6F7279206261736520E6 +S31A500128CC616464726573730072616D2062617365206164647204 +S31A500128E165737300000000656E74727920706F696E74206164DF +S31A500128F6647265737300464C415348206D656D6F72792062614B +S31A5001290B73652061646472657373000000696D616765206C658E +S31A500129206E677468205B696E20464C4153485D00696D6167655A +S31A500129352073697A65205B61637475616C20646174615D00004F +S31A5001294A0000646F6E277420636F70792066726F6D2052414D96 +S31A5001295F20746F20464C4153482C206A7573742075706461742B +S31A5001297465206469726563746F72790066696C65206E616D653C +S31A50012989000000696E76616C696420617267756D656E74730005 +S31A5001299E0000726571756972656420706172616D65746572206B +S31A500129B36D697373696E670000496E76616C696420464C4153B1 +S31A500129C84820696D6167652073697A652F6C656E677468206329 +S31A500129DD6F6D62696E6174696F6E0A00000000496E76616C69F1 +S31A500129F26420464C41534820616464726573733A20257020284A +S31A50012A072573290A0020202076616C69642072616E6765206972 +S31A50012A1C732025702D25700A000000004E616D65206973207449 +S31A50012A316F6F206C6F6E672C206D757374206265206C657373B8 +S31A50012A46207468616E2025642063686172730A0000002A2A2001 +S31A50012A5B5741524E494E473A2052414D20616464726573733A7F +S31A50012A70202570206D617920626520696E76616C69640A0043A3 +S31A50012A85616E2774206C6F6361746520256C6420627974657387 +S31A50012A9A206672656520696E20464C4153480A000000496D6168 +S31A50012AAF676520666F756E642C2062757420464C41534820610D +S31A50012AC464647265737320696E636F72726563740A00000049E5 +S31A50012AD96D61676520666F756E642C20627574204C454E47548A +S31A50012AEE4820697320696E636F727265637420283078256C7856 +S31A50012B0320213D203078256C78290A0000416E20696D61676512 +S31A50012B18206E616D656420272573272065786973747300004323 +S31A50012B2D616E27742070726F6772616D20746869732072656784 +S31A50012B42696F6E202D20636F6E7461696E7320636F64652069D1 +S31A50012B576E20757365210A000043616E2774206572617365200F +S31A50012B6C726567696F6E2061742025703A203078257828257370 +S31A50012B81290A0043616E27742070726F6772616D207265676929 +S31A50012B966F6E2061742025703A2030782578282573290A0000BA +S31A50012BAB004572726F722065726173696E672061742025703AC7 +S31A50012BC02030782578282573290A00004572726F722070726FD6 +S31A50012BD56772616D6D696E672061742025703A203078257828D1 +S31A50012BEA2573290A00006C656E67746800006D697373696E6738 +S31A50012BFF20617267756D656E740000000043616E277420657243 +S31A50012C14617365207468697320726567696F6E202D20636F6EF2 +S31A50012C297461696E7320636F646520696E20757365210A0000D6 +S31A50012C3E00004572726F72206C6F636B696E672061742025706F +S31A50012C533A2030782578282573290A00004572726F7220756E76 +S31A50012C686C6F636B696E672061742025703A2030782578282583 +S31A50012C7D73290A00000000696D616765206E616D6500004465D8 +S31A50012C926C65746520696D61676520272573270000004E6F2026 +S31A50012CA7696D616765202725732720666F756E640A0000000072 +S31A50012CBC6D656D6F7279205B6C6F61645D2062617365206164FB +S31A50012CD164726573730000646973706C617920636865636B73EF +S31A50012CE6756D000000004E6F742061206C6F616461626C65207A +S31A50012CFB696D6167650A000000436865636B73756D3A2030782B +S31A50012D102530386C780A00002A2A205761726E696E67202D2025 +S31A50012D25636865636B73756D206661696C7572652E2020737492 +S31A50012D3A6F7265643A2030782530386C782C20636F6D7075742C +S31A50012D4F65643A2030782530386C780A00464C4153483A2064A6 +S31A50012D64726976657220696E6974206661696C6564212C2073A2 +S31A50012D7974617475733A20307825780A000000464C4153483A6C +S31A50012D8E202570202D2025702C20256420626C6F636B73206F20 +S31A50012DA36620257020627974657320656163682E0A0000000079 +S31A50012DB8746F6F2066657720617267756D656E74730000007590 +S31A50012DCD6E7265636F676E697A656420636F6D6D616E64000003 +S31A50012DE2000052756E2073637269707420617420626F6F7400D2 +S31A50012DF700626F6F745F73637269707400426F6F7420736372CC +S31A50012E0C69707400626F6F745F7363726970745F64617461006C +S31A50012E21000000426F6F74207363726970742074696D656F7549 +S31A50012E36742028313030306D73207265736F6C7574696F6E2936 +S31A50012E4B00626F6F745F7363726970745F74696D656F7574000D +S31A50012E6025733A20000000002573200074727565000000006636 +S31A50012E75616C7365000000256C642000000000307825303258B0 +S31A50012E8A00003A000000200000003F3F00000A0000002E2E207E +S31A50012E9F25730A0000456E746572207363726970742C2074654D +S31A50012EB4726D696E617465207769746820656D707479206C69A2 +S31A50012EC96E650A000000003E3E20006C69737420636F6E666939 +S31A50012EDE6775726174696F6E206F6E6C79002A2A20696E76611B +S31A50012EF36C696420656E7472790A000000557064617465205209 +S31A50012F086564426F6F74206E6F6E2D766F6C6174696C65206385 +S31A50012F1D6F6E66696775726174696F6E0000004572726F722009 +S31A50012F3277726974696E6720636F6E666967206461746120615E +S31A50012F47742025703A2030782578282573290A000052657175C6 +S31A50012F5C65737420666F7220636F6E6669672076616C75652063 +S31A50012F7127257327202D2077726F6E6720747970650A004361E4 +S31A50012F866E27742066696E6420636F6E666967206461746120A5 +S31A50012F9B666F7220272573270A000000004E6F2073706163658A +S31A50012FB020746F2061646420272573270A000000464C415348EB +S31A50012FC520636F6E66696775726174696F6E20636865636B7377 +S31A50012FDA756D206572726F72206F7220696E76616C6964206BCC +S31A50012FEF65790A0000657468300000000073635F6C70650000A7 +S31A500130044346206361726420776F6E277420676F20726561645C +S31A5001301979210A000000004E6F742061205343204C50452C20F2 +S31A5001302E736F7272790A000000000A00000025733A2025732039 +S31A5001304325732025730A00000043616E277420706172736520BF +S31A500130584349530A0000000043616E27742066657463682063C9 +S31A5001306D6F6E66696720696E666F0A00000000436F6D706163BB +S31A500130827420466C61736820636172642072656D6F7665642173 +S31A500130970A000000002E2E2E2057616974696E6720666F7220BF +S31A500130AC6E6574776F726B20636172643A2000002E0000005B11 +S31A500130C12D765D205B2D6E203C636F756E743E5D205B2D742031 +S31A500130D63C74696D656F75743E5D205B2D69203C49505F616486 +S31A500130EB64723E5D202D68203C49505F616464723E0000000026 +S31A500131004E6574776F726B20636F6E6E6563746976697479201A +S31A500131157465737400000070696E67000000003C636F756E747B +S31A5001312A3E202D206E756D626572206F66207061636B65747305 +S31A5001313F20746F2074657374003C74696D656F75743E202D2053 +S31A500131546D617820236D7320706572207061636B6574205B72BA +S31A500131696F756E7420747269705D006C6F63616C2049502061B3 +S31A5001317E64647265737300000000686F737420495020616464A0 +S31A5001319372657373003C6C656E6774683E202D2073697A6520CF +S31A500131A86F66207061796C6F61640000766572626F7365206F57 +S31A500131BD7065726174696F6E0000003C726174653E202D20743D +S31A500131D2696D65206265747765656E207061636B657473000041 +S31A500131E7000000000050494E47202D20496E76616C6964206F8B +S31A500131FC7074696F6E207370656369666965640A000000005017 +S31A50013211494E47202D20496E76616C69642049502061646472CB +S31A500132266573733A2025730A000050494E473A2043616E2774C0 +S31A5001323B2066696E642061646472657373206F6620736572768B +S31A50013250657220272573270A0000000050494E47202D20686FB9 +S31A500132657374204950206164647265737320726571756972653A +S31A5001327A640A000000004E6574776F726B2050494E47202D20D5 +S31A5001328F66726F6D202573000020746F2025730A0069636D70F9 +S31A500132A4202D207365713A20256C642C2074696D653A20256CD3 +S31A500132B96420287469636B73290A0050494E47202D20726563D7 +S31A500132CE656976656420256C64206F6620256C64206578706596 +S31A500132E3637465640A0000000053707572696F757320496E7420 +S31A500132F8657272757074212121202D20766563746F723A2025E6 +S31A5001330D642C20646174613A2025780A00000051525900436169 +S31A500133226E2774206964656E7469667920464C4153482C20736D +S31A500133376F7272790A00000000457272203D2025780A00000007 +S31A5001334C30313233343536373839616263646566000000005063 +S31A500133613031004F4B000045303100453033004530320042309E +S31A5001337631003031323334353637383961626364656600000058 +S31A5001338B00303132333435363738394142434445460000000034 +S31A500133A030313233343536373839414243444546000000003CE3 +S31A500133B542616420666F726D617420737472696E673A200000EB +S31A500133CA0000203A00003E0A00003C6E756C6C3E00003C4E6FC7 +S31A500133DF74206120737472696E673A2030780000003E00000096 +S31A500133F4253038583A20000025303258000000002020000020EF +S31A50013409000000207C0000256300007C0A00003031323334357E +S31A5001341E36373839000030313233343536373839616263646568 +S31A5001343366000000003031323334353637383941424344454625 +S31A50013448000000005E430A003078253038583A20000000002561 +S31A5001345D303258000000002020000020000000207C00002563C5 +S31A5001347200007C0A0000202D2061726520796F75207375726567 +S31A500134872028792F6E293F20004275665B25645D2F25703A2077 +S31A5001349C6275663A2025702C206C656E3A2025642F25642C2026 +S31A500134B16E6578743A2025700A000046726565206C6973742079 +S31A500134C63D2025700A005F5F656E65745F706F6C6C3A206E6FE7 +S31A500134DB206D6F726520627566666572730A0000004E45544173 +S31A500134F053434949000000004F43544554000000556E6B6E6FBE +S31A50013505776E206572726F7200000066696C65206E6F74206694 +S31A5001351A6F756E6400006163636573732076696F6C6174696F96 +S31A5001352F6E000000006469736B2066756C6C206F7220616C6CEA +S31A500135446F636174696F6E20657863656564656400000000696E +S31A500135596C6C6567616C2054465450206F7065726174696F6E46 +S31A5001356E0000756E6B6E6F776E207472616E73666572204944AF +S31A500135830066696C6520616C726561647920657869737473007A +S31A500135986E6F20737563682075736572000000006F7065726121 +S31A500135AD74696F6E2074696D6564206F757400736F6D65207306 +S31A500135C26F7274206F66206E6574776F726B206572726F7200DF +S31A500135D700696E76616C696420706172616D65746572000000C0 +S31A500135EC70726F746F636F6C2076696F6C6174696F6E000066A6 +S31A50013601696C65206973206C6172676572207468616E206275C8 +S31A5001361666666572000025642E25642E25642E2564002573203F +S31A5001362B2D2063616C6C6564207769746820696E76616C69649E +S31A50013640204349533A2025780A00000063665F70617273655F7C +S31A5001365563667461626C650000000063665F70617273655F6333 +S31A5001366A6F6E6669670050434D4349413A20496E76616C696413 +S31A5001367F20736C6F742025640A000000002E2E2E204572617315 +S31A50013694652066726F6D2025702D25703A2000002E0000000A88 +S31A500136A90000002E2E2E2050726F6772616D2066726F6D20251A +S31A500136BE702D25702061742025703A2000002E2E2E204C6F63A2 +S31A500136D36B2066726F6D2025702D25703A200000002E2E2E20D1 +S31A500136E8556E6C6F636B2066726F6D2025702D25703A20004E17 +S31A500136FD6F206572726F72202D206F7065726174696F6E2063E7 +S31A500137126F6D706C657465000000446576696365206973206980 +S31A500137276E2065726173652073757370656E6420737461746535 +S31A5001373C0000000044657669636520697320696E2070726F6706 +S31A5001375172616D2073757370656E642073746174650000496EB2 +S31A5001376676616C696420464C4153482061646472657373000053 +S31A5001377B004572726F7220747279696E6720746F20657261734D +S31A50013790650000004572726F7220747279696E6720746F206C12 +S31A500137A56F636B2F756E6C6F636B004572726F722074727969CE +S31A500137BA6E6720746F2070726F6772616D0047656E65726963F6 +S31A500137CF206572726F720000004465766963652F726567696FAF +S31A500137E46E2069732077726974652D70726F74656374656400CD +S31A500137F9000000464C415348207375622D73797374656D206E2C +S31A5001380E6F7420696E697469616C697A6564000000004461749C +S31A500138236120766572696679206661696C65642061667465726C +S31A50013838206F7065726174696F6E0000556E6B6E6F776E2065BE +S31A5001384D72726F7200000045746865726E65742073656E643A07 +S31A500138620A0045746865726E657420726563763A0A006574685C +S31A500138775F6472765F6473722073686F756C64206E6F742062F0 +S31A5001388C652063616C6C65643A20766563746F722025642C2004 +S31A500138A1646174612025780A000000556E62616C616E6365646D +S31A500138B620737472696E67210A00416D626967756F7573206395 +S31A500138CB6F6D6D616E6420272573272C2063686F6963657320C5 +S31A500138E06172653A20257300202573000A00000055736167659B +S31A500138F53A0A002020257325732025730A00002A2A2045727254 +S31A5001390A6F723A20257320616C726561647920737065636966E2 +S31A5001391F6965640A002A2A204572726F723A20696E76616C69A5 +S31A5001393464206E756D626572202725732720666F722025730AEB +S31A500139490000002A2A204572726F723A20696E76616C69642033 +S31A5001395E666C616720272563270A000000002A2A204572726F57 +S31A50013973723A206E6F2064656661756C742F6E6F6E2D666C6160 +S31A500139886720617267756D656E747320737570706F7274656470 +S31A5001399D0A000000000000446973706C617920526564426F6F83 +S31A500139B2742076657273696F6E20696E666F726D6174696F6E49 +S31A500139C70076657273696F6E005B3C746F7069633E5D0000003D +S31A500139DC48656C702061626F75742068656C703F00000000684B +S31A500139F1656C70000000005B2D77203C74696D656F75743E5D2C +S31A50013A06205B656E7472795D00004578656375746520636F6421 +S31A50013A1B652061742061206C6F636174696F6E0000676F000015 +S31A50013A302D62203C6C6F636174696F6E3E205B2D6C203C6C6567 +S31A50013A456E6774683E5D00446973706C617920286865782064E2 +S31A50013A5A756D702920612072616E6765206F66206D656D6F72A2 +S31A50013A6F790000000064756D70000000005B4F4E207C204F4673 +S31A50013A84465D00004D616E616765206D616368696E6520636111 +S31A50013A9963686573000000636163686500000052657365742007 +S31A50013AAE7468652073797374656D000000007265736574000083 +S31A50013AC300506C6174666F726D3A20257320282573292025739F +S31A50013AD80A0000004173736162657420646576656C6F706D65D4 +S31A50013AED6E742073797374656D00005374726F6E6741524D2049 +S31A50013B02313131300000436F70797269676874202843292032D5 +S31A50013B173030302C20323030312C20526564204861742C20496A +S31A50013B2C6E632E0A0A00000052414D3A2025702D25700A003D42 +S31A50013B413D20457865637574696E6720626F6F7420736372696A +S31A50013B56707420696E2025642E25303364207365636F6E647356 +S31A50013B6B202D20656E746572205E4320746F2061626F72740A5D +S31A50013B8000000000526564426F6F743E200000002A2A204572A1 +S31A50013B95726F723A20496C6C6567616C20636F6D6D616E643A24 +S31A50013BAA20222573220A000000006F6E00006F666600496E7664 +S31A50013BBF616C6964206361636865206D6F64653A2025730A002B +S31A50013BD4636163686573203F0A0000003C746F7069633E0049D3 +S31A50013BE96E76616C696420617267756D656E740A0000002573CD +S31A50013BFE0A20202025732025730A000000006261736520616417 +S31A50013C136472657373000000006C656E677468000044756D700C +S31A50013C282077686174205B6C6F636174696F6E5D3F0A0000776B +S31A50013C3D6169742074696D656F7574000000007374617274691F +S31A50013C526E6720616464726573730000000041626F757420749C +S31A50013C676F20737461727420657865637574696F6E206174202B +S31A50013C7C2570202D2061626F72742077697468205E4320776925 +S31A50013C917468696E202564207365636F6E64730A0000002E2EF6 +S31A50013CA62E20526573657474696E672E00000A00000021212015 +S31A50013CBB6F6F70732C205245534554206E6F7420776F726B6950 +S31A50013CD06E67206F6E207468697320706C6174666F726D0A004F +S31A50013CE500000078797A4D6F64656D202D202573206D6F64654C +S31A50013CFA2C20256428534F48292F256428535458292F25642866 +S31A50013D0F43414E29207061636B6574732C202564207265747290 +S31A50013D246965730A0000000043524300436B73756D00000043CA +S31A50013D39616E2774206163636573732066696C65000000536FA0 +S31A50013D4E7272792C207A4D6F64656D206E6F7420617661696C56 +S31A50013D6361626C65207965740054696D6564206F757400000083 +S31A50013D78456E64206F662066696C650043616E63656C6C656498 +S31A50013D8D000000496E76616C6964206672616D696E670043526A +S31A50013DA2432F636865636B73756D206572726F720000426C6F89 +S31A50013DB7636B2073657175656E6365206572726F72000000000F +S31A50013DCC556E6B6E6F776E206572726F7200000025733A20431C +S31A50013DE1616E27742066696E642061646472657373206F662030 +S31A50013DF67365727665720A0000005F5F7564705F73656E64743C +S31A50013E0B6F000000007564705F7265637666726F6D202D2064FF +S31A50013E20726F70706564207061636B6574206F662025642062F4 +S31A50013E35797465730A000047444220636F6E6E656374696F6E35 +S31A50013E4A20706F7274006764625F706F7274000000004E6574AF +S31A50013E5F776F726B20646562756720617420626F6F7420746947 +S31A50013E746D6500006E65745F64656275670000005573652042D4 +S31A50013E894F4F545020666F72206E6574776F726B20636F6E6634 +S31A50013E9E696775726174696F6E00626F6F74700000004C6F63A4 +S31A50013EB3616C204950206164647265737300000000626F6F7463 +S31A50013EC8705F6D795F69700044656661756C7420736572766597 +S31A50013EDD722049502061646472657373000000626F6F74705FC5 +S31A50013EF27365727665725F69700025732E25640A00006E6574F5 +S31A50013F075F696F5F7772697465000000006E65745F696F5F723E +S31A50013F1C656164004E6F206E6574776F726B20696E7465726680 +S31A50013F316163657320666F756E640A0000000043616E27742075 +S31A50013F4667657420424F4F545020696E666F202D206E65747734 +S31A50013F5B6F726B2064697361626C6564210A00000049503A2038 +S31A50013F70257300002C2044656661756C74207365727665723A4B +S31A50013F852025730A0000000001020203030303040404040404E5 +S31A50013F9A04040505050505050505050505050505050506060651 +S31A50013FAF06060606060606060606060606060606060606060628 +S31A50013FC406060606060606060707070707070707070707070706 +S31A50013FD9070707070707070707070707070707070707070707E9 +S31A50013FEE070707070707070707070707070707070707070707D4 +S31A50014003070707070707070707080808080808080808080808B2 +S31A5001401808080808080808080808080808080808080808080894 +S31A5001402D0808080808080808080808080808080808080808087F +S31A500140420808080808080808080808080808080808080808086A +S31A5001405708080808080808080808080808080808080808080855 +S31A5001406C08080808080808080808080808080808080808080840 +S31A5001408108080808080808080808080001020203030303040462 +S31A500140960404040404040505050505050505050505050505055B +S31A500140AB0506060606060606060606060606060606060606062C +S31A500140C00606060606060606060606060707070707070707070D +S31A500140D5070707070707070707070707070707070707070707EC +S31A500140EA070707070707070707070707070707070707070707D7 +S31A500140FF070707070707070707070707070808080808080808BA +S31A5001411408080808080808080808080808080808080808080897 +S31A5001412908080808080808080808080808080808080808080882 +S31A5001413E0808080808080808080808080808080808080808086D +S31A5001415308080808080808080808080808080808080808080858 +S31A5001416808080808080808080808080808080808080808080843 +S3145001417D08080808080808080808080808080864 +S31A5001418C00000000FC890050FC890050FC890050FC890050FC77 +S31A500141A1890050FC890050FC890050FC890050FC890050FC8900 +S31A500141B60050FC890050FC890050FC890050FC890050FC890074 +S31A500141CB50FC890050FC890050FC890050FC890050FC8900500F +S31A500141E0FC890050FC890050FC890050FC890050FC890050FC4E +S31A500141F5890050FC890050FC890050FC890050FC890050FC89AC +S31A5001420A0050FC890050FC890050FC890050FC890050FC89001F +S31A5001421F50FC890050FC890050FC890050FC890050FC890050BA +S31A50014234FC890050FC890050FC890050FC890050FC890050FCF9 +S31A50014249890050FC890050FC890050FC890050FC890050FC8957 +S31A5001425E0050FC890050FC890050FC890050FC890050FC8900CB +S31A5001427350FC890050FC890050FC890050000000000000000010 +S31A50014288000000000000000000000000000000000000000000CA +S31A5001429D000000000000000000000000000000000000000000B5 +S31A500142B2000000000000000000000000000000000000000000A0 +S31A500142C70000000000000000000000000000000000000000008B +S31A500142DC00000000000000000000000000000000000000000076 +S31A500142F100000000000000000000000000000000000000000061 +S31A500143060000000000000000000000000000000000000000004B +S31A5001431B00000000000000000000000000000000000000000036 +S31A5001433000000000000000000000000000000000000000000021 +S31A500143450000000000000000000000000000000000000000000C +S31A5001435A000000000000000000000000000000000000000000F7 +S31A5001436F000000000000000000000000000000000000000000E2 +S31A50014384000000000000000000000000000000000000000000CD +S31A50014399000000000000000000000000000000000000000000B8 +S31A500143AE000000000000000000000000000000000000000000A3 +S31A500143C30000000000000000000000000000000000000000008E +S31A500143D800000000000000000000000000000000000000000079 +S31A500143ED00000000000000000000000000000000000000000064 +S31A500144020000000000000000000000000000000000000000004E +S31A5001441700000000000000000000000000000000000000000039 +S31A5001442C00000000000000000000000000000000000000000024 +S31A500144410000000000000000000000000000000000000000000F +S31A50014456000000000000000000000A526564426F6F7428746D38 +S31A5001446B2920646562756720656E7669726F6E6D656E74202D73 +S31A50014480206275696C742031323A30383A34362C204A616E2042 +S31A50014495333020323030310A00000065436F7320474442207361 +S31A500144AA74756273205B76696120526564426F6F745D202D2094 +S31A500144BF6275696C74204A616E2033302032303031202F203132 +S31A500144D4323A30383A3436005B2D725D205B2D765D205B2D6822 +S31A500144E9203C686F73743E5D205B2D6D207B54465450207C2008 +S31A500144FE78797A4D4F44454D7D5D205B2D62203C626173655F3B +S31A50014513616464726573733E5D203C66696C655F6E616D653E81 +S31A50014528000000007C2F2D5C7C2D000000000000283D0050F4A1 +S31A5001453D3C0050003E0050183E00508C3E0050C84000505C4242 +S31A5001455200505C420050F04200508884000000000000AC830002 +S31A500145670080430100F42F0150000000000000000000000000B0 +S31A5001457C0888123456780000200000000000000000000000808F +S31A500145916A0050D06A0050000000000000000000000000FFFF7C +S31A500145A6FFFF0000000000000000000000003C780050000000A7 +S31A500145BB0000000000D043010000000000000000000000000080 +S31A500145D000000000FEFFFFFFFEFFFFFF00000000000000000089 +S31A500145E50000000000000000000000000000000000000000006A +S31A500145FA000000000000000000000000000000000000141E0023 +S31A5001460F00141E000038D0005004D400505CD2005000002110DE +S31A50014624422063308440A550C660E770088129914AA16BB18C29 +S31A50014639C1ADD1CEE1EFF13112100273325222B5529442F77293 +S31A5001464ED662399318837BB35AA3BDD39CC3FFF3DEE3622443CB +S31A500146633420040114E664C774A44485546AA54BB528850995DE +S31A50014678EEE5CFF5ACC58DD55336722611163006D776F66695B0 +S31A5001468D56B4465BB77AA719973887DFF7FEE79DD7BCC7C44811 +S31A500146A2E5588668A7784008611802282338CCC9EDD98EE9AF9B +S31A500146B7F9488969990AA92BB9F55AD44AB77A966A711A500AB1 +S31A500146CC333A122AFDDBDCCBBFFB9EEB799B588B3BBB1AABA6BF +S31A500146E16C877CE44CC55C222C033C600C411CAEED8FFDECCD77 +S31A500146F6CDDD2AAD0BBD688D499D977EB66ED55EF44E133E3203 +S31A5001470B2E511E700E9FFFBEEFDDDFFCCF1BBF3AAF599F788F93 +S31A500147208891A981CAB1EBA10CD12DC14EF16FE18010A100C296 +S31A5001473530E3200450254046706760B9839893FBA3DAB33DC31D +S31A5001474A1CD37FE35EF3B1029012F322D23235421452776256E7 +S31A5001475F72EAB5CBA5A89589856EF54FE52CD50DC5E234C324BB +S31A50014774A01481046674476424540544DBA7FAB79987B8975F59 +S31A50014789E77EF71DC73CD7D326F2369106B016576676761546EF +S31A5001479E34564CD96DC90EF92FE9C899E9898AB9ABA944586540 +S31A500147B34806782768C018E1088238A3287DCB5CDB3FEB1EFB3D +S31A500147C8F98BD89BBBAB9ABB754A545A376A167AF10AD01AB39D +S31A500147DD2A923A2EFD0FED6CDD4DCDAABD8BADE89DC98D267CD4 +S31A500147F2076C645C454CA23C832CE01CC10C1FEF3EFF5DCF7C4E +S31A50014807DF9BAFBABFD98FF89F176E367E554E745E932EB23E45 +S31A5001481CD10EF01E000000000000000000000180E80300000FC8 +S31A5001483100000000000580E8030000110000000000000000009A +S31A500148460000F401000000000000000000000000000000000011 +S31A5001485B000000000000000000000000000000000000000000F1 +S31A500148707826015068260150E0250150E41A005074250150443C +S31A500148852501503C25015000270050F8240150E0240150C4247E +S31A5001489A0150D8210050BC2401507824015074240150381900C0 +S31A500148AF502C2401500824015000240150D81400506C2401509D +S31A500148C43C24015034240150FC170050D8250150A42501507CE7 +S31A500148D92501500C2900501425015000250150C4240150B0236C +S31A500148EE0050342501501C250150C424015058250050A03A01F1 +S31A5001490350883A01507C3A015014E40050743A01504C3A0150C0 +S31A50014918303A015084E600503020015010200150F01F01501C20 +S31A5001492D070050C0230150AC230150A4230150AC2B0050F82319 +S31A500149420150CC230150C42301506C3100502C3A0150103A0151 +S31A5001495750F839015078E70050F0390150DC390150D039015039 +S31A5001496C9CE50050AC200150A020015050830000BC0E00501CD7 +S31A5001498131015000310150C030015040430050BC3A0150A83A89 +S31A500149960150A039015028E90050C8390150A4390150A039017F +S31A500149AB50F8E00050F82D0150E42D015000000000010000004F +S31A500149C00100000000000000102E0150042E0150F82D01500101 +S31A500149D500000004000000742401504C2E0150242E0150F82DF6 +S31A500149EA0150010000000200000000000000A83E0150843E0113 +S31A500149FF5000000000010000000100000001000000C43E0150A6 +S31A50014A14B03E0150A83E0150000000000500000000000000ECCF +S31A50014A293E0150D03E0150A83E015000000000050000000000F7 +S31A50014A3E0000503E01503C3E015000000000010000000200005F +S31A50014A530028230000783E01505C3E01500000000001000000B9 +S31A50014A680100000000000000E0370050BC100150FC2F0150BC25 +S31450014A7D3C0050D883000000000000F09200501A S7055000004466
--- a/packages/hal/arm/sa11x0/assabet/current/misc/redboot_RAM.cfg +++ b/packages/hal/arm/sa11x0/assabet/current/misc/redboot_RAM.cfg @@ -58,7 +58,7 @@ cdl_component CYG_HAL_STARTUP { user_value RAM }; -cdl_option CYGBLD_BUILD_REDBOOT { +cdl_component CYGBLD_BUILD_REDBOOT { user_value 1 }; @@ -66,10 +66,12 @@ cdl_component CYGPKG_REDBOOT_NETWORKING user_value 1 }; -cdl_option CYGSEM_REDBOOT_FLASH_CONFIG { +cdl_component CYGSEM_REDBOOT_FLASH_CONFIG { user_value 1 }; cdl_option CYGSEM_REDBOOT_BSP_SYSCALLS { - inferred_value 1 + inferred_value 1 }; + +
--- a/packages/hal/arm/sa11x0/assabet/current/misc/redboot_ROM.cfg +++ b/packages/hal/arm/sa11x0/assabet/current/misc/redboot_ROM.cfg @@ -16,6 +16,7 @@ cdl_configuration eCos { package -hardware CYGPKG_HAL_ARM_SA11X0_ASSABET current ; package -hardware CYGPKG_IO_SERIAL_ARM_SA11X0 current ; package -hardware CYGPKG_DEVS_PCMCIA_ASSABET current ; + package -hardware CYGPKG_DEVS_FLASH_ASSABET current ; package -template CYGPKG_HAL current ; package -template CYGPKG_INFRA current ; package -template CYGPKG_REDBOOT current ; @@ -23,7 +24,6 @@ cdl_configuration eCos { package CYGPKG_DEVS_ETH_CF current ; package CYGPKG_IO_FLASH current ; package CYGPKG_IO_ETH_DRIVERS current ; - package CYGPKG_DEVS_FLASH_ASSABET current ; }; cdl_option CYGBLD_BUILD_GDB_STUBS { @@ -62,7 +62,7 @@ cdl_component CYG_HAL_STARTUP { user_value ROM }; -cdl_option CYGBLD_BUILD_REDBOOT { +cdl_component CYGBLD_BUILD_REDBOOT { user_value 1 }; @@ -70,10 +70,8 @@ cdl_component CYGPKG_REDBOOT_NETWORKING user_value 1 }; -cdl_option CYGSEM_REDBOOT_FLASH_CONFIG { +cdl_component CYGSEM_REDBOOT_FLASH_CONFIG { user_value 1 }; -cdl_option CYGSEM_REDBOOT_BSP_SYSCALLS { - inferred_value 1 -}; +
--- a/packages/hal/arm/sa11x0/assabet/current/src/lcd_support.c +++ b/packages/hal/arm/sa11x0/assabet/current/src/lcd_support.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -103,6 +103,26 @@ parse_color(char *cp) } } +#ifndef CYGPKG_LIBC_STDIO +static int +get_int(char **_cp) +{ + char *cp = *_cp; + char c; + int val = 0; + + while ((c = *cp++) && (c != ' ')) { + if ((c >= '0') && (c <= '9')) { + val = val * 10 + (c - '0'); + } else { + return -1; + } + } + *_cp = cp; + return val; +} +#endif + void show_xpm(char *xpm[]) { @@ -112,7 +132,13 @@ show_xpm(char *xpm[]) unsigned short colors[256]; // Mapped by character index cp = xpm[0]; +#ifdef CYGPKG_LIBC_STDIO if (sscanf(cp, "%d %d %d", &ncols, &nrows, &nclrs) != 3) { +#else + if (((ncols = get_int(&cp)) < 0) || + ((nrows = get_int(&cp)) < 0) || + ((nclrs = get_int(&cp)) < 0)) { +#endif diag_printf("Can't parse XPM data, sorry\n"); return; }
--- a/packages/hal/arm/sa11x0/brutus/current/ChangeLog +++ b/packages/hal/arm/sa11x0/brutus/current/ChangeLog @@ -1,3 +1,8 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_sa11x0_brutus.cdl: Respect channel configuration + constraints. + 2001-01-05 Hugo Tyson <hmt@redhat.com> * include/plf_mmap.h: New file. Statically defined macros for
--- a/packages/hal/arm/sa11x0/brutus/current/cdl/hal_arm_sa11x0_brutus.cdl +++ b/packages/hal/arm/sa11x0/brutus/current/cdl/hal_arm_sa11x0_brutus.cdl @@ -113,6 +113,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_BRUTUS cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 1 @@ -124,6 +125,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_BRUTUS cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 1
--- a/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog +++ b/packages/hal/arm/sa11x0/sa1100mm/current/ChangeLog @@ -1,3 +1,8 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_arm_sa11x0_sa1100mm.cdl: Respect channel configuration + constraints. + 2001-01-05 Hugo Tyson <hmt@redhat.com> * include/plf_mmap.h: New file. Statically defined macros for
--- a/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl +++ b/packages/hal/arm/sa11x0/sa1100mm/current/cdl/hal_arm_sa11x0_sa1100mm.cdl @@ -113,6 +113,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_SA1100 cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_DEFAULT { display "Default console channel." + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 calculated 1 @@ -120,6 +121,7 @@ cdl_package CYGPKG_HAL_ARM_SA11X0_SA1100 cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 1
--- a/packages/hal/arm/sa11x0/var/current/ChangeLog +++ b/packages/hal/arm/sa11x0/var/current/ChangeLog @@ -1,3 +1,24 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + +2001-02-01 Jesper Skov <jskov@redhat.com> + + * include/hal_var_ints.h: Include registers definitions used in + reset macro. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/hal_var_ints.h: this file. + 2001-01-05 Hugo Tyson <hmt@redhat.com> * include/hal_mm.h: Change bitfields within memmap entry to
--- a/packages/hal/arm/sa11x0/var/current/include/hal_var_ints.h +++ b/packages/hal/arm/sa11x0/var/current/include/hal_var_ints.h @@ -50,6 +50,8 @@ // //========================================================================== +#include <cyg/hal/hal_sa11x0.h> // registers + #define CYGNUM_HAL_INTERRUPT_GPIO0 0 #define CYGNUM_HAL_INTERRUPT_GPIO1 1 #define CYGNUM_HAL_INTERRUPT_GPIO2 2 @@ -108,4 +110,25 @@ // The vector used by the Real time clock #define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_TIMER0 + + +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() \ + CYG_MACRO_START \ + cyg_uint32 ctrl; \ + \ + /* By disabling interupts we will just hang in the loop below */ \ + /* if for some reason the software reset fails. */ \ + HAL_DISABLE_INTERRUPTS(ctrl); \ + \ + /* Software reset. */ \ + *SA11X0_RESET_SOFTWARE_RESET = SA11X0_INVOKE_SOFTWARE_RESET; \ + \ + for(;;); /* hang here forever if reset fails */ \ + CYG_MACRO_END + +// Fallback (never really used) +#define HAL_PLATFORM_RESET_ENTRY 0x00000000 + #endif // CYGONCE_HAL_VAR_INTS_H
--- a/packages/hal/arm/sa11x0/var/current/include/plf_stub.h +++ b/packages/hal/arm/sa11x0/var/current/include/plf_stub.h @@ -70,26 +70,6 @@ externC void cyg_hal_plf_comms_init(void #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() \ - CYG_MACRO_START \ - cyg_uint32 ctrl; \ - \ - /* By disabling interupts we will just hang in the loop below */ \ - /* if for some reason the software reset fails. */ \ - HAL_DISABLE_INTERRUPTS(ctrl); \ - \ - /* Software reset. */ \ - *SA11X0_RESET_SOFTWARE_RESET = SA11X0_INVOKE_SOFTWARE_RESET; \ - \ - for(;;); /* hang here forever if reset fails */ \ - CYG_MACRO_END - -// Fallback (never really used) -#define HAL_STUB_PLATFORM_RESET_ENTRY 0x00000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/arm/sa11x0/var/current/src/hal_diag.c +++ b/packages/hal/arm/sa11x0/var/current/src/hal_diag.c @@ -177,9 +177,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static channel_data_t ser_channels[2] = { { (volatile struct sa11x0_serial*)SA11X0_UART1_BASE, 1000, CYGNUM_HAL_INTERRUPT_UART1 }, { (volatile struct sa11x0_serial*)SA11X0_UART3_BASE, 1000, CYGNUM_HAL_INTERRUPT_UART3 } @@ -365,8 +362,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= // Compatibility with older stubs @@ -391,7 +386,7 @@ cyg_hal_plf_comms_init(void) #if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) #define HAL_DIAG_USES_HARDWARE -#elif defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#elif !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #elif CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL != CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL #define HAL_DIAG_USES_HARDWARE
--- a/packages/hal/common/current/ChangeLog +++ b/packages/hal/common/current/ChangeLog @@ -1,3 +1,90 @@ +2001-02-09 Jesper Skov <jskov@redhat.com> + + * cdl/debugging.cdl: Make CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT and + CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT options have sensible defaults. + +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal.cdl: Added CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE and + CHANNEL_CONFIGURABLE options. + * cdl/common.cdl: Added CYGDBG_HAL_DIAG_TO_DEBUG_CHAN option. + * src/hal_if.c: Changes to respect new options. Always do platform + driver init from CLAIM_COMMS code. + * src/hal_stub.c: Leave channel setup to CLAIM_COMMS code. + + * src/hal_if.c: Added null mangler that gets called via the + virtual vector console comms entry and just forwards IO to the + debug comms entries. This differs from setting the console + channel to the same as the debug channel in that console output + will go to the debug channel even if the debug channel is changed. + +2001-02-07 Jesper Skov <jskov@redhat.com> + + * include/hal_if.h: Allow architecture to override COMM and CALL + accessor macros. + +2001-02-03 Gary Thomas <gthomas@redhat.com> + + * src/bplist-dynamic.c (__set_breakpoint, __remove_breakpoint): + Fix error introduced below when no breakpoint list defined. + +2001-02-02 Mark Salter <msalter@redhat.com> + + * src/generic-stub.c: __set_breakpoint and __remove_breakpoint now + take a length argument. + + * src/bplist-dynamic.c: Support breakpoint length. Use + HAL_BREAKINST_ADDR macro (if defined) to get actual breakpoint based + on breakpoint length. + + * include/hal_stub.h: Add len argument to __set_breakpoint and + __remove_breakpoint. + +2001-02-01 Jesper Skov <jskov@redhat.com> + + * src/drv_api.c: Make it build with chaining. + + * include/hal_if.h: Introduce macros for legal version range and + special hacked version number used by ctrlc magic. + * src/hal_if.c (hal_ctrlc_isr_init): Be more careful with how the + version number is checked (and trashed) by the ctrlc init code. + * src/hal_misc.c (hal_default_isr): Same. + + * src/hal_stub.c: Moved mangling code to hal_if.c + * src/hal_if.c: New policies for when and how to initialize the + IO channels. Mangler code now set up by diag_init to allow for + mangling when no stub is included. + + * include/hal_if.h: Added COMM version in upper 16 bits of version + word. Removed CYGPRI_HAL_IMPLEMENTS_IF_SERVICES. + * src/hal_misc.c: Use masks when checking vv versions. + + * cdl/hal.cdl: Add new options for selecting which parts of the + virtual vector table to initialize. + * src/hal_if.c: Matching granularity in initialization code. + Extra checking of services before using these. + + * cdl/debugging.cdl: Require channel initialization when enabling + stubs. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * cdl/common.cdl: Get rid of CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + options. They are replaced by the CYGSEM_HAL_DIAG_MANGLER option. + +2001-01-31 Hugo Tyson <hmt@redhat.com> + + * include/hal_if.h: Make it possible to build logical ether driver + even without virtual vectors present, by defining a dummy + HAL_CTRLC_CHECK in that case; other code invokes it if debugging + per se is enabled. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_stub.c (__reset): Rename HAL_STUB_PLATFORM_RESETx macros + to HAL_PLATFORM_RESETx. + * src/hal_if.c (reset): Same. + 2001-01-15 Nick Garnett <nickg@cygnus.co.uk> * src/drv_api.c: Initialized isr_disable_counter to 1 so that it @@ -1456,7 +1543,7 @@ 1998-08-18 Nick Garnett <nickg@cygnus. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- //
--- a/packages/hal/common/current/cdl/common.cdl +++ b/packages/hal/common/current/cdl/common.cdl @@ -52,22 +52,6 @@ cdl_option CYGFUN_HAL_COMMON_KERNEL_SUPP code can be eliminated." } -cdl_interface CYGINT_HAL_DIAG_DISABLE_GDB_PROTOCOL_SUPPORTED { - display "HAL allows GDB protocol to be disabled for..." - no_define -} - -cdl_option CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL { - display "Disable GDB protocol for diagnostic output" - active_if CYGINT_HAL_DIAG_DISABLE_GDB_PROTOCOL_SUPPORTED - default_value 0 - description " - This option forces diagnostic output to not use the GDB - protocol. Most programs will use the GDB protocol for - diagnostic I/O because of the environment. This option - allows for an explicit override in these cases." -} - # NOTE: The requirement for kernel exception support is bogus in that # the user can supply a deliver_exception function herself. In that # case, however, it is easy to force the kernel option off while leaving @@ -125,3 +109,30 @@ cdl_option CYGSEM_HAL_STATIC_MMU_TABLES would otherwise be required for these tables." } +cdl_component CYGDBG_HAL_DIAG_TO_DEBUG_CHAN { + display "Route diagnostic output to debug channel" + default_value { (CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS \ + || CYG_HAL_STARTUP == "RAM") ? 1 : 0} + active_if !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE + active_if { CYGPKG_HAL_ARM || CYGPKG_HAL_POWERPC_MPC8xx \ + || CYGPKG_HAL_V85X_V850 || CYGSEM_HAL_VIRTUAL_VECTOR_DIAG } + description " + If not inheriting the console setup from the ROM monitor, + it is possible to redirect diagnostic output to the debug + channel by enabling this option. Depending on the debugger + used it may also be necessary to select a mangler for the + output to be displayed by the debugger." + + cdl_option CYGSEM_HAL_DIAG_MANGLER { + display "Mangler used on diag output" + flavor data + legal_values {"GDB" "None"} + default_value { "GDB" } + description " + It is sometimes necessary to mangle (encode) the + diag ASCII text output in order for it to show up at the + other end. In particular, GDB may silently ignore raw + ASCII text." + } +} +
--- a/packages/hal/common/current/cdl/debugging.cdl +++ b/packages/hal/common/current/cdl/debugging.cdl @@ -23,7 +23,7 @@ # # The Initial Developer of the Original Code is Red Hat. # Portions created by Red Hat are -# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. # All Rights Reserved. # ------------------------------------------- # @@ -52,13 +52,16 @@ cdl_option CYGDBG_HAL_DEBUG_GDB_INCLUDE_ active_if CYGINT_HAL_DEBUG_GDB_STUBS default_value 0 requires ! CYGSEM_HAL_USE_ROM_MONITOR + requires { !CYGSEM_HAL_VIRTUAL_VECTOR_DIAG \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS } description " This option causes a set of GDB stubs to be included into the system. On some target systems the GDB support will be provided by other means, for example by a ROM monitor. On other targets, especially when building a ROM-booting system, the necessary support has to go into the target library - itself." + itself. When GDB stubs are include in a configuration, HAL + serial drivers must also be included." } cdl_interface CYGINT_HAL_DEBUG_GDB_STUBS_BREAK { @@ -73,7 +76,7 @@ cdl_option CYGDBG_HAL_DEBUG_GDB_BREAK_SU display "Include GDB external break support for stubs" active_if CYGINT_HAL_DEBUG_GDB_STUBS_BREAK requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - default_value 0 + default_value CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS description " This option causes the GDB stub to add a serial interrupt handler which will listen for GDB break packets. This lets you stop the @@ -93,7 +96,7 @@ cdl_option CYGDBG_HAL_DEBUG_GDB_CTRLC_SU requires !CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT active_if { CYGSEM_HAL_USE_ROM_MONITOR || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS } active_if { CYGINT_HAL_DEBUG_GDB_CTRLC_UNSUPPORTED == 0 } - default_value 1 + default_value { !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS } description " This option adds an interrupt handler for the GDB serial line which will listen for GDB break packets. This lets you stop the
--- a/packages/hal/common/current/cdl/hal.cdl +++ b/packages/hal/common/current/cdl/hal.cdl @@ -23,7 +23,7 @@ # # The Initial Developer of the Original Code is Red Hat. # Portions created by Red Hat are -# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. # All Rights Reserved. # ------------------------------------------- # @@ -162,18 +162,171 @@ cdl_package CYGPKG_HAL { defines a calling interface between applications running in RAM and the ROM monitor." compile hal_if.c hal_misc.c - + + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE { + display "Inherit console settings from ROM monitor" + active_if CYGSEM_HAL_USE_ROM_MONITOR + default_value { CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED \ + && !CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS } + description " + When this option is set, the application will inherit + the console as set up by the ROM monitor. This means + that the application will use whatever channel and + mangling style was used by the ROM monitor when + the application was launched." + } + + cdl_option CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE { + display "Debug channel is configurable" + calculated { CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS } + description " + This option is a configuration hint - it is enabled + when the HAL initialization code will make use + of the debug channel configuration option." + } + + cdl_option CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE { + display "Console channel is configurable" + calculated { !CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE \ + && !CYGDBG_HAL_DIAG_TO_DEBUG_CHAN } + description " + This option is a configuration hint - it is enabled + when the HAL initialization code will make use + of the console channel configuration option." + } + + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE { + display "Initialize whole of virtual vector table" + default_value { CYG_HAL_STARTUP != "RAM" || !CYGSEM_HAL_USE_ROM_MONITOR || !CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED } + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHE + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA + requires CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS + description " + This option will cause the whole of the virtual + vector table to be initialized with dummy values on + startup. When this option is enabled, all the + options below must also be enabled - or the + table would be empty when the application + launches. + + On targets where older ROM monitors without + virtual vector support may still be in use, it is + necessary for RAM applictions to initialize the + table (since all HAL diagnostics and debug IO + happens via the table). The default setting of + this option will see to this, but it is still + possible to override the option when a target with + a newer ROM monitor is used." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT { + display "Claim virtual vector table entries by default" + active_if !CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE + default_value 1 + description " + By default most virtual vectors will be claimed by + RAM startup configurations, meaning that the RAM + application will provide the services. The + exception is COMMS support (HAL + diagnostics/debugging IO) which is left in the + control of the ROM monitor. + + The reasoning behind this is to get as much of the + code exercised during regular development so it + is known to be working the few times a new ROM + monitor or a ROM production configuration is used + - COMMS are excluded only by necessity in order to + avoid breaking an existing debugger connections + (there may be ways around this). + + For production RAM configurations this option can + be switched off, causing the appliction to rely on + the ROM monitor for these services, thus + saving some space. + + Individual vectors may also be left unclaimed, + controlled by the below options (meaning that the + associated service provided by the ROM monitor + will be used)." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL { + display "Claim ictrl/exc virtual vectors" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } + description " + This option will cause the ictrl/exc virtual + vectors to be claimed. These are pointers to + the HAL interrupt handlers table and the HAL VSR + table." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET { + display "Claim reset virtual vectors" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } + description " + This option will cause the reset and kill_by_reset + virtual vectors to be claimed." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US { + display "Claim delay_us virtual vector" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } + description " + This option will cause the delay_us + virtual vector to be claimed." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHE { + display "Claim cache virtual vectors" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } + description " + This option will cause the cache virtual vectors + to be claimed." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA { + display "Claim data virtual vectors" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DEFAULT } + description " + This option will cause the data virtual vectors + to be claimed. These are (unused at present) + pointers to CPU, board and debug information." + } + + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS { + display "Claim comms virtual vectors" + default_value { CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE \ + || CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS } + description " + This option will cause the communication tables + that are part of the virtual vectors mechanism to + be claimed. Note that doing this may cause an + existing ROM monitor communication connection to + be closed. For this reason, the option is disabled + per default for normal application + configurations." + } + cdl_option CYGSEM_HAL_VIRTUAL_VECTOR_DIAG { display "Do diagnostic IO via virtual vector table" - default_value { CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED } + calculated 1 description " - The virtual vector table provides functions for - diagnostic IO. Using these both reduce the application - size a bit, and allow the ROM monitor to control which - communication intererface to use. Careful when enabling - this option as it may cause output to disappear (if - the ROM monitor does not provide the necessary - services)." + All HAL IO happens via the virtual vector table / comm + tables when those tables are supported by the HAL. + + If so desired, the low-level IO functions can + still be provided by the RAM application by + enabling the CLAIM_COMMS option." } }
--- a/packages/hal/common/current/include/hal_if.h +++ b/packages/hal/common/current/include/hal_if.h @@ -26,7 +26,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -55,6 +55,9 @@ #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT +// Architecture/var/platform may override the accessor macros. +#include <cyg/hal/hal_arch.h> + //-------------------------------------------------------------------------- #ifndef _BSP_HANDLER_T_DEFINED #define _BSP_HANDLER_T_DEFINED @@ -142,58 +145,62 @@ typedef volatile CYG_ADDRWORD hal_virtua // table and structure implementations have been suggested). typedef void* __comm_if_ch_data_t; +typedef void (*__comm_if_write_t)(void* __ch_data, const cyg_uint8* __buf, + cyg_uint32 __len); +typedef int (*__comm_if_read_t)(void* __ch_data, cyg_uint8* __buf, + cyg_uint32 __len); +typedef void (*__comm_if_putc_t)(void* __ch_data, cyg_uint8 __ch); +typedef cyg_uint8 (*__comm_if_getc_t)(void* __ch_data); +typedef int (*__comm_if_control_t)(void *__ch_data, + __comm_control_cmd_t __func, ...); +typedef int (*__comm_if_dbg_isr_t)(void *__ch_data, + int* __ctrlc, CYG_ADDRWORD __vector, + CYG_ADDRWORD __data); +typedef cyg_bool (*__comm_if_getc_timeout_t)(void* __ch_data, cyg_uint8* __ch); + +#ifndef CYGACC_COMM_IF_DEFINED #define CYGACC_COMM_IF_CH_DATA(_t_) \ ((__comm_if_ch_data_t)((_t_)[CYGNUM_COMM_IF_CH_DATA])) #define CYGACC_COMM_IF_CH_DATA_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_CH_DATA]=(CYG_ADDRWORD)(_x_) -typedef void (*__comm_if_write_t)(void* __ch_data, const cyg_uint8* __buf, - cyg_uint32 __len); #define CYGACC_COMM_IF_WRITE(_t_, _b_, _l_) \ - ((__comm_if_write_t)(((_t_))[CYGNUM_COMM_IF_WRITE]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) + ((__comm_if_write_t)((_t_)[CYGNUM_COMM_IF_WRITE]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) #define CYGACC_COMM_IF_WRITE_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_WRITE]=(CYG_ADDRWORD)(_x_) -typedef int (*__comm_if_read_t)(void* __ch_data, cyg_uint8* __buf, - cyg_uint32 __len); #define CYGACC_COMM_IF_READ(_t_, _b_, _l_) \ - ((__comm_if_read_t)(((_t_))[CYGNUM_COMM_IF_READ]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) + ((__comm_if_read_t)((_t_)[CYGNUM_COMM_IF_READ]))(CYGACC_COMM_IF_CH_DATA(_t_), (_b_), (_l_)) #define CYGACC_COMM_IF_READ_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_READ]=(CYG_ADDRWORD)(_x_) -typedef void (*__comm_if_putc_t)(void* __ch_data, cyg_uint8 __ch); #define CYGACC_COMM_IF_PUTC(_t_, _c_) \ - ((__comm_if_putc_t)(((_t_))[CYGNUM_COMM_IF_PUTC]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) + ((__comm_if_putc_t)((_t_)[CYGNUM_COMM_IF_PUTC]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) #define CYGACC_COMM_IF_PUTC_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_PUTC]=(CYG_ADDRWORD)(_x_) -typedef cyg_uint8 (*__comm_if_getc_t)(void* __ch_data); #define CYGACC_COMM_IF_GETC(_t_) \ ((__comm_if_getc_t)((_t_)[CYGNUM_COMM_IF_GETC]))(CYGACC_COMM_IF_CH_DATA(_t_)) #define CYGACC_COMM_IF_GETC_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_GETC]=(CYG_ADDRWORD)(_x_) -typedef int (*__comm_if_control_t)(void *__ch_data, - __comm_control_cmd_t __func, ...); #define CYGACC_COMM_IF_CONTROL(_t_, args...) \ - ((__comm_if_control_t)(((_t_))[CYGNUM_COMM_IF_CONTROL]))(CYGACC_COMM_IF_CH_DATA(_t_), args) + ((__comm_if_control_t)((_t_)[CYGNUM_COMM_IF_CONTROL]))(CYGACC_COMM_IF_CH_DATA(_t_), args) #define CYGACC_COMM_IF_CONTROL_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_CONTROL]=(CYG_ADDRWORD)(_x_) -typedef int (*__comm_if_dbg_isr_t)(void *__ch_data, - int* __ctrlc, CYG_ADDRWORD __vector, - CYG_ADDRWORD __data); #define CYGACC_COMM_IF_DBG_ISR(_t_, _c_, _v_, _d_) \ - ((__comm_if_dbg_isr_t)(((_t_))[CYGNUM_COMM_IF_DBG_ISR]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_), (_v_), (_d_)) + ((__comm_if_dbg_isr_t)((_t_)[CYGNUM_COMM_IF_DBG_ISR]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_), (_v_), (_d_)) #define CYGACC_COMM_IF_DBG_ISR_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_DBG_ISR]=(CYG_ADDRWORD)(_x_) -typedef cyg_bool (*__comm_if_getc_timeout_t)(void* __ch_data, cyg_uint8* __ch); #define CYGACC_COMM_IF_GETC_TIMEOUT(_t_, _c_) \ - ((__comm_if_getc_timeout_t)(((_t_))[CYGNUM_COMM_IF_GETC_TIMEOUT]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) + ((__comm_if_getc_timeout_t)((_t_)[CYGNUM_COMM_IF_GETC_TIMEOUT]))(CYGACC_COMM_IF_CH_DATA(_t_), (_c_)) #define CYGACC_COMM_IF_GETC_TIMEOUT_SET(_t_, _x_) \ (_t_)[CYGNUM_COMM_IF_GETC_TIMEOUT]=(CYG_ADDRWORD)(_x_) +#endif // CYGACC_COMM_IF_DEFINED + //-------------------------------------------------------------------------- // Main calling interface table. Will be assigned a location by the // linker script. Both ROM and RAM startup applications will know about @@ -227,10 +234,16 @@ typedef cyg_bool (*__comm_if_getc_timeou externC volatile CYG_ADDRWORD hal_virtual_vector_table[CYGNUM_CALL_IF_TABLE_SIZE]; -// Table version is simply the number of the last active entry in the table -// (except INSTALL_BPT_FN since it's so high). -#define CYGNUM_CALL_IF_TABLE_VERSION CYGNUM_CALL_IF_LAST_ENTRY - +// Table version contains version information for both the CALL table +// itself (the number of the last active entry in the table), and the +// COMM table (the size of the table). +#define CYGNUM_CALL_IF_TABLE_VERSION_CALL CYGNUM_CALL_IF_LAST_ENTRY +#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK (CYGNUM_CALL_IF_TABLE_SIZE+1) +#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_MAX CYGNUM_CALL_IF_TABLE_SIZE +#define CYGNUM_CALL_IF_TABLE_VERSION_COMM CYGNUM_COMM_IF_TABLE_SIZE +#define CYGNUM_CALL_IF_TABLE_VERSION_CALL_MASK 0x0000ffff +#define CYGNUM_CALL_IF_TABLE_VERSION_COMM_MASK 0xffff0000 +#define CYGNUM_CALL_IF_TABLE_VERSION_COMM_shift 16 // These are special debug/console procs IDs @@ -251,110 +264,116 @@ externC volatile CYG_ADDRWORD hal_virtua // table and structure implementations have been suggested). typedef int __call_if_version_t; +typedef void* __call_if_ictrl_table_t; +typedef void* __call_if_exc_table_t; +typedef bsp_handler_t *__call_if_dbg_vector_t; +typedef bsp_handler_t __call_if_kill_vector_t; +typedef hal_virtual_comm_table_t *__call_if_console_procs_t; +typedef hal_virtual_comm_table_t *__call_if_debug_procs_t; +typedef void (*__call_if_flush_dcache_t)(void *__p, int __nbytes); +typedef void (*__call_if_flush_icache_t)(void *__p, int __nbytes); +typedef void* __call_if_cpu_data_t; +typedef void* __call_if_board_data_t; +typedef int (*__call_if_sysinfo_t)(int __id, void* __ap); +//typedef int (*__call_if_sysinfo_t)(enum bsp_info_id __id, va_list __ap); +typedef int (*__call_if_set_debug_comm_t)(int __comm_id); +typedef int (*__call_if_set_console_comm_t)(int __comm_id); +typedef int (*__call_if_set_serial_baud_t)(int __comm_id, int __baud); +typedef void* __call_if_dbg_data_t; +typedef int (*__call_if_dbg_syscall_t) (enum dbg_syscall_ids id, + union dbg_thread_syscall_parms *p ); +typedef void (*__call_if_reset_t)(void); +typedef int __call_if_console_interrupt_flag_t; +typedef void (*__call_if_delay_us_t)(cyg_int32 usecs); +typedef void (*__call_if_install_bpt_fn_t)(void *__epc); + +#ifndef CYGACC_CALL_IF_DEFINED + #define CYGACC_CALL_IF_VERSION() \ ((__call_if_version_t)hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]) #define CYGACC_CALL_IF_VERSION_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_VERSION]=(CYG_ADDRWORD)(_x_) -typedef void* __call_if_ictrl_table_t; #define CYGACC_CALL_IF_ICTRL_TABLE() \ ((__call_if_ictrl_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE]) #define CYGACC_CALL_IF_ICTRL_TABLE_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_ICTRL_TABLE]=(CYG_ADDRWORD)(_x_) -typedef void* __call_if_exc_table_t; #define CYGACC_CALL_IF_EXC_TABLE() \ ((__call_if_exc_table_t)hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE]) #define CYGACC_CALL_IF_EXC_TABLE_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_EXC_TABLE]=(CYG_ADDRWORD)(_x_) -typedef bsp_handler_t *__call_if_dbg_vector_t; #define CYGACC_CALL_IF_DBG_VECTOR() \ ((__call_if_dbg_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR]) #define CYGACC_CALL_IF_DBG_VECTOR_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_VECTOR]=(CYG_ADDRWORD)(_x_) -typedef bsp_handler_t __call_if_kill_vector_t; #define CYGACC_CALL_IF_KILL_VECTOR() \ ((__call_if_kill_vector_t)hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]) #define CYGACC_CALL_IF_KILL_VECTOR_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_KILL_VECTOR]=(CYG_ADDRWORD)(_x_) -typedef hal_virtual_comm_table_t *__call_if_console_procs_t; #define CYGACC_CALL_IF_CONSOLE_PROCS() \ ((__call_if_console_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]) #define CYGACC_CALL_IF_CONSOLE_PROCS_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]=(CYG_ADDRWORD)(_x_) -typedef hal_virtual_comm_table_t *__call_if_debug_procs_t; #define CYGACC_CALL_IF_DEBUG_PROCS() \ ((__call_if_debug_procs_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]) #define CYGACC_CALL_IF_DEBUG_PROCS_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DEBUG_PROCS]=(CYG_ADDRWORD)(_x_) -typedef void (*__call_if_flush_dcache_t)(void *__p, int __nbytes); #define CYGACC_CALL_IF_FLUSH_DCACHE(_p_, _n_) \ ((__call_if_flush_dcache_t)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE])((_p_), (_n_)) #define CYGACC_CALL_IF_FLUSH_DCACHE_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_DCACHE]=(CYG_ADDRWORD)(_x_) -typedef void (*__call_if_flush_icache_t)(void *__p, int __nbytes); #define CYGACC_CALL_IF_FLUSH_ICACHE(_p_, _n_) \ ((__call_if_flush_icache_t)hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE])((_p_), (_n_)) #define CYGACC_CALL_IF_FLUSH_ICACHE_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_FLUSH_ICACHE]=(CYG_ADDRWORD)(_x_) -typedef void* __call_if_cpu_data_t; #define CYGACC_CALL_IF_CPU_DATA() \ ((__call_if_cpu_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA]) #define CYGACC_CALL_IF_CPU_DATA_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_CPU_DATA]=(CYG_ADDRWORD)(_x_) -typedef void* __call_if_board_data_t; #define CYGACC_CALL_IF_BOARD_DATA() \ ((__call_if_board_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA]) #define CYGACC_CALL_IF_BOARD_DATA_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_BOARD_DATA]=(CYG_ADDRWORD)(_x_) -typedef int (*__call_if_sysinfo_t)(int __id, void* __ap); -//typedef int (*__call_if_sysinfo_t)(enum bsp_info_id __id, va_list __ap); #define CYGACC_CALL_IF_SYSINFO(_i_, _a_) \ ((__call_if_sysinfo_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO])((_i_), (_a_)) #define CYGACC_CALL_IF_SYSINFO_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SYSINFO]=(CYG_ADDRWORD)(_x_) -typedef int (*__call_if_set_debug_comm_t)(int __comm_id); #define CYGACC_CALL_IF_SET_DEBUG_COMM(_i_) \ ((__call_if_set_debug_comm_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM])((_i_)) #define CYGACC_CALL_IF_SET_DEBUG_COMM_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_DEBUG_COMM]=(CYG_ADDRWORD)(_x_) -typedef int (*__call_if_set_console_comm_t)(int __comm_id); #define CYGACC_CALL_IF_SET_CONSOLE_COMM(_i_) \ ((__call_if_set_console_comm_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM])((_i_)) #define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRWORD)(_x_) -typedef int (*__call_if_set_serial_baud_t)(int __comm_id, int __baud); #define CYGACC_CALL_IF_SET_SERIAL_BAUD(_i_, _b_) \ ((__call_if_set_serial_baud_t)hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD])((_i_), (_b_)) #define CYGACC_CALL_IF_SET_SERIAL_BAUD_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_SET_SERIAL_BAUD]=(CYG_ADDRWORD)(_x_) -typedef void* __call_if_dbg_data_t; #define CYGACC_CALL_IF_DBG_DATA() \ ((__call_if_dbg_data_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]) #define CYGACC_CALL_IF_DBG_DATA_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_DATA]=(CYG_ADDRWORD)(_x_) -typedef int (*__call_if_dbg_syscall_t) (enum dbg_syscall_ids id, - union dbg_thread_syscall_parms *p ); #define CYGACC_CALL_IF_DBG_SYSCALL() \ ((__call_if_dbg_syscall_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]) #define CYGACC_CALL_IF_DBG_SYSCALL_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DBG_SYSCALL]=(CYG_ADDRWORD)(_x_) -typedef void (*__call_if_reset_t)(void); #define CYGACC_CALL_IF_RESET() \ ((__call_if_reset_t)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET])() #define CYGACC_CALL_IF_RESET_SET(_x_) \ @@ -362,24 +381,23 @@ typedef void (*__call_if_reset_t)(void); #define CYGACC_CALL_IF_RESET_GET() \ ((__call_if_reset_t)hal_virtual_vector_table[CYGNUM_CALL_IF_RESET]) -typedef int __call_if_console_interrupt_flag_t; #define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG() \ ((__call_if_console_interrupt_flag_t)hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]) #define CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_INTERRUPT_FLAG]=(CYG_ADDRWORD)(_x_) -typedef void (*__call_if_delay_us_t)(cyg_int32 usecs); #define CYGACC_CALL_IF_DELAY_US(_u_) \ ((__call_if_delay_us_t)hal_virtual_vector_table[CYGNUM_CALL_IF_DELAY_US])((_u_)) #define CYGACC_CALL_IF_DELAY_US_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_DELAY_US]=(CYG_ADDRWORD)(_x_) -typedef void (*__call_if_install_bpt_fn_t)(void *__epc); #define CYGACC_CALL_IF_INSTALL_BPT_FN(_e_) \ ((__call_if_install_bpt_fn_t)hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN])((_e_)) #define CYGACC_CALL_IF_INSTALL_BPT_FN_SET(_x_) \ hal_virtual_vector_table[CYGNUM_CALL_IF_INSTALL_BPT_FN]=(CYG_ADDRWORD)(_x_) +#endif // CYGACC_CALL_IF_DEFINED + //-------------------------------------------------------------------------- // Diag wrappers. externC void hal_if_diag_init(void); @@ -394,22 +412,20 @@ externC cyg_bool hal_ctrlc_check(CYG_A #define HAL_CTRLC_ISR hal_ctrlc_isr #define HAL_CTRLC_CHECK hal_ctrlc_check +#else + +#if defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) \ + || defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) +// Then other code might invoke this macro +#define HAL_CTRLC_CHECK(a1,a2) (0) // Nothing, no CTRLC here +#endif + #endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT //-------------------------------------------------------------------------- // Functions provided by the HAL interface. externC void hal_if_init(void); -//-------------------------------------------------------------------------- -// Configuration control for the interface services. -// When this is set, code should initialize the vector table wherever -// appropriate. -#if !defined(CYG_HAL_STARTUP_RAM) || \ - ( defined(CYG_HAL_STARTUP_RAM) && \ - !defined(CYGSEM_HAL_USE_ROM_MONITOR)) -# define CYGPRI_HAL_IMPLEMENTS_IF_SERVICES -#endif - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_HAL_IF_H // End of hal_if.h
--- a/packages/hal/common/current/include/hal_stub.h +++ b/packages/hal/common/current/include/hal_stub.h @@ -26,7 +26,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -167,10 +167,10 @@ extern void __reset (void); // Multi-bp support. #ifndef __set_breakpoint -extern int __set_breakpoint (target_register_t addr); +extern int __set_breakpoint (target_register_t addr, target_register_t len); #endif #ifndef __remove_breakpoint -extern int __remove_breakpoint (target_register_t addr); +extern int __remove_breakpoint (target_register_t addr, target_register_t len); #endif /* Install the standard set of trap handlers for the stub. */
--- a/packages/hal/common/current/src/bplist-dynamic.c +++ b/packages/hal/common/current/src/bplist-dynamic.c @@ -24,7 +24,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -66,17 +66,20 @@ struct breakpoint_list { char old_contents [HAL_BREAKINST_SIZE]; struct breakpoint_list *next; char in_memory; + char length; } *breakpoint_list = NULL; +#ifndef HAL_BREAKINST_ADDR static HAL_BREAKINST_TYPE break_inst = HAL_BREAKINST; -static void *_break_inst = &break_inst; +#define HAL_BREAKINST_ADDR(x) ((void*)&break_inst) +#endif static struct breakpoint_list bp_list [CYGNUM_HAL_BREAKPOINT_LIST_SIZE]; static struct breakpoint_list *free_bp_list = NULL; static int curr_bp_num = 0; int -__set_breakpoint (target_register_t addr) +__set_breakpoint (target_register_t addr, target_register_t len) { struct breakpoint_list **addent = &breakpoint_list; struct breakpoint_list *l = breakpoint_list; @@ -111,12 +114,14 @@ int newent->addr = addr; newent->in_memory = 0; newent->next = l; + newent->length = len; *addent = newent; + return 0; } int -__remove_breakpoint (target_register_t addr) +__remove_breakpoint (target_register_t addr, target_register_t len) { struct breakpoint_list *l = breakpoint_list; struct breakpoint_list *prev = NULL; @@ -160,12 +165,12 @@ void int len = sizeof (l->old_contents); if (__read_mem_safe (&l->old_contents[0], (void*)l->addr, len) == len) { - if (__write_mem_safe (_break_inst, (void*)l->addr, len) == len) + if (__write_mem_safe (HAL_BREAKINST_ADDR(l->length), + (void*)l->addr, l->length) == l->length) { l->in_memory = 1; } } - } l = l->next; } @@ -220,13 +225,13 @@ typedef unsigned long target_register_t; #endif int -__set_breakpoint (target_register_t addr) +__set_breakpoint (target_register_t addr, target_register_t len) { return 1; } int -__remove_breakpoint (target_register_t addr) +__remove_breakpoint (target_register_t addr, target_register_t len) { return 1; }
--- a/packages/hal/common/current/src/drv_api.c +++ b/packages/hal/common/current/src/drv_api.c @@ -167,9 +167,9 @@ interrupt_end( cyg_uint32 chain_isr(cyg_vector_t vector, CYG_ADDRWORD data) { + cyg_interrupt *p = *(cyg_interrupt **)data; + CYG_REPORT_FUNCTION(); - - cyg_interrupt *p = *(cyg_interrupt **)data; while( p != NULL ) { @@ -526,36 +526,39 @@ externC void cyg_drv_interrupt_attach( c CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list"); - cyg_uint32 index; + { + cyg_uint32 index; - HAL_TRANSLATE_VECTOR( intr->vector, index ); + HAL_TRANSLATE_VECTOR( intr->vector, index ); - if( chain_list[index] == NULL ) - { - // First Interrupt on this chain, just assign it and register - // the chain_isr with the HAL. + if( chain_list[index] == NULL ) + { + // First Interrupt on this chain, just assign it and + // register the chain_isr with the HAL. - chain_list[index] = intr; + chain_list[index] = intr; - HAL_INTERRUPT_ATTACH( intr->vector, chain_isr, &chain_list[index], NULL ); - } - else - { - // There are already interrupts chained, add this one into the - // chain in priority order. + HAL_INTERRUPT_ATTACH( intr->vector, chain_isr, + &chain_list[index], NULL ); + } + else + { + // There are already interrupts chained, add this one into + // the chain in priority order. - Cyg_Interrupt **p = &chain_list[index]; + cyg_interrupt **p = &chain_list[index]; - while( *p != NULL ) - { - cyg_interrupt *n = *p; - - if( n->priority < intr->priority ) break; + while( *p != NULL ) + { + cyg_interrupt *n = *p; + + if( n->priority < intr->priority ) break; - p = &n->next; + p = &n->next; + } + intr->next = *p; + *p = intr; } - next = *p; - *p = intr; } #else @@ -583,30 +586,33 @@ externC void cyg_drv_interrupt_detach( c #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN // Remove the interrupt object from the vector chain. - - cyg_uint32 index; - - HAL_TRANSLATE_VECTOR( vector, index ); - cyg_interrupt **p = &chain_list[index]; + { + cyg_uint32 index; + cyg_interrupt **p; - while( *p != NULL ) - { - cyg_interrupt *n = *p; + HAL_TRANSLATE_VECTOR( vector, index ); + + p = &chain_list[index]; - if( n == intr ) + while( *p != NULL ) { - *p = intr->next; - break; - } + cyg_interrupt *n = *p; - p = &n->next; - } + if( n == intr ) + { + *p = intr->next; + break; + } + + p = &n->next; + } - // If this was the last one, detach the vector. + // If this was the last one, detach the vector. - if( chain_list[index] == NULL ) - HAL_INTERRUPT_DETACH( intr->vector, chain_isr ); + if( chain_list[index] == NULL ) + HAL_INTERRUPT_DETACH( intr->vector, chain_isr ); + } #else
--- a/packages/hal/common/current/src/generic-stub.c +++ b/packages/hal/common/current/src/generic-stub.c @@ -1300,9 +1300,9 @@ int { mode = *(ptr++); if (mode == 'C') - __remove_breakpoint (addr); + __remove_breakpoint (addr,0); else - __set_breakpoint (addr); + __set_breakpoint (addr,0); strcpy (remcomOutBuffer, "OK"); } else @@ -1358,9 +1358,9 @@ int case 0: /* sw breakpoint */ if (is_Z) - err = __set_breakpoint(addr); + err = __set_breakpoint(addr,length); else - err = __remove_breakpoint(addr); + err = __remove_breakpoint(addr,length); if (!err) strcpy (remcomOutBuffer, "OK"); else
--- a/packages/hal/common/current/src/hal_if.c +++ b/packages/hal/common/current/src/hal_if.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -68,7 +68,10 @@ externC void init_thread_syscall(void * //-------------------------------------------------------------------------- // Implementations and function wrappers for monitor services -#ifdef CYGPRI_HAL_IMPLEMENTS_IF_SERVICES +//---------------------------- +// Delay uS +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US + static void delay_us(cyg_int32 usecs) { @@ -103,7 +106,7 @@ delay_us(cyg_int32 usecs) usec_ticks -= elapsed; } while (usec_ticks > 0); } -#else +#else // CYGPKG_KERNEL #ifdef HAL_DELAY_US // Use a HAL feature if defined HAL_DELAY_US(usecs); @@ -118,25 +121,28 @@ delay_us(cyg_int32 usecs) int i; for (i = 0; i < 10; i++); } -#endif -#endif +#endif // HAL_DELAY_US +#endif // CYGPKG_KERNEL CYGARC_HAL_RESTORE_GP(); } +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US +// Reset functions +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET static void reset(void) { CYGARC_HAL_SAVE_GP(); // With luck, the platform defines some magic that will cause a hardware // reset. - HAL_STUB_PLATFORM_RESET(); + HAL_PLATFORM_RESET(); -#ifdef HAL_STUB_PLATFORM_RESET_ENTRY +#ifdef HAL_PLATFORM_RESET_ENTRY // If that's not the case (above is an empty statement) there may // be defined an address we can jump to - and effectively // reinitialize the system. Not quite as good as a reset, but it // is often enough. - goto *HAL_STUB_PLATFORM_RESET_ENTRY; + goto *HAL_PLATFORM_RESET_ENTRY; #else #error " no RESET_ENTRY" @@ -159,18 +165,25 @@ kill_by_reset(int __irq_nr, void* __regs CYGARC_HAL_RESTORE_GP(); return 0; } +#endif +//------------------------------------ +// NOP service +#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE) || \ + defined(CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS) static int nop_service(void) { // This is the default service. It always returns false (0), and - // _does_ not trigger any assertions. Clients must either cope + // _does not_ trigger any assertions. Clients must either cope // with the service failure or assert. return 0; } +#endif //---------------------------------- // Comm controls +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS #ifdef CYGNUM_HAL_VIRTUAL_VECTOR_AUX_CHANNELS #define CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS \ @@ -288,9 +301,11 @@ set_console_comm(int __comm_id) CYGARC_HAL_RESTORE_GP(); return res; } +#endif //---------------------------------- // Cache functions +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHE static void flush_icache(void *__p, int __nbytes) @@ -315,41 +330,284 @@ flush_dcache(void *__p, int __nbytes) #endif CYGARC_HAL_RESTORE_GP(); } - #endif #if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) //----------------------------------------------------------------------------- +// GDB console output mangler (O-packetizer) +// COMMS init function at end. + +// This gets called via the virtual vector console comms entry and +// handles O-packetization. The debug comms entries are used for the +// actual device IO. +static cyg_uint8 +cyg_hal_diag_mangler_gdb_getc(void* __ch_data) +{ + cyg_uint8 __ch; + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + CYGARC_HAL_SAVE_GP(); + + __ch = CYGACC_COMM_IF_GETC(*__chan); + + CYGARC_HAL_RESTORE_GP(); + + return __ch; +} + + +static void +cyg_hal_diag_mangler_gdb_putc(void* __ch_data, cyg_uint8 c) +{ + static char line[100]; + static int pos = 0; + CYGARC_HAL_SAVE_GP(); + + // No need to send CRs + if( c == '\r' ) return; + + line[pos++] = c; + + if( c == '\n' || pos == sizeof(line) ) + { + CYG_INTERRUPT_STATE old; + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + + // Disable interrupts. This prevents GDB trying to interrupt us + // while we are in the middle of sending a packet. The serial + // receive interrupt will be seen when we re-enable interrupts + // later. +#if defined(CYG_HAL_STARTUP_ROM) \ + || !defined(CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION) + HAL_DISABLE_INTERRUPTS(old); +#else + CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old); +#endif + + while(1) + { + static const char hex[] = "0123456789ABCDEF"; + cyg_uint8 csum = 0, c1; + int i; + + CYGACC_COMM_IF_PUTC(*__chan, '$'); + CYGACC_COMM_IF_PUTC(*__chan, 'O'); + csum += 'O'; + for( i = 0; i < pos; i++ ) + { + char ch = line[i]; + char h = hex[(ch>>4)&0xF]; + char l = hex[ch&0xF]; + CYGACC_COMM_IF_PUTC(*__chan, h); + CYGACC_COMM_IF_PUTC(*__chan, l); + csum += h; + csum += l; + } + CYGACC_COMM_IF_PUTC(*__chan, '#'); + CYGACC_COMM_IF_PUTC(*__chan, hex[(csum>>4)&0xF]); + CYGACC_COMM_IF_PUTC(*__chan, hex[csum&0xF]); + + nak: + c1 = CYGACC_COMM_IF_GETC(*__chan); + + if( c1 == '+' ) break; + + if( cyg_hal_is_break( &c1 , 1 ) ) { + // Caller's responsibility to react on this. + CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(1); + break; + } + if( c1 != '-' ) goto nak; + } + + pos = 0; + // And re-enable interrupts +#if defined(CYG_HAL_STARTUP_ROM) \ + || !defined(CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION) + HAL_RESTORE_INTERRUPTS(old); +#else + CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old); +#endif + } + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_diag_mangler_gdb_write(void* __ch_data, + const cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_diag_mangler_gdb_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_diag_mangler_gdb_read(void* __ch_data, + cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_diag_mangler_gdb_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +static int +cyg_hal_diag_mangler_gdb_control(void *__ch_data, + __comm_control_cmd_t __func, ...) +{ + // Do nothing (yet). + return 0; +} + +// This is the COMMS init function. It gets called both by the stubs +// and diag init code to initialize the COMMS mangler channel table - +// that's all. The callers have to decide whether to actually use this +// channel. +void +cyg_hal_diag_mangler_gdb_init(void) +{ + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize mangler procs + CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_diag_mangler_gdb_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_diag_mangler_gdb_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_diag_mangler_gdb_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_diag_mangler_gdb_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_diag_mangler_gdb_control); + + // Restore the original console channel. + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +//----------------------------------------------------------------------------- +// Null console output mangler +// COMMS init function at end. + +// This gets called via the virtual vector console comms entry and +// just forwards IO to the debug comms entries. +// This differs from setting the console channel to the same as the +// debug channel in that console output will go to the debug channel +// even if the debug channel is changed. +static cyg_uint8 +cyg_hal_diag_mangler_null_getc(void* __ch_data) +{ + cyg_uint8 __ch; + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + CYGARC_HAL_SAVE_GP(); + + __ch = CYGACC_COMM_IF_GETC(*__chan); + + CYGARC_HAL_RESTORE_GP(); + + return __ch; +} + + +static void +cyg_hal_diag_mangler_null_putc(void* __ch_data, cyg_uint8 c) +{ + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + + CYGARC_HAL_SAVE_GP(); + + CYGACC_COMM_IF_PUTC(*__chan, c); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_diag_mangler_null_write(void* __ch_data, + const cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + cyg_hal_diag_mangler_null_putc(__ch_data, *__buf++); + + CYGARC_HAL_RESTORE_GP(); +} + +static void +cyg_hal_diag_mangler_null_read(void* __ch_data, + cyg_uint8* __buf, cyg_uint32 __len) +{ + CYGARC_HAL_SAVE_GP(); + + while(__len-- > 0) + *__buf++ = cyg_hal_diag_mangler_null_getc(__ch_data); + + CYGARC_HAL_RESTORE_GP(); +} + +static int +cyg_hal_diag_mangler_null_control(void *__ch_data, + __comm_control_cmd_t __func, ...) +{ + // Do nothing (yet). + return 0; +} + +// This is the COMMS init function. It gets called both by the stubs +// and diag init code to initialize the COMMS mangler channel table - +// that's all. The callers have to decide whether to actually use this +// channel. +void +cyg_hal_diag_mangler_null_init(void) +{ + hal_virtual_comm_table_t* comm; + int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); + + // Initialize mangler procs + CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER); + comm = CYGACC_CALL_IF_CONSOLE_PROCS(); + CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_diag_mangler_null_write); + CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_diag_mangler_null_read); + CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_diag_mangler_null_putc); + CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_diag_mangler_null_getc); + CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_diag_mangler_null_control); + + // Restore the original console channel. + CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); +} + +//----------------------------------------------------------------------------- // Console IO functions that adhere to the virtual vector table semantics in // order to ensure proper debug agent mangling when required. // -// The platform HAL must specify the channel used, and provide raw IO -// routines for that channel. The platform HAL also has the necessary -// information to determine if the channel is already initialized by -// a debug agent (either builtin or in ROM). externC void cyg_hal_plf_comms_init(void); + void hal_if_diag_init(void) { -#ifdef CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - cyg_hal_plf_comms_init(); +#ifndef CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE + +#if defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) + // Use the mangler channel, which in turn uses the debug channel. + CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER); + + // Initialize the mangler channel. +#if defined(CYGSEM_HAL_DIAG_MANGLER_GDB) + cyg_hal_diag_mangler_gdb_init(); +#elif defined(CYGSEM_HAL_DIAG_MANGLER_None) + cyg_hal_diag_mangler_null_init(); #endif -#ifdef CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_DEFAULT -#define _DEFAULT CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_DEFAULT -#else -#define _DEFAULT (CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL+1) -#endif -#if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL != _DEFAULT - // Set console channel. This should only be done when the console channel - // differs from the debug channel to prevent removing the debug agent's - // mangler procs. - if (CYGACC_CALL_IF_SET_DEBUG_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT) - != CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL) +#else // CYGDBG_HAL_DIAG_TO_DEBUG_CHAN - CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL); -#endif -#undef _DEFAULT + // Use an actual (raw) IO channel + CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL); + +#endif // CYGDBG_HAL_DIAG_TO_DEBUG_CHAN + +#endif // CYGSEM_HAL_VIRTUAL_VECTOR_INHERIT_CONSOLE } void @@ -361,6 +619,13 @@ hal_if_diag_write_char(char c) CYGACC_COMM_IF_PUTC(*__chan, c); else { __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + + // FIXME: What should be done if assertions are not enabled? + // This is a bad bad situation - we have no means for diag + // output; we want to hit a breakpoint to alert the developer + // or something like that. + CYG_ASSERT(__chan, "No valid channel set"); + CYGACC_COMM_IF_PUTC(*__chan, c); } @@ -380,6 +645,13 @@ hal_if_diag_read_char(char *c) *c = CYGACC_COMM_IF_GETC(*__chan); else { __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + + // FIXME: What should be done if assertions are not enabled? + // This is a bad bad situation - we have no means for diag + // output; we want to hit a breakpoint to alert the developer + // or something like that. + CYG_ASSERT(__chan, "No valid channel set"); + *c = CYGACC_COMM_IF_GETC(*__chan); } } @@ -403,19 +675,28 @@ hal_ctrlc_isr_init(void) hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); #if 1 // Prevents crash on older stubs - if (CYGNUM_CALL_IF_TABLE_VERSION != CYGACC_CALL_IF_VERSION()) + int v_m; + // Allow only ctrl-c interrupt enabling when version in table is + // below legal max and above the necessary service, and _not_ + // the value we set it to below. + v_m = CYGACC_CALL_IF_VERSION() & CYGNUM_CALL_IF_TABLE_VERSION_CALL_MASK; + if (v_m >= CYGNUM_CALL_IF_TABLE_VERSION_CALL_MAX + || v_m < CYGNUM_CALL_IF_SET_DEBUG_COMM + || v_m == CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK) return; // Now trash that value - otherwise downloading an image with - // builtin stubs on a board with older stubs may cause all - // subsequent runs to (wrongly) fall through to the below code. - // If there is a new stub on the board, it will reinitialize the - // version field on reset. - // Yes, this is a gross hack! - CYGACC_CALL_IF_VERSION_SET(CYGNUM_CALL_IF_TABLE_VERSION+1); + // builtin stubs on a board with older stubs (which will cause the + // version to be set to VERSION_CALL) may cause all subsequent + // runs to (wrongly) fall through to the below code. If there is + // a new stub on the board, it will reinitialize the version field + // on reset. Yes, this is a gross hack! + CYGACC_CALL_IF_VERSION_SET(CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK); #endif - CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_ENABLE); + // We can only enable interrupts on a valid debug channel. + if (__chan) + CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_ENABLE); #endif } @@ -423,28 +704,32 @@ cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data) { hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); - int isr_ret, ctrlc = 0; + int isr_ret = 0, ctrlc = 0; - isr_ret = CYGACC_COMM_IF_DBG_ISR(*__chan, &ctrlc, vector, data); - if (ctrlc) - cyg_hal_user_break( (CYG_ADDRWORD *)hal_saved_interrupt_state ); + if (__chan) { + isr_ret = CYGACC_COMM_IF_DBG_ISR(*__chan, &ctrlc, vector, data); + if (ctrlc) + cyg_hal_user_break( (CYG_ADDRWORD *)hal_saved_interrupt_state ); + } return isr_ret; } cyg_bool hal_ctrlc_check(CYG_ADDRWORD vector, CYG_ADDRWORD data) { - hal_virtual_comm_table_t* chan = CYGACC_CALL_IF_DEBUG_PROCS(); - int gdb_vector = -1; + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + int gdb_vector = vector-1; int isr_ret, ctrlc = 0; // This check only to avoid crash on older stubs in case of unhandled // interrupts. It is a bit messy, but required in a transition period. - if (CYGNUM_CALL_IF_TABLE_VERSION+1 == CYGACC_CALL_IF_VERSION()) { - gdb_vector = CYGACC_COMM_IF_CONTROL(*chan, __COMMCTL_DBG_ISR_VECTOR); + if (__chan && + (CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK == + (CYGACC_CALL_IF_VERSION() & CYGNUM_CALL_IF_TABLE_VERSION_CALL_MASK))){ + gdb_vector = CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_DBG_ISR_VECTOR); } if (vector == gdb_vector) { - isr_ret = CYGACC_COMM_IF_DBG_ISR(*chan, &ctrlc, vector, data); + isr_ret = CYGACC_COMM_IF_DBG_ISR(*__chan, &ctrlc, vector, data); if (ctrlc) cyg_hal_user_break( (CYG_ADDRWORD *)hal_saved_interrupt_state ); return true; @@ -461,61 +746,88 @@ hal_ctrlc_check(CYG_ADDRWORD vector, CYG void hal_if_init(void) { - // Set up services provided by monitors -#ifdef CYGPRI_HAL_IMPLEMENTS_IF_SERVICES +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_INIT_WHOLE_TABLE { - int i, j; + int i; + // Initialize tables with the NOP service. // This should only be done for service routine entries - data // pointers should be NULLed. for (i = 0; i < CYGNUM_CALL_IF_TABLE_SIZE; i++) hal_virtual_vector_table[i] = (CYG_ADDRWORD) &nop_service; + + // Version number + CYGACC_CALL_IF_VERSION_SET(CYGNUM_CALL_IF_TABLE_VERSION_CALL + |(CYGNUM_CALL_IF_TABLE_VERSION_COMM<<CYGNUM_CALL_IF_TABLE_VERSION_COMM_shift)); + } +#endif +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_ICTRL + // ICTRL and EXC tables - I assume these to be the equivalents of + // ISR and VSR tables. + CYGACC_CALL_IF_ICTRL_TABLE_SET(hal_interrupt_handlers); + CYGACC_CALL_IF_EXC_TABLE_SET(hal_vsr_table); +#endif + + // Miscellaneous services with wrappers in this file. +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_RESET + CYGACC_CALL_IF_RESET_SET(reset); + CYGACC_CALL_IF_KILL_VECTOR_SET(kill_by_reset); +#endif +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DELAY_US + CYGACC_CALL_IF_DELAY_US_SET(delay_us); +#endif + +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_CACHE + // Cache functions + CYGACC_CALL_IF_FLUSH_ICACHE_SET(flush_icache); + CYGACC_CALL_IF_FLUSH_DCACHE_SET(flush_dcache); +#endif + + // Data entries not currently supported in eCos +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_DATA + CYGACC_CALL_IF_CPU_DATA_SET(0); + CYGACC_CALL_IF_BOARD_DATA_SET(0); + CYGACC_CALL_IF_DBG_DATA_SET(0); +#endif + + // Comm controls +#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_CLAIM_COMMS + { + int i, j; + + // Clear out tables with safe dummy function. for (j = 0; j < CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS+1; j++) for (i = 0; i < CYGNUM_COMM_IF_TABLE_SIZE; i++) comm_channels[j][i] = (CYG_ADDRWORD) &nop_service; - - // Fill in supported services. - - // Version number - CYGACC_CALL_IF_VERSION_SET(CYGNUM_CALL_IF_TABLE_VERSION); - - // ICTRL and EXC tables - I assume these to be the equivalents of - // ISR and VSR tables. - CYGACC_CALL_IF_ICTRL_TABLE_SET(hal_interrupt_handlers); - CYGACC_CALL_IF_EXC_TABLE_SET(hal_vsr_table); - - // Miscellaneous services with wrappers in this file. - CYGACC_CALL_IF_RESET_SET(reset); - CYGACC_CALL_IF_KILL_VECTOR_SET(kill_by_reset); - CYGACC_CALL_IF_DELAY_US_SET(delay_us); - - // Comm controls + // Set accessor functions CYGACC_CALL_IF_SET_DEBUG_COMM_SET(set_debug_comm); CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(set_console_comm); - // Cache functions - CYGACC_CALL_IF_FLUSH_ICACHE_SET(flush_icache); - CYGACC_CALL_IF_FLUSH_DCACHE_SET(flush_dcache); - - // Clear debug and console procs entries. If platform has been - // configured to use a separate console port, it will be set - // up later (hal_diag_init). Alternatively (if this is a stub) - // it will be initialized with the output mangler - // (O-packetizer for GDB) which uses the debug comms. + // Initialize console/debug procs. Note that these _must_ + // be set to empty before the comms init call. set_debug_comm(CYGNUM_CALL_IF_SET_COMM_ID_EMPTY); set_console_comm(CYGNUM_CALL_IF_SET_COMM_ID_EMPTY); - // Data entries not currently supported in eCos - CYGACC_CALL_IF_CPU_DATA_SET(0); - CYGACC_CALL_IF_BOARD_DATA_SET(0); - CYGACC_CALL_IF_DBG_DATA_SET(0); + // Initialize channels. This used to be done in + // hal_diag_init() and the stub initHardware() functions, but + // it makes more sense to have here. + cyg_hal_plf_comms_init(); + + // Always set the debug channel. If stubs are included, it is + // necessary. If no stubs are included it does not hurt and is + // likely to be required by the hal_if_diag_init code anyway + // as it may rely on it if using a mangler. + set_debug_comm(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); + // Set console channel to a safe default. hal_if_diag_init + // will override with console channel or mangler if necessary. + set_console_comm(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); } -#endif // Reset console interrupt flag. CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(0); +#endif // Set up services provided by clients #if defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && \
--- a/packages/hal/common/current/src/hal_misc.c +++ b/packages/hal/common/current/src/hal_misc.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -136,18 +136,20 @@ hal_default_isr(CYG_ADDRWORD vector, CYG // This check only to avoid crash on older stubs in case of unhandled // interrupts. It is a bit messy, but required in a transition period. #ifndef CYGSEM_HAL_ROM_MONITOR - if (CYGNUM_CALL_IF_TABLE_VERSION+1 == CYGACC_CALL_IF_VERSION()) + if (CYGNUM_CALL_IF_TABLE_VERSION_CALL_HACK == + (CYGACC_CALL_IF_VERSION() & CYGNUM_CALL_IF_TABLE_VERSION_CALL_MASK)) #endif { - hal_virtual_comm_table_t* comm = CYGACC_CALL_IF_DEBUG_PROCS(); - gdb_vector = CYGACC_COMM_IF_CONTROL(*comm, __COMMCTL_DBG_ISR_VECTOR); + hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); + if (__chan) + gdb_vector = CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_DBG_ISR_VECTOR); } if( vector == gdb_vector ) #else // Old code using hardwired channels. This should go away eventually. if( vector == CYGHWR_HAL_GDB_PORT_VECTOR ) #endif -#endif +#endif { result = HAL_CTRLC_ISR( vector, data ); if( 0 != result ) return result;
--- a/packages/hal/common/current/src/hal_stub.c +++ b/packages/hal/common/current/src/hal_stub.c @@ -323,136 +323,6 @@ interruptible(int state) } } -#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT -//----------------------------------------------------------------------------- -// GDB O-packetizer function. - -// This gets called via the virtual vector debug comms entry and -// handles O-packetization. The debug comms entries are used for the -// actual device IO. - -static cyg_uint8 -cyg_hal_gdb_diag_getc(void* __ch_data) -{ - cyg_uint8 __ch; - hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); - CYGARC_HAL_SAVE_GP(); - - __ch = CYGACC_COMM_IF_GETC(*__chan); - - CYGARC_HAL_RESTORE_GP(); - - return __ch; -} - - -static void -cyg_hal_gdb_diag_putc(void* __ch_data, cyg_uint8 c) -{ - static char line[100]; - static int pos = 0; - CYGARC_HAL_SAVE_GP(); - - // No need to send CRs - if( c == '\r' ) return; - - line[pos++] = c; - - if( c == '\n' || pos == sizeof(line) ) - { - CYG_INTERRUPT_STATE old; - hal_virtual_comm_table_t* __chan = CYGACC_CALL_IF_DEBUG_PROCS(); - - // Disable interrupts. This prevents GDB trying to interrupt us - // while we are in the middle of sending a packet. The serial - // receive interrupt will be seen when we re-enable interrupts - // later. -#ifdef CYG_HAL_STARTUP_ROM - HAL_DISABLE_INTERRUPTS(old); -#else - CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old); -#endif - - while(1) - { - static const char hex[] = "0123456789ABCDEF"; - cyg_uint8 csum = 0, c1; - int i; - - CYGACC_COMM_IF_PUTC(*__chan, '$'); - CYGACC_COMM_IF_PUTC(*__chan, 'O'); - csum += 'O'; - for( i = 0; i < pos; i++ ) - { - char ch = line[i]; - char h = hex[(ch>>4)&0xF]; - char l = hex[ch&0xF]; - CYGACC_COMM_IF_PUTC(*__chan, h); - CYGACC_COMM_IF_PUTC(*__chan, l); - csum += h; - csum += l; - } - CYGACC_COMM_IF_PUTC(*__chan, '#'); - CYGACC_COMM_IF_PUTC(*__chan, hex[(csum>>4)&0xF]); - CYGACC_COMM_IF_PUTC(*__chan, hex[csum&0xF]); - - nak: - c1 = CYGACC_COMM_IF_GETC(*__chan); - - if( c1 == '+' ) break; - - if( cyg_hal_is_break( &c1 , 1 ) ) { - // Caller's responsibility to react on this. - CYGACC_CALL_IF_CONSOLE_INTERRUPT_FLAG_SET(1); - break; - } - if( c1 != '-' ) goto nak; - } - - pos = 0; - // And re-enable interrupts -#ifdef CYG_HAL_STARTUP_ROM - HAL_RESTORE_INTERRUPTS(old); -#else - CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old); -#endif - } - - CYGARC_HAL_RESTORE_GP(); -} - -static void -cyg_hal_gdb_diag_write(void* __ch_data, const cyg_uint8* __buf, - cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - cyg_hal_gdb_diag_putc(__ch_data, *__buf++); - - CYGARC_HAL_RESTORE_GP(); -} - -static void -cyg_hal_gdb_diag_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len) -{ - CYGARC_HAL_SAVE_GP(); - - while(__len-- > 0) - *__buf++ = cyg_hal_gdb_diag_getc(__ch_data); - - CYGARC_HAL_RESTORE_GP(); -} - -static int -cyg_hal_gdb_diag_control(void *__ch_data, __comm_control_cmd_t __func, ...) -{ - // Do nothing (yet). - return 0; -} -#endif - - //----------------------------------------------------------------------------- // eCos stub entry and exit magic. @@ -565,33 +435,6 @@ initHardware (void) // Get serial port initialized. HAL_STUB_PLATFORM_INIT_SERIAL(); -#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT - { - hal_virtual_comm_table_t* comm; - int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); - - // Initialize mangler procs - CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_MANGLER); - comm = CYGACC_CALL_IF_CONSOLE_PROCS(); - CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_gdb_diag_write); - CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_gdb_diag_read); - CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_gdb_diag_putc); - CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_gdb_diag_getc); - CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_gdb_diag_control); - - // Now either restore the previous console channel, or let the - // mangler stay in its place. The latter happens if the - // console channel was previously unspecified, or if the - // previous channel matches the used for GDB communication. - if (CYGNUM_CALL_IF_SET_COMM_ID_EMPTY != cur - && CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL != cur) - CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); - - // Set the debug channel. - CYGACC_CALL_IF_SET_DEBUG_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); - } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT - #ifdef HAL_STUB_PLATFORM_INIT // If the platform defines any initialization code, call it here. HAL_STUB_PLATFORM_INIT(); @@ -614,7 +457,7 @@ void if (__rom_reset) __rom_reset(); #else - HAL_STUB_PLATFORM_RESET(); + HAL_PLATFORM_RESET(); #endif }
--- a/packages/hal/i386/pc/current/ChangeLog +++ b/packages/hal/i386/pc/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-12-05 Hugo Tyson <hmt@redhat.com> * src/plf_misc.c (hal_pc_fpe_dsr): Raise the base stack address by
--- a/packages/hal/i386/pc/current/include/plf_intr.h +++ b/packages/hal/i386/pc/current/include/plf_intr.h @@ -54,8 +54,10 @@ // //========================================================================== +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() hal_pc_reset() + //--------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h - -
--- a/packages/hal/i386/pc/current/include/plf_stub.h +++ b/packages/hal/i386/pc/current/include/plf_stub.h @@ -75,10 +75,6 @@ externC void hal_pc_reset(void) ; #define HAL_STUB_PLATFORM_INIT() hal_pc_stubs_init() -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() hal_pc_reset() - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS //-----------------------------------------------------------------------------
--- a/packages/hal/mips/arch/current/ChangeLog +++ b/packages/hal/mips/arch/current/ChangeLog @@ -1,90 +1,10 @@ -2001-01-25 Jesper Skov <jskov@redhat.com> - - * include/arch.inc: Allow hal_intc_decode to be defined by variant - or platform. - -2000-12-06 Jesper Skov <jskov@redhat.com> - - * include/hal_intr.h (HAL_DELAY_US): Added. - * src/hal_misc.c (hal_delay_us): Added. And fixed to work with an - incrementer that ticks at the pipeline clock rate. - -2000-12-05 Jonathan Larmour <jlarmour@redhat.com> - - * include/hal_cache.h: IWAY->_IWAY, DWAY->_DWAY for namespace - cleanliness - -2000-12-05 Jesper Skov <jskov@redhat.com> - - * include/hal_cache.h: Use variant specific method to select cache - WAY. +2001-02-12 Nick Garnett <nickg@cygnus.co.uk> -2000-10-20 Jesper Skov <jskov@redhat.com> - - * src/hal_misc.c: Update __mem_fault_handler declaration. - -2000-09-15 Jesper Skov <jskov@redhat.com> - - * include/hal_intr.h (HAL_DEFAULT_ISR): Fix warning. - (HAL_DEFAULT_ISR): Undo that change. - -2000-09-14 Jesper Skov <jskov@redhat.com> - - * include/hal_intr.h: Only define _FPE when there's a FPU. - -2000-09-13 Jesper Skov <jskov@redhat.com> - - * include/hal_intr.h (HAL_VSR_SET_TO_ECOS_HANDLER): Fix compiler - warning. - - * src/vectors.S: Fully decode TLB related exceptions. - * src/hal_misc.c (cyg_hal_exception_handler): Undid below change. + * include/mips.inc: Added some extra CP0 register names. - * src/hal_misc.c (cyg_hal_exception_handler): Base vector - calculation on cause register, not the provided vector value. - -2000-09-12 Jesper Skov <jskov@redhat.com> - - * include/hal_intr.h: Added definition for decoded FPU - exceptions. - - * src/hal_misc.c (cyg_hal_exception_handler): Decode FPU - exceptions. - -2000-09-07 Jesper Skov <jskov@redhat.com> - - * include/basetype.h: Removed change from yesterday. - - * include/hal_intr.h (CYGNUM_HAL_EXCEPTION_FPU): Associated to FPE - exceptions. - -2000-09-06 Jesper Skov <jskov@redhat.com> +2001-02-09 Jesper Skov <jskov@redhat.com> - * include/basetype.h: Override the alignment macros for the MIPS - architecture. The MIPS compiler only alows a maximum of 4 bytes - of alignment where as the default is 8 - - * include/hal_cache.h (_HAL_ASM_DCACHE_ALL_WAYS): Force d-cache - selection. - -2000-09-01 Jonathan Larmour <jlarmour@redhat.com> - - * include/mips-stub.h: No longer need to define - CYGARC_REGSIZE_DIFFERS_FROM_TARGET_REGISTER_T - (CYGARC_SIGN_EXTEND_REGISTERS): - - * include/mips-stub.h: Change vr4300 register sizes to use 32-bit - target_register_t, and tell the generic stub to use sign extension. - Ditto for tx49 - * include/hal_cache.h (_HAL_ASM_SET_MIPS_ISA): Don't use pasting - when it doesn't result in a preprocessing token. Just use string - concatenation. - -2000-07-21 Drew Moseley <dmoseley@redhat.com> - - * src/vectors.S: Only jump uncached to _start if - CYGARC_START_FUNC_UNCACHED is defined. - + * src/vectors.S: Small tweak of comments to work around tools problem 2000-07-14 Drew Moseley <dmoseley@redhat.com> * src/vectors.S: Added hal_reset_vector_first_code and
--- a/packages/hal/mips/arch/current/include/arch.inc +++ b/packages/hal/mips/arch/current/include/arch.inc @@ -54,19 +54,36 @@ ##----------------------------------------------------------------------------- ## Set up the value for the initial status register - + + +# Either the variant or platform may define an INITIAL_SR of its +#own. If not then provide a default value here. + #ifndef INITIAL_SR +# Both the variant and platform HALs have the option to add some bits +# to the default status register. If they do not choose to do so, +# supply default zeroes here. + +# ifndef INITIAL_SR_VAR +# define INITIAL_SR_VAR 0x00000000 +# endif +# ifndef INITIAL_SR_PLF +# define INITIAL_SR_PLF 0x00000000 +# endif + #if defined(CYG_HAL_STARTUP_RAM) # if defined(CYGPKG_HAL_MIPS_SIM) || !defined(CYGSEM_HAL_USE_ROM_MONITOR) -# define INITIAL_SR 0x1000ff00 /* CP0 usable, Ints enabled, master interrupt disable */ +# define INITIAL_SR_ARCH 0x1000ff00 /* CP0 usable, Ints enabled, master interrupt disable */ # else -# define INITIAL_SR 0x1040ff00 /* as above + ROM vectors used */ +# define INITIAL_SR_ARCH 0x1040ff00 /* as above + ROM vectors used */ # endif #elif defined(CYG_HAL_STARTUP_ROM) -# define INITIAL_SR 0x1040ff00 /* as above + ROM vectors used */ +# define INITIAL_SR_ARCH 0x1040ff00 /* as above + ROM vectors used */ #endif +#define INITIAL_SR (INITIAL_SR_ARCH|INITIAL_SR_VAR|INITIAL_SR_PLF) + #endif ##----------------------------------------------------------------------------- @@ -83,14 +100,17 @@ ## HAL_SavedRegisters in hal_arch.h. Do not change this without changing the ## layout there, or viceversa. +# Size of registers that change size between 32 and 64 bit implementations #ifdef CYGHWR_HAL_MIPS_64BIT # define mips_regsize 8 #else # define mips_regsize 4 #endif +# Size of registers that stay the same size in all implementations # define mips_regsize32 4 +# Size of FPU registers. #if defined(CYGHWR_HAL_MIPS_FPU) # if defined(CYGHWR_HAL_MIPS_FPU_64BIT) # define mips_fpuregsize 8 @@ -111,18 +131,22 @@ # define mipsreg_fppad (mipsreg_fcr31+mips_regsize32) # define mipsreg_vector (mipsreg_fppad+mips_regsize32) #else -# define mipsreg_vector (mipsreg_lo+mips_regsize32) +# define mipsreg_vector (mipsreg_lo+mips_regsize) #endif -#define mipsreg_pc (mipsreg_vector+mips_regsize32) -#define mipsreg_sr (mipsreg_pc+mips_regsize32) -#define mipsreg_cachectrl (mipsreg_sr+mips_regsize32) +#define mipsreg_sr (mipsreg_vector+mips_regsize32) +#define mipsreg_pc (mipsreg_sr+mips_regsize32) +#define mipsreg_cachectrl (mipsreg_pc+mips_regsize) #define mipsreg_cause (mipsreg_cachectrl+mips_regsize32) #define mipsreg_badvr (mipsreg_cause+mips_regsize32) -#define mipsreg_prid (mipsreg_badvr+mips_regsize32) +#define mipsreg_prid (mipsreg_badvr+mips_regsize) #define mipsreg_config (mipsreg_prid+mips_regsize32) #define mipsreg_size (mipsreg_config+mips_regsize32) -#define mips_exception_decrement (mipsreg_size*2) +# The following expression ensures that the decrement is always a +# multiple of 16 bytes. This is a requirement of the MEABI used in +# MIPS32/64 targets. + +#define mips_exception_decrement ((mipsreg_size*2)&~0xF) ##----------------------------------------------------------------------------- ## Minimal stack frame size uses to call functions from asm. @@ -155,7 +179,7 @@ mtc0 zero,cause # zero cause reg nop - la v0,INITIAL_SR # initialize status register + la v0,INITIAL_SR # initialize status register mtc0 v0,status nop nop @@ -258,7 +282,7 @@ nop nop nop - mtc0 \pc,epc # put PC in EPC + mvatc0 \pc,epc # put PC in EPC nop nop nop @@ -295,8 +319,11 @@ #ifndef CYGPKG_HAL_MIPS_INTC_DECODE_DEFINED .macro hal_intc_decode vnum + mfc0 v1,status # get status register (interrupt mask) + nop # delay slot mfc0 v0,cause # get cause register nop # delay slot + and v0,v0,v1 # apply interrupt mask srl v0,v0,10 # shift interrupt bits down andi v0,v0,0x7f # isolate 6 interrupt bits la v1,hal_intc_translation_table @@ -377,6 +404,30 @@ hal_intc_translation_table: ld \reg,(mipsreg_regs+29*mips_regsize)(\ptr) .endm + .macro sva reg,val + sd \reg,\val + .endm + + .macro lva reg,val + ld \reg,\val + .endm + + .macro mvafc0 gpr,cpr + dmfc0 \gpr,\cpr + .endm + + .macro mvatc0 gpr,cpr + dmtc0 \gpr,\cpr + .endm + + .macro lpc reg,ptr + ld \reg,(mipsreg_pc)(\ptr) + .endm + + .macro spc reg,ptr + sd \reg,(mipsreg_pc)(\ptr) + .endm + #else .macro sgpr reg,ptr @@ -411,9 +462,21 @@ hal_intc_translation_table: lw \reg,(mipsreg_regs+29*mips_regsize)(\ptr) .endm -#endif + .macro sva reg,val + sw \reg,\val + .endm + + .macro lva reg,val + lw \reg,\val + .endm -# PC is always 32-bit for us + .macro mvafc0 gpr,cpr + mfc0 \gpr,\cpr + .endm + + .macro mvatc0 gpr,cpr + mtc0 \gpr,\cpr + .endm .macro lpc reg,ptr lw \reg,(mipsreg_pc)(\ptr) @@ -422,6 +485,7 @@ hal_intc_translation_table: .macro spc reg,ptr sw \reg,(mipsreg_pc)(\ptr) .endm +#endif #------------------------------------------------------------------------------ # FPU macros.
--- a/packages/hal/mips/arch/current/include/hal_arch.h +++ b/packages/hal/mips/arch/current/include/hal_arch.h @@ -54,6 +54,9 @@ // Processor saved states: // The layout of this structure is also defined in "arch.inc", for assembly // code. Do not change this without changing that (or vice versa). +// Notes: This structure is carefully laid out. It is a multiple of 8 +// bytes and the pc and badvr fields are positioned to ensure that +// they are on 8 byte boundaries. #ifdef CYGHWR_HAL_MIPS_64BIT # define CYG_HAL_MIPS_REG CYG_WORD64 @@ -81,25 +84,25 @@ typedef struct CYG_HAL_MIPS_REG lo; /* lo word of mpy/div reg */ #ifdef CYGHWR_HAL_MIPS_FPU CYG_HAL_FPU_REG f[32]; /* FPU registers */ - CYG_ADDRWORD fcr31; /* FPU control/status register */ - CYG_ADDRWORD fppad; /* Dummy location to make this */ + CYG_WORD32 fcr31; /* FPU control/status register */ + CYG_WORD32 fppad; /* Dummy location to make this */ /* structure a multiple of 8 */ /* bytes long. */ #endif // These are only saved for exceptions and interrupts - CYG_ADDRWORD vector; /* Vector number */ - CYG_ADDRWORD pc; /* Program Counter */ - CYG_ADDRWORD sr; /* Status Reg */ - CYG_ADDRWORD cache; /* Cache control register */ + CYG_WORD32 vector; /* Vector number */ + CYG_WORD32 sr; /* Status Reg */ + CYG_HAL_MIPS_REG pc; /* Program Counter */ + CYG_WORD32 cache; /* Cache control register */ // These are only saved for exceptions, and are not restored // when continued. - CYG_ADDRWORD cause; /* Exception cause register */ - CYG_ADDRWORD badvr; /* Bad virtual address reg */ - CYG_ADDRWORD prid; /* Processor Version */ - CYG_ADDRWORD config; /* Config register */ + CYG_WORD32 cause; /* Exception cause register */ + CYG_HAL_MIPS_REG badvr; /* Bad virtual address reg */ + CYG_WORD32 prid; /* Processor Version */ + CYG_WORD32 config; /* Config register */ } HAL_SavedRegisters; //--------------------------------------------------------------------------
--- a/packages/hal/mips/arch/current/include/hal_intr.h +++ b/packages/hal/mips/arch/current/include/hal_intr.h @@ -498,6 +498,8 @@ CYG_MACRO_END //-------------------------------------------------------------------------- // Microsecond delay function provided in hal_misc.c +externC void hal_delay_us(int us); + #define HAL_DELAY_US(n) hal_delay_us(n) //--------------------------------------------------------------------------
--- a/packages/hal/mips/arch/current/include/mips-stub.h +++ b/packages/hal/mips/arch/current/include/mips-stub.h @@ -47,6 +47,8 @@ #include <pkgconf/system.h> +#include <cyg/hal/hal_io.h> + #ifdef __cplusplus extern "C" { #endif @@ -115,6 +117,10 @@ void __single_step (void); /* Clear the single-step state. */ void __clear_single_step (void); +extern int __is_bsp_syscall(void); + +extern int hal_syscall_handler(void); + /* If the breakpoint we hit is in the breakpoint() instruction, return a non-zero value. */ #ifndef __is_breakpoint_function
--- a/packages/hal/mips/arch/current/include/mips.inc +++ b/packages/hal/mips/arch/current/include/mips.inc @@ -139,6 +139,13 @@ #define epc $14 // Exception pc value #define prid $15 // processor ID #define config0 $16 // Config register 0 +#define lladdr $17 // LLAdddr +#define xcontext $20 // XContext register +#define ecc $26 // Error Checking and Correcting +#define cache_err $27 // Cache Error and Status +#define taglo $28 // TagLo +#define taghi $29 // TagHi +#define error_epc $30 // Error exception pc value #------------------------------------------------------------------------------
--- a/packages/hal/mips/arch/current/src/mips-stub.c +++ b/packages/hal/mips/arch/current/src/mips-stub.c @@ -46,6 +46,10 @@ #include <pkgconf/hal.h> +#ifdef CYGPKG_REDBOOT +#include <pkgconf/redboot.h> +#endif + #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS #include <cyg/hal/hal_stub.h> @@ -54,6 +58,7 @@ #include <cyg/hal/mips-regs.h> #include <cyg/hal/hal_arch.h> +#include <cyg/hal/hal_intr.h> #include <cyg/hal/mips_opcode.h> typedef unsigned long t_inst; @@ -171,6 +176,13 @@ int __get_trap_number (void) return (get_register (CAUSE) & CAUSE_EXCMASK) >> CAUSE_EXCSHIFT; } +#if defined(CYGSEM_REDBOOT_BSP_SYSCALLS) +int __is_bsp_syscall(void) +{ + return __get_trap_number() == EXC_SYS; +} +#endif + /* Set the currently-saved pc register value to PC. This also updates NPC as needed. */
--- a/packages/hal/mips/arch/current/src/vectors.S +++ b/packages/hal/mips/arch/current/src/vectors.S @@ -241,7 +241,7 @@ FUNC_START(__warm_start) # hal_diag_init hal_diag_writec '$' - mfc0 a0,$30 # get ErrorEPC + mvafc0 a0,$30 # get ErrorEPC lar k0,hal_diag_ai_write_hex8 jalr k0 nop @@ -280,9 +280,9 @@ FUNC_START(__nmi_entry) # Move the ErrorEPC register to the EPC register so that the # default exception handler saves the right PC value. - mfc0 k0,$30 + mvafc0 k0,$30 nop; nop; nop; - mtc0 k0,epc + mvatc0 k0,epc nop; nop; nop; #if (INITIAL_SR & 0x00400000) == 0 @@ -302,7 +302,6 @@ FUNC_START(__nmi_entry) FUNC_END(__nmi_entry) - ##----------------------------------------------------------------------------- ## Default exception VSR. ## Saves machine state and calls external handling code. @@ -374,18 +373,18 @@ FUNC_START(__default_exception_vsr) mfc0 t0,cause mfc0 t1,status mfc0 t2,cachectrl - mfc0 t3,badvr + mvafc0 t3,badvr mfc0 t4,config mfc0 t5,prid - mfc0 t6,epc + mvafc0 t6,epc sw t0,mipsreg_cause(sp) sw t1,mipsreg_sr(sp) sw t2,mipsreg_cachectrl(sp) - sw t3,mipsreg_badvr(sp) + sva t3,mipsreg_badvr(sp) sw t4,mipsreg_config(sp) sw t5,mipsreg_prid(sp) - sw t6,mipsreg_pc(sp) + sva t6,mipsreg_pc(sp) hal_fpu_save sp @@ -481,11 +480,11 @@ FUNC_START(__default_interrupt_vsr) mfc0 t1,status mfc0 t2,cachectrl - mfc0 t3,epc + mvafc0 t3,epc sw t1,mipsreg_sr(sp) sw t2,mipsreg_cachectrl(sp) - sw t3,mipsreg_pc(sp) + sva t3,mipsreg_pc(sp) hal_fpu_save sp @@ -503,16 +502,16 @@ FUNC_START(__default_interrupt_vsr) #endif move s0,sp # save pointer to saved state - + #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK la a0,__interrupt_stack # a0 = stack top la a1,__interrupt_stack_base # a1 = stack base sub a3,sp,a1 # a3 = sp - base - bltz a3,1f # if < 0 - not on istack + bltz a3,1f # not on istack if < 0 nop # delay slot sub t0,a0,sp # t0 = top - sp - bgtz t0,8f # if > 0 - already on istack + bgtz t0,8f # already on istack if > 0 nop # delay slot 1: move sp,a0 # switch to istack @@ -684,7 +683,6 @@ restore_state: lgpr 31,sp # == RA .set at - #if defined(CYGSEM_HAL_USE_ROM_MONITOR_CygMon) # If we have a Cygmon that wants to listen to network interrupts, then @@ -713,7 +711,7 @@ restore_state: srl k0,1 1: #endif - lw k0,mipsreg_pc(sp) # K0 = return PC + lva k0,mipsreg_pc(sp) # K0 = return PC lw k1,mipsreg_sr(sp) # K1 = saved SR lsp sp,sp # load SP @@ -777,7 +775,7 @@ FUNC_END(__gccmain) ## can handle these without affecting the debugger. FUNC_START(__break_vsr_springboard) - mfc0 k0,epc + mvafc0 k0,epc mfc0 k1,cause bltzl k1,1f addi k0,k0,4 # delay slot (only executed if BD set)
--- a/packages/hal/mips/jmr3904/current/ChangeLog +++ b/packages/hal/mips/jmr3904/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_mips_tx39_jmr3904_ram.mlt:
--- a/packages/hal/mips/jmr3904/current/include/plf_intr.h +++ b/packages/hal/mips/jmr3904/current/include/plf_intr.h @@ -69,6 +69,10 @@ externC cyg_uint32 hal_ctrlc_isr(CYG_ADD #endif +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/mips/jmr3904/current/include/plf_stub.h +++ b/packages/hal/mips/jmr3904/current/include/plf_stub.h @@ -70,12 +70,7 @@ extern void hal_jmr_put_char( int c ); // Stub initializer. #define HAL_STUB_PLATFORM_STUBS_INIT() CYG_EMPTY_STATEMENT -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/mips/ref4955/current/ChangeLog +++ b/packages/hal/mips/ref4955/current/ChangeLog @@ -1,3 +1,14 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_mips_tx49_ref4955.cdl: Respect channel configuration + constraints. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/pc87338.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_mips_tx49_ref4955_ram.mlt:
--- a/packages/hal/mips/ref4955/current/cdl/hal_mips_tx49_ref4955.cdl +++ b/packages/hal/mips/ref4955/current/cdl/hal_mips_tx49_ref4955.cdl @@ -107,6 +107,7 @@ cdl_package CYGPKG_HAL_MIPS_TX49_REF4955 cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -118,6 +119,7 @@ cdl_package CYGPKG_HAL_MIPS_TX49_REF4955 cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/mips/ref4955/current/include/plf_intr.h +++ b/packages/hal/mips/ref4955/current/include/plf_intr.h @@ -297,6 +297,15 @@ #define CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED + +//---------------------------------------------------------------------------- +// Reset. +#define CYGARC_REG_BOARD_RESET 0xb5400000 + +#define HAL_PLATFORM_RESET() HAL_WRITE_UINT8(CYGARC_REG_BOARD_RESET,0) + +#define HAL_PLATFORM_RESET_ENTRY 0xbfc00000 + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/mips/ref4955/current/include/plf_stub.h +++ b/packages/hal/mips/ref4955/current/include/plf_stub.h @@ -70,16 +70,7 @@ externC void cyg_hal_plf_comms_init(void extern void hal_plf_stub_init( void ); #define HAL_STUB_PLATFORM_INIT() hal_plf_stub_init(); -//---------------------------------------------------------------------------- -// Reset. -#define CYGARC_REG_BOARD_RESET 0xb5400000 - -#define HAL_STUB_PLATFORM_RESET() HAL_WRITE_UINT8(CYGARC_REG_BOARD_RESET,0) - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xbfc00000 - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/mips/ref4955/current/src/pc87338.c +++ b/packages/hal/mips/ref4955/current/src/pc87338.c @@ -217,9 +217,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static const channel_data_t channels[2] = { { (cyg_uint8*)CYG_DEVICE_SERIAL_SCC1, 1000, CYGNUM_HAL_INTERRUPT_DEBUG_UART}, { (cyg_uint8*)CYG_DEVICE_SERIAL_SCC2, 1000, CYGNUM_HAL_INTERRUPT_USER_UART} @@ -406,7 +403,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //----------------------------------------------------------------------------- // end of pc87338.c
--- a/packages/hal/mips/vrc4373/current/ChangeLog +++ b/packages/hal/mips/vrc4373/current/ChangeLog @@ -1,3 +1,17 @@ +2001-02-05 Jesper Skov <jskov@redhat.com> + + * include/plf_io.h: Ignore devices not on bus 0. + +2001-01-31 Nick Garnett <nickg@cygnus.co.uk> + + * src/platform.S: Added *va* (see mips/arch/.../arch.inc) macros + when manipulating values that are potentially 64 bits. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_mips_vr4300_vrc4373_ram.mlt:
--- a/packages/hal/mips/vrc4373/current/include/plf_intr.h +++ b/packages/hal/mips/vrc4373/current/include/plf_intr.h @@ -280,6 +280,11 @@ externC cyg_uint32 hal_ctrlc_isr(CYG_ADD #endif +//---------------------------------------------------------------------------- +// Reset. + +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/mips/vrc4373/current/include/plf_io.h +++ b/packages/hal/mips/vrc4373/current/include/plf_io.h @@ -205,6 +205,10 @@ CYG_MACRO_END } \ CYG_MACRO_END +// Ignore all devices on not on bus 0 since those all seem to map to the +// Nile II controller itself. +#define HAL_PCI_IGNORE_DEVICE(__bus, __dev, __fn) \ + ((__bus) != 0) //----------------------------------------------------------------------------- // end of plf_io.h
--- a/packages/hal/mips/vrc4373/current/include/plf_stub.h +++ b/packages/hal/mips/vrc4373/current/include/plf_stub.h @@ -72,13 +72,7 @@ extern void hal_plf_stub_init(void); #define HAL_STUB_PLATFORM_INIT() hal_plf_stub_init(); -//---------------------------------------------------------------------------- -// Reset. - -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/mips/vrc4373/current/src/platform.S +++ b/packages/hal/mips/vrc4373/current/src/platform.S @@ -141,7 +141,7 @@ hal_bus_error_vsr: # Check for special address la k1,hal_pci_config_read_load - mfc0 k0,epc + mvafc0 k0,epc bne k0,k1,1f nop @@ -157,7 +157,7 @@ hal_bus_error_vsr: nop nop addi k0,k0,4 # skip offending instruction - mtc0 k0,epc # return to EPC + mvatc0 k0,epc # return to EPC nop # let it work nop nop
--- a/packages/hal/mn10300/stb/current/ChangeLog +++ b/packages/hal/mn10300/stb/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_mn10300_am33_stb_ram.mlt:
--- a/packages/hal/mn10300/stb/current/include/plf_intr.h +++ b/packages/hal/mn10300/stb/current/include/plf_intr.h @@ -68,6 +68,11 @@ externC cyg_uint32 hal_ctrlc_isr(CYG_ADD #endif + +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/mn10300/stb/current/include/plf_stub.h +++ b/packages/hal/mn10300/stb/current/include/plf_stub.h @@ -75,12 +75,7 @@ externC void hal_stb_platform_init(void) #define HAL_STUB_PLATFORM_INIT() hal_stb_platform_init() -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/mn10300/stdeval1/current/ChangeLog +++ b/packages/hal/mn10300/stdeval1/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Reset macros moved + * include/plf_intr.h: to this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_mn10300_am31_stdeval1_ram.h:
--- a/packages/hal/mn10300/stdeval1/current/include/plf_intr.h +++ b/packages/hal/mn10300/stdeval1/current/include/plf_intr.h @@ -68,6 +68,10 @@ externC cyg_uint32 hal_ctrlc_isr(CYG_ADD #endif +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/mn10300/stdeval1/current/include/plf_stub.h +++ b/packages/hal/mn10300/stdeval1/current/include/plf_stub.h @@ -72,12 +72,7 @@ extern void hal_stdeval1_init_break_irq( // Stub initializer. #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/powerpc/arch/current/ChangeLog +++ b/packages/hal/powerpc/arch/current/ChangeLog @@ -1,3 +1,8 @@ +2001-02-05 Jesper Skov <jskov@redhat.com> + + * src/ppc_stub.c (__computeSignal): Hack to allow thread debugging + on 40x cores. + 2001-01-24 Jesper Skov <jskov@redhat.com> * src/powerpc.ld: Added .sdata to .sdata pattern.
--- a/packages/hal/powerpc/arch/current/src/ppc_stub.c +++ b/packages/hal/powerpc/arch/current/src/ppc_stub.c @@ -90,6 +90,11 @@ int __computeSignal (unsigned int trap_n return SIGTRAP; case CYGNUM_HAL_VECTOR_PROGRAM: +#ifdef CYGPKG_HAL_POWERPC_PPC40x + // The 40x is b0rken, returning 0 for these bits. Translate to + // SIGTRAP to allow thread debugging. + return SIGTRAP; +#else // The register PS contains the value of SRR1 at the time of // exception entry. Bits 11-15 contain information about the // cause of the exception. Bits 16-31 the PS (MSR) state. @@ -109,6 +114,7 @@ int __computeSignal (unsigned int trap_n default: /* should never happen! */ return SIGILL; } +#endif case CYGNUM_HAL_VECTOR_RESERVED_A: case CYGNUM_HAL_VECTOR_RESERVED_B:
--- a/packages/hal/powerpc/cogent/current/ChangeLog +++ b/packages/hal/powerpc/cogent/current/ChangeLog @@ -1,3 +1,9 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_powerpc_cogent_ram.h:
--- a/packages/hal/powerpc/cogent/current/include/plf_intr.h +++ b/packages/hal/powerpc/cogent/current/include/plf_intr.h @@ -48,6 +48,15 @@ // //========================================================================== + +//---------------------------------------------------------------------------- +// Reset. +// The Cogent does not have a watchdog (not one we can easily use for this +// purpose anyway). +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + +#define HAL_PLATFORM_RESET_ENTRY 0xfff00100 + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/powerpc/cogent/current/include/plf_stub.h +++ b/packages/hal/powerpc/cogent/current/include/plf_stub.h @@ -78,15 +78,6 @@ extern void hal_plf_stub_init( void ); #define HAL_STUB_PLATFORM_INIT() hal_plf_stub_init(); #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -// The Cogent does not have a watchdog (not one we can easily use for this -// purpose anyway). -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xfff00100 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/powerpc/cogent/current/src/hal_diag.c +++ b/packages/hal/powerpc/cogent/current/src/hal_diag.c @@ -55,9 +55,6 @@ #include <cyg/hal/hal_if.h> // Calling-if API -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static void cyg_hal_plf_serial_init(void); static void cyg_hal_plf_lcd_init(void); @@ -74,7 +71,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); cyg_hal_plf_lcd_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Serial driver @@ -261,9 +257,6 @@ cyg_hal_plf_serial_putc(void* __ch_data, CYGARC_HAL_RESTORE_GP(); } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static const channel_data_t channels[2] = { { (cyg_uint8*)CYG_DEV_SERIAL_BASE_A, 1000, CYGNUM_HAL_INTERRUPT_SIU_IRQ1}, { (cyg_uint8*)CYG_DEV_SERIAL_BASE_B, 1000, CYGNUM_HAL_INTERRUPT_SIU_IRQ1} @@ -437,8 +430,6 @@ cyg_hal_plf_serial_init(void) CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= // LCD driver @@ -446,8 +437,6 @@ cyg_hal_plf_serial_init(void) // The LCD driver is only used by the new vector code. Cannot be used // by the old compatibility cruft. -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) // FEMA 162B 16 character x 2 line LCD // base addresses and register offsets * @@ -659,7 +648,6 @@ cyg_hal_plf_lcd_init(void) // Restore original console CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Compatibility with older stubs
--- a/packages/hal/powerpc/fads/current/ChangeLog +++ b/packages/hal/powerpc/fads/current/ChangeLog @@ -1,3 +1,8 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_powerpc_fads_ram.mlt:
--- a/packages/hal/powerpc/fads/current/include/plf_intr.h +++ b/packages/hal/powerpc/fads/current/include/plf_intr.h @@ -48,7 +48,11 @@ // //========================================================================== -// Empty for now +//---------------------------------------------------------------------------- +// Reset. +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + +#define HAL_PLATFORM_RESET_ENTRY 0xfff00100 //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H
--- a/packages/hal/powerpc/fads/current/include/plf_stub.h +++ b/packages/hal/powerpc/fads/current/include/plf_stub.h @@ -68,13 +68,6 @@ #define HAL_STUB_PLATFORM_INIT() CYG_EMPTY_STATEMENT #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xfff00100 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/powerpc/mbx/current/ChangeLog +++ b/packages/hal/powerpc/mbx/current/ChangeLog @@ -1,3 +1,21 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * cdl/hal_powerpc_mbx.cdl: Respect channel configuration + constraints. + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_GDB/None + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + 2001-01-19 Gary Thomas <gthomas@redhat.com> * include/hal_diag.h: Remove unwarranted disclaimer [commentary].
--- a/packages/hal/powerpc/mbx/current/cdl/hal_powerpc_mbx.cdl +++ b/packages/hal/powerpc/mbx/current/cdl/hal_powerpc_mbx.cdl @@ -113,6 +113,7 @@ cdl_package CYGPKG_HAL_POWERPC_MBX { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 @@ -124,6 +125,7 @@ cdl_package CYGPKG_HAL_POWERPC_MBX { cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" + active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0
--- a/packages/hal/powerpc/mbx/current/include/plf_intr.h +++ b/packages/hal/powerpc/mbx/current/include/plf_intr.h @@ -58,6 +58,16 @@ // Defined by the quicc driver #include <cyg/hal/quicc/quicc_smc1.h> + +//---------------------------------------------------------------------------- +// Reset. + +// The MBX does not have a watchdog (not one we can easily use for this +// purpose anyway). +#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT + +#define HAL_PLATFORM_RESET_ENTRY 0xfe000100 + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/powerpc/mbx/current/include/plf_stub.h +++ b/packages/hal/powerpc/mbx/current/include/plf_stub.h @@ -74,16 +74,6 @@ externC void hal_mbx_set_led( int val ); #endif #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. - -// The MBX does not have a watchdog (not one we can easily use for this -// purpose anyway). -#define HAL_STUB_PLATFORM_RESET() CYG_EMPTY_STATEMENT - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xfe000100 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/powerpc/mbx/current/src/hal_diag.c +++ b/packages/hal/powerpc/mbx/current/src/hal_diag.c @@ -135,7 +135,7 @@ void hal_diag_init(void) // init the actual serial port cyg_hal_plf_serial_init_channel(); -#ifndef CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL +#ifdef CYGSEM_HAL_DIAG_MANGLER_GDB #ifndef CYG_HAL_STARTUP_ROM // We are talking to GDB; ack the "go" packet! cyg_hal_plf_serial_putc(eppc, '+'); @@ -151,7 +151,7 @@ void hal_diag_write_char_serial( char c HAL_RESTORE_INTERRUPTS(__state); } -#if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) void hal_diag_write_char(char c) { #ifdef CYGDBG_DIAG_BUF
--- a/packages/hal/powerpc/mpc8xx/current/ChangeLog +++ b/packages/hal/powerpc/mpc8xx/current/ChangeLog @@ -1,3 +1,9 @@ +2001-01-31 Jesper Skov <jskov@redhat.com> + + * cdl/hal_powerpc_mpc8xx.cdl: Get rid of + CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL options. They are replaced by + the CYGSEM_HAL_DIAG_MANGLER option. + 2000-11-04 Gary Thomas <gthomas@redhat.com> * include/var_intr.h: Export symbols used in assembly code.
--- a/packages/hal/powerpc/mpc8xx/current/cdl/hal_powerpc_mpc8xx.cdl +++ b/packages/hal/powerpc/mpc8xx/current/cdl/hal_powerpc_mpc8xx.cdl @@ -50,11 +50,6 @@ cdl_package CYGPKG_HAL_POWERPC_MPC8xx { for this processor variant. It is also necessary to select a specific target platform HAL package." - # This package allows GDB protocol on diag serial device - # to be explicitly controlled, i.e. turned off. - - implements CYGINT_HAL_DIAG_DISABLE_GDB_PROTOCOL_SUPPORTED - cdl_interface CYGINT_HAL_USE_ROM_MONITOR_UNSUPPORTED { display "ROM monitor configuration is unsupported" no_define
--- a/packages/hal/powerpc/ppc40x/current/ChangeLog +++ b/packages/hal/powerpc/ppc40x/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/var_intr.h: Include plf_intr.h + 2001-01-18 Gary Thomas <gthomas@redhat.com> * cdl/hal_powerpc_ppc40x.cdl: Move CYGSEM_HAL_USE_ROM_MONITOR to
--- a/packages/hal/powerpc/ppc40x/current/include/var_intr.h +++ b/packages/hal/powerpc/ppc40x/current/include/var_intr.h @@ -47,6 +47,7 @@ // //============================================================================= +#include <cyg/hal/plf_intr.h> // Special handling for additional exceptions
--- a/packages/hal/powerpc/quicc/current/ChangeLog +++ b/packages/hal/powerpc/quicc/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/quicc_smc1.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + 2001-01-15 Gary Thomas <gthomas@redhat.com> * src/quicc_smc1.c: Provide for multiple serial input buffers
--- a/packages/hal/powerpc/quicc/current/src/quicc_smc1.c +++ b/packages/hal/powerpc/quicc/current/src/quicc_smc1.c @@ -347,9 +347,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static void cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) @@ -511,7 +508,5 @@ cyg_hal_plf_serial_init(void) CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - #endif // CYGPKG_HAL_POWERPC_MPC860 // EOF quicc_smc1.c
--- a/packages/hal/sh/arch/current/ChangeLog +++ b/packages/hal/sh/arch/current/ChangeLog @@ -1,3 +1,7 @@ +2001-01-26 Jesper Skov <jskov@redhat.com> + + * tests/intr0.c: Moved test header inclusion to proper location. + 2001-01-18 Jesper Skov <jskov@redhat.com> Case 105302
--- a/packages/hal/sh/arch/current/tests/intr0.c +++ b/packages/hal/sh/arch/current/tests/intr0.c @@ -39,6 +39,8 @@ #include <pkgconf/system.h> +#include <cyg/infra/testcase.h> + #if defined(CYGPKG_KERNEL) #include <pkgconf/kernel.h> @@ -49,8 +51,6 @@ #include <cyg/kernel/kapi.h> -#include <cyg/infra/testcase.h> - #include <cyg/hal/hal_intr.h> // -------------------------------------------------------------------------
--- a/packages/hal/sh/cq7708/current/ChangeLog +++ b/packages/hal/sh/cq7708/current/ChangeLog @@ -1,3 +1,13 @@ +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Included private parts of serial driver. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + 2001-01-23 Jesper Skov <jskov@redhat.com> * include/platform.inc: Properly init interrupt VSR.
--- a/packages/hal/sh/cq7708/current/include/plf_intr.h +++ b/packages/hal/sh/cq7708/current/include/plf_intr.h @@ -51,9 +51,14 @@ #include <pkgconf/hal.h> -//-------------------------------------------------------------------------- -// No platform specific stuff at present. +//---------------------------------------------------------------------------- +// Reset. +// Block interrupts and cause an exception. This forces a reset. +#define HAL_PLATFORM_RESET() \ + asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) + +#define HAL_PLATFORM_RESET_ENTRY 0xa0000000 //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H
--- a/packages/hal/sh/cq7708/current/include/plf_stub.h +++ b/packages/hal/sh/cq7708/current/include/plf_stub.h @@ -76,15 +76,6 @@ externC void cyg_hal_plf_comms_init(void #endif #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -// Block interrupts and cause an exception. This forces a reset. -#define HAL_STUB_PLATFORM_RESET() \ - asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/sh/cq7708/current/src/hal_diag.c +++ b/packages/hal/sh/cq7708/current/src/hal_diag.c @@ -56,9 +56,6 @@ //----------------------------------------------------------------------------- -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - void cyg_hal_plf_comms_init(void) { @@ -72,8 +69,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_sci_init(0, 0, CYGNUM_HAL_INTERRUPT_SCI_RXI, SCI_BASE); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= // Led control //============================================================================= @@ -97,6 +92,9 @@ hal_diag_led_off( void ) #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG +#define CYGPRI_HAL_SH_SH3_SCI_PRIVATE +#include <cyg/hal/sh3_sci.h> // driver API + static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
--- a/packages/hal/sh/cq7750/current/ChangeLog +++ b/packages/hal/sh/cq7750/current/ChangeLog @@ -1,3 +1,13 @@ +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Included private parts of serial driver. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + 2001-01-23 Jesper Skov <jskov@redhat.com> * include/platform.inc: Properly init interrupt VSR.
--- a/packages/hal/sh/cq7750/current/include/plf_intr.h +++ b/packages/hal/sh/cq7750/current/include/plf_intr.h @@ -51,9 +51,14 @@ #include <pkgconf/hal.h> -//-------------------------------------------------------------------------- -// No platform specific stuff at present. +//---------------------------------------------------------------------------- +// Reset. +// Block interrupts and cause an exception. This forces a reset. +#define HAL_PLATFORM_RESET() \ + asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) + +#define HAL_PLATFORM_RESET_ENTRY 0xa0000000 //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H
--- a/packages/hal/sh/cq7750/current/include/plf_stub.h +++ b/packages/hal/sh/cq7750/current/include/plf_stub.h @@ -76,15 +76,6 @@ externC void cyg_hal_plf_comms_init(void #endif #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -// Block interrupts and cause an exception. This forces a reset. -#define HAL_STUB_PLATFORM_RESET() \ - asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/sh/cq7750/current/src/hal_diag.c +++ b/packages/hal/sh/cq7750/current/src/hal_diag.c @@ -56,8 +56,6 @@ //----------------------------------------------------------------------------- -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) void cyg_hal_plf_comms_init(void) @@ -72,8 +70,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_scif_init(0, 0, CYGNUM_HAL_INTERRUPT_SCIF_RXI, SCI_BASE); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= // Led control //============================================================================= @@ -97,6 +93,9 @@ hal_diag_led_off( void ) #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG +#define CYGPRI_HAL_SH_SH4_SCIF_PRIVATE +#include <cyg/hal/sh4_scif.h> // driver API + static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
--- a/packages/hal/sh/edk7708/current/ChangeLog +++ b/packages/hal/sh/edk7708/current/ChangeLog @@ -1,3 +1,13 @@ +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Included private parts of serial driver. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * include/plf_stub.h: Moved reset macro to + * include/plf_intr.h: this file. + * src/hal_diag.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + 2001-01-23 Jesper Skov <jskov@redhat.com> * include/platform.inc: Properly init interrupt VSR.
--- a/packages/hal/sh/edk7708/current/include/plf_intr.h +++ b/packages/hal/sh/edk7708/current/include/plf_intr.h @@ -51,10 +51,14 @@ #include <pkgconf/hal.h> -//-------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Reset. +// Block interrupts and cause an exception. This forces a reset. +#define HAL_PLATFORM_RESET() \ + asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) -// No platform specific stuff at present. - +#define HAL_PLATFORM_RESET_ENTRY 0xa0000000 + //-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_PLF_INTR_H // End of plf_intr.h
--- a/packages/hal/sh/edk7708/current/include/plf_stub.h +++ b/packages/hal/sh/edk7708/current/include/plf_stub.h @@ -76,15 +76,6 @@ externC void cyg_hal_plf_comms_init(void #endif #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - -//---------------------------------------------------------------------------- -// Reset. -// Block interrupts and cause an exception. This forces a reset. -#define HAL_STUB_PLATFORM_RESET() \ - asm volatile ("ldc %0,sr;trapa #0x00;" : : "r" (CYGARC_REG_SR_BL)) - -#define HAL_STUB_PLATFORM_RESET_ENTRY 0xa0000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/sh/edk7708/current/src/hal_diag.c +++ b/packages/hal/sh/edk7708/current/src/hal_diag.c @@ -56,8 +56,6 @@ //----------------------------------------------------------------------------- -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) void cyg_hal_plf_comms_init(void) @@ -72,8 +70,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_sci_init(0, 0, CYGNUM_HAL_INTERRUPT_SCI_RXI, SCI_BASE); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - //============================================================================= // Led control //============================================================================= @@ -99,6 +95,9 @@ hal_diag_led_off( void ) #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG +#define CYGPRI_HAL_SH_SH3_SCI_PRIVATE +#include <cyg/hal/sh3_sci.h> // driver API + static channel_data_t channel = { (cyg_uint8*)SCI_BASE, 0, 0}; #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
--- a/packages/hal/sh/sh3/current/ChangeLog +++ b/packages/hal/sh/sh3/current/ChangeLog @@ -1,3 +1,33 @@ +2001-02-02 Jesper Skov <jskov@redhat.com> + + * src/sh3_sci.c: Baud rate is always specified, remove fallback + hack. Proper macro renaming. + * src/sh3_scif.c: Same. Proper macro renaming. + * cdl/hal_sh_sh3.cdl: Added baud rate options which get default + values from platform CDL if it needs to be different from 38400 + baud. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * include/sh3_scif.h: Moved init_channel function into private + part. + * include/sh3_sci.h: Same. + +2001-01-30 Jesper Skov <jskov@redhat.com> + + * include/sh3_sci.h: Separate exported API from definitions used + in the driver. + * include/sh3_scif.h: Same. + * src/sh3_sci.c: Request private definitions. + * src/sh3_scif.c: Same. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/sh3_sci.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * src/sh3_scif.c: Same. + + * include/var_intr.h: Include platform interrupt header. + 2001-01-18 Jesper Skov <jskov@redhat.com> Case 105302
--- a/packages/hal/sh/sh3/current/cdl/hal_sh_sh3.cdl +++ b/packages/hal/sh/sh3/current/cdl/hal_sh_sh3.cdl @@ -292,6 +292,27 @@ cdl_package CYGPKG_HAL_SH_SH3 { } } + cdl_option CYGNUM_HAL_SH_SH3_SCI_BAUD_RATE { + display "SCI serial port default baud rate" + flavor data + legal_values { 4800 9600 14400 19200 38400 57600 115200 } + default_value { CYGNUM_HAL_SH_SH3_SCI_BAUD_RATE_DEFAULT ? \ + CYGNUM_HAL_SH_SH3_SCI_BAUD_RATE_DEFAULT : 38400 } + description " + This controls the default baud rate used for communicating + with GDB / displaying diagnostic output." + } + + cdl_option CYGNUM_HAL_SH_SH3_SCIF_BAUD_RATE { + display "SCIF serial ports default baud rate" + flavor data + legal_values { 4800 9600 14400 19200 38400 57600 115200 } + default_value { CYGNUM_HAL_SH_SH3_SCIF_BAUD_RATE_DEFAULT ? \ + CYGNUM_HAL_SH_SH3_SCIF_BAUD_RATE_DEFAULT : 38400 } + description " + This controls the default baud rate used for communicating + with GDB / displaying diagnostic output." + } cdl_component CYGPKG_HAL_SH_INTERRUPT { display "Interrupt controls"
--- a/packages/hal/sh/sh3/current/include/sh3_sci.h +++ b/packages/hal/sh/sh3/current/include/sh3_sci.h @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -44,6 +44,17 @@ #ifdef CYGNUM_HAL_SH_SH3_SCI_PORTS //-------------------------------------------------------------------------- +// Exported functions + +externC cyg_uint8 cyg_hal_plf_sci_getc(void* __ch_data); +externC void cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c); +externC void cyg_hal_plf_sci_init(int sci_index, int comm_index, + int rcv_vect, cyg_uint8* base); + + +#ifdef CYGPRI_HAL_SH_SH3_SCI_PRIVATE + +//-------------------------------------------------------------------------- // SCI register offsets #if (CYGARC_SH_MOD_SCI >= 2) # define _REG_SCSPTR -0x4 // serial port register @@ -68,13 +79,10 @@ typedef struct { #if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) // This one should only be used by old-stub compatibility code! externC void cyg_hal_plf_sci_init_channel(const channel_data_t* chan); +#warning "You should not be using anything but vv diag" #endif -externC cyg_uint8 cyg_hal_plf_sci_getc(void* __ch_data); -externC void cyg_hal_plf_sci_putc(void* __ch_data, cyg_uint8 c); -externC void cyg_hal_plf_sci_init(int sci_index, int comm_index, - int rcv_vect, cyg_uint8* base); - +#endif // CYGPRI_HAL_SH_SH3_SCI_PRIVATE #endif // CYGNUM_HAL_SH_SH3_SCI_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/sh/sh3/current/include/sh3_scif.h +++ b/packages/hal/sh/sh3/current/include/sh3_scif.h @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -52,6 +52,16 @@ #ifdef CYGNUM_HAL_SH_SH3_SCIF_PORTS //-------------------------------------------------------------------------- +// Exported functions + +externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); +externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); +void cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base); + +#ifdef CYGPRI_HAL_SH_SH3_SCIF_PRIVATE + +//-------------------------------------------------------------------------- // SCIF register offsets #define _REG_SCSMR 0x00 #define _REG_SCBRR 0x02 @@ -75,13 +85,10 @@ typedef struct { #if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) // This one should only be used by old-stub compatibility code! externC void cyg_hal_plf_scif_init_channel(const channel_data_t* chan); +#warning "You should not be using anything but vv diag" #endif -externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); -externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); -void cyg_hal_plf_scif_init(int scif_index, int comm_index, - int rcv_vect, cyg_uint8* base); - +#endif // CYGPRI_HAL_SH_SH3_SCIF_PRIVATE #endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/sh/sh3/current/include/var_intr.h +++ b/packages/hal/sh/sh3/current/include/var_intr.h @@ -51,8 +51,11 @@ //========================================================================== #include <pkgconf/hal.h> + #include CYGBLD_HAL_CPU_MODULES_H // INTC module selection +#include <cyg/hal/plf_intr.h> + //---------------------------------------------------------------------------- // Additional vectors provided by INTC V2
--- a/packages/hal/sh/sh3/current/src/sh3_sci.c +++ b/packages/hal/sh/sh3/current/src/sh3_sci.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -54,14 +54,11 @@ #include <cyg/hal/hal_if.h> // Calling-if API #include <cyg/hal/sh_regs.h> // serial register definitions +#define CYGPRI_HAL_SH_SH3_SCI_PRIVATE #include <cyg/hal/sh3_sci.h> // our header //-------------------------------------------------------------------------- -#ifndef CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE -# define CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE 38400 -#endif - void cyg_hal_plf_sci_init_channel(const channel_data_t* chan) { @@ -78,9 +75,9 @@ cyg_hal_plf_sci_init_channel(const chann // Set speed to CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE HAL_READ_UINT8(base+_REG_SCSMR, tmp); tmp &= ~CYGARC_REG_SCSMR_CKSx_MASK; - tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE); + tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCI_BAUD_RATE); HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); - HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCI_DEFAULT_BAUD_RATE)); + HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCI_BAUD_RATE)); } static cyg_bool @@ -137,8 +134,6 @@ cyg_hal_plf_sci_putc(void* __ch_data, cy CYGARC_HAL_RESTORE_GP(); } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCI_PORTS]; @@ -299,8 +294,6 @@ cyg_hal_plf_sci_init(int sci_index, int CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - #endif // CYGNUM_HAL_SH_SH3_SCI_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/sh/sh3/current/src/sh3_scif.c +++ b/packages/hal/sh/sh3/current/src/sh3_scif.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -60,14 +60,11 @@ #include <cyg/hal/sh_regs.h> // serial register definitions #include <cyg/hal/sh_stub.h> // target_register_t +#define CYGPRI_HAL_SH_SH3_SCIF_PRIVATE #include <cyg/hal/sh3_scif.h> // our header //-------------------------------------------------------------------------- -#ifndef CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE -# define CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE 38400 -#endif - void cyg_hal_plf_scif_init_channel(const channel_data_t* chan) { @@ -88,9 +85,9 @@ cyg_hal_plf_scif_init_channel(const chan // Set speed to CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE HAL_READ_UINT8(base+_REG_SCSMR, tmp); tmp &= ~CYGARC_REG_SCSMR2_CKSx_MASK; - tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE); + tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH3_SCIF_BAUD_RATE); HAL_WRITE_UINT8(base+_REG_SCSMR, tmp); - HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCIF_DEFAULT_BAUD_RATE)); + HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH3_SCIF_BAUD_RATE)); // Let things settle: Here we should should wait the equivalent of // one bit interval, @@ -173,8 +170,6 @@ cyg_hal_plf_scif_putc(void* __ch_data, c CYGARC_HAL_RESTORE_GP(); } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) static channel_data_t channels[CYGNUM_HAL_SH_SH3_SCIF_PORTS]; @@ -336,8 +331,6 @@ cyg_hal_plf_scif_init(int scif_index, in CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - #endif // CYGNUM_HAL_SH_SH3_SCIF_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/sh/sh4/current/ChangeLog +++ b/packages/hal/sh/sh4/current/ChangeLog @@ -1,3 +1,21 @@ +2001-02-02 Jesper Skov <jskov@redhat.com> + + * cdl/hal_sh_sh4.cdl: Added baud rate option. + + * src/sh4_scif.c (cyg_hal_plf_scif_init_channel): Use specified + baud rate. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * include/sh4_scif.h: Separate exported API from definitions used + in the driver. + * src/sh4_scif.c: Request private definitions. + +2001-01-26 Jesper Skov <jskov@redhat.com> + + * src/sh4_sci.c: Removed CYGSEM_HAL_VIRTUAL_VECTOR_DIAG check. + * src/sh4_scif.c: Same. + 2001-01-18 Jesper Skov <jskov@redhat.com> Case 105302
--- a/packages/hal/sh/sh4/current/cdl/hal_sh_sh4.cdl +++ b/packages/hal/sh/sh4/current/cdl/hal_sh_sh4.cdl @@ -146,4 +146,15 @@ cdl_package CYGPKG_HAL_SH_SH4 { speed and the PFC divider setting." } } + + cdl_option CYGNUM_HAL_SH_SH4_SCIF_BAUD_RATE { + display "SCIF serial ports default baud rate" + flavor data + legal_values { 4800 9600 14400 19200 38400 57600 115200 } + default_value { CYGNUM_HAL_SH_SH4_SCIF_BAUD_RATE_DEFAULT ? \ + CYGNUM_HAL_SH_SH4_SCIF_BAUD_RATE_DEFAULT : 38400 } + description " + This controls the default baud rate used for communicating + with GDB / displaying diagnostic output." + } }
--- a/packages/hal/sh/sh4/current/include/sh4_scif.h +++ b/packages/hal/sh/sh4/current/include/sh4_scif.h @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -48,6 +48,16 @@ #ifdef CYGNUM_HAL_SH_SH4_SCIF_PORTS //-------------------------------------------------------------------------- +// Exported functions + +externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); +externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); +void cyg_hal_plf_scif_init(int scif_index, int comm_index, + int rcv_vect, cyg_uint8* base); + +#ifdef CYGPRI_HAL_SH_SH4_SCIF_PRIVATE + +//-------------------------------------------------------------------------- // SCIF register offsets #define _REG_SCSMR 0x00 #define _REG_SCBRR 0x04 @@ -73,13 +83,10 @@ typedef struct { #if !defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) // This one should only be used by old-stub compatibility code! externC void cyg_hal_plf_scif_init_channel(const channel_data_t* chan); +#warning "You should not be using anything but vv diag" #endif -externC cyg_uint8 cyg_hal_plf_scif_getc(void* __ch_data); -externC void cyg_hal_plf_scif_putc(void* __ch_data, cyg_uint8 c); -void cyg_hal_plf_scif_init(int scif_index, int comm_index, - int rcv_vect, cyg_uint8* base); - +#endif // CYGPRI_HAL_SH_SH4_SCIF_PRIVATE #endif // CYGNUM_HAL_SH_SH4_SCIF_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/sh/sh4/current/src/sh4_scif.c +++ b/packages/hal/sh/sh4/current/src/sh4_scif.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -56,6 +56,7 @@ #include <cyg/hal/sh_regs.h> // serial register definitions #include <cyg/hal/sh_stub.h> // target_register_t +#define CYGPRI_HAL_SH_SH4_SCIF_PRIVATE #include <cyg/hal/sh4_scif.h> // our header //-------------------------------------------------------------------------- @@ -77,15 +78,16 @@ cyg_hal_plf_scif_init_channel(const chan // 8-1-no parity. HAL_WRITE_UINT16(base+_REG_SCSMR, 0); - // Set speed to 38400 + // Set desired baudrate HAL_READ_UINT16(base+_REG_SCSMR, tmp); tmp &= ~CYGARC_REG_SCSMR2_CKSx_MASK; - tmp |= CYGARC_SCBRR_CKSx(38400); + tmp |= CYGARC_SCBRR_CKSx(CYGNUM_HAL_SH_SH4_SCIF_BAUD_RATE); HAL_WRITE_UINT16(base+_REG_SCSMR, tmp); - HAL_WRITE_UINT8(base+_REG_SCBRR, CYGARC_SCBRR_N(38400)); + HAL_WRITE_UINT8(base+_REG_SCBRR, + CYGARC_SCBRR_N(CYGNUM_HAL_SH_SH4_SCIF_BAUD_RATE)); // Let things settle: Here we should should wait the equivalent of - // one bit interval, i.e. 1/38400 second, but until we have + // one bit interval, i.e. 1/<baudrate> second, but until we have // something like the Linux delay loop, it's hard to do reliably. So // just move on and hope for the best (this is unlikely to cause // problems since the CPU has just come out of reset anyway). @@ -162,8 +164,6 @@ cyg_hal_plf_scif_putc(void* __ch_data, c CYGARC_HAL_RESTORE_GP(); } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) static channel_data_t channels[CYGNUM_HAL_SH_SH4_SCIF_PORTS]; @@ -325,8 +325,6 @@ cyg_hal_plf_scif_init(int scif_index, in CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES - #endif // CYGNUM_HAL_SH_SH4_SCIF_PORTS //-----------------------------------------------------------------------------
--- a/packages/hal/v85x/arch/current/ChangeLog +++ b/packages/hal/v85x/arch/current/ChangeLog @@ -1,3 +1,11 @@ +2001-01-26 Jonathan Larmour <jlarmour@redhat.com> + + * include/hal_intr.h: Move HAL_STUB_PLATFORM_RESET and + HAL_STUB_PLATFORM_RESET_ENTRY here from platform stub headers. + Also rename to HAL_PLATFORM_RESET and HAL_PLATFORM_RESET_ENTRY + + * src/vectors.S (_hal_reset_board): Renamed from hal_plf_reset_board + 2001-01-18 Nick Garnett <nickg@cygnus.co.uk> * src/vectors.S: Added underscore to reference to
--- a/packages/hal/v85x/arch/current/include/hal_intr.h +++ b/packages/hal/v85x/arch/current/include/hal_intr.h @@ -262,5 +262,14 @@ externC cyg_uint32 hal_clock_read(void); #endif //-------------------------------------------------------------------------- +// Reset. + +#ifndef HAL_PLATFORM_RESET +extern void hal_reset_board(void); +#define HAL_PLATFORM_RESET() hal_reset_board() +#define HAL_PLATFORM_RESET_ENTRY 0x00000000 +#endif + +//-------------------------------------------------------------------------- #endif // ifndef CYGONCE_HAL_HAL_INTR_H // End of hal_intr.h
--- a/packages/hal/v85x/arch/current/src/vectors.S +++ b/packages/hal/v85x/arch/current/src/vectors.S @@ -466,8 +466,8 @@ call_via_r1: // // Reset the board // - .globl _hal_plf_reset_board -_hal_plf_reset_board: + .globl _hal_reset_board +_hal_reset_board: di // Turn off interrupts jmp [r0] // Restart machine
--- a/packages/hal/v85x/ceb_v850/current/ChangeLog +++ b/packages/hal/v85x/ceb_v850/current/ChangeLog @@ -1,3 +1,22 @@ +2001-02-08 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replace CYGSEM_HAL_DIAG_MANGLER_None with + CYGDBG_HAL_DIAG_TO_DEBUG_CHAN. + +2001-01-31 Jesper Skov <jskov@redhat.com> + + * src/hal_diag.c: Replaced CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL + with CYGSEM_HAL_DIAG_MANGLER_None + * cdl/hal_v85x_ceb_v850.cdl: Same. + * src/hal_diag.c: Get rid of CYGPRI_HAL_IMPLEMENTS_IF_SERVICES + checks. + +2001-01-26 Jonathan Larmour <jlarmour@redhat.com> + + * include/plf_stub.h (HAL_STUB_PLATFORM_RESET): Move to arch HAL + hal_intr.h + (HAL_STUB_PLATFORM_RESET_ENTRY): Ditto + 2000-10-20 Jonathan Larmour <jlarmour@redhat.com> * include/pkgconf/mlt_v85x_v850_ceb_ram.mlt:
--- a/packages/hal/v85x/ceb_v850/current/cdl/hal_v85x_ceb_v850.cdl +++ b/packages/hal/v85x/ceb_v850/current/cdl/hal_v85x_ceb_v850.cdl @@ -54,7 +54,6 @@ cdl_package CYGPKG_HAL_V85X_V850_CEB { implements CYGINT_HAL_DEBUG_GDB_STUBS implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK - implements CYGINT_HAL_DIAG_DISABLE_GDB_PROTOCOL_SUPPORTED implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT_GUARANTEED
--- a/packages/hal/v85x/ceb_v850/current/include/plf_stub.h +++ b/packages/hal/v85x/ceb_v850/current/include/plf_stub.h @@ -70,13 +70,6 @@ extern void hal_plf_stub_init(void); #endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS -//---------------------------------------------------------------------------- -// Reset. - -extern void hal_plf_reset_board(void); -#define HAL_STUB_PLATFORM_RESET() hal_plf_reset_board() -#define HAL_STUB_PLATFORM_RESET_ENTRY 0x00000000 - //----------------------------------------------------------------------------- #endif // CYGONCE_HAL_PLF_STUB_H // End of plf_stub.h
--- a/packages/hal/v85x/ceb_v850/current/src/hal_diag.c +++ b/packages/hal/v85x/ceb_v850/current/src/hal_diag.c @@ -142,9 +142,6 @@ cyg_hal_plf_serial_getc(void* __ch_data) return ch; } -#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \ - || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES) - static void cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) @@ -291,7 +288,6 @@ cyg_hal_plf_comms_init(void) cyg_hal_plf_serial_init(); } -#endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES //============================================================================= // Compatibility with older stubs @@ -310,7 +306,7 @@ cyg_hal_plf_comms_init(void) #if defined(CYG_HAL_STARTUP_ROM) && !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) #define HAL_DIAG_USES_HARDWARE #else -#if defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL) +#if !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN) #define HAL_DIAG_USES_HARDWARE #endif #endif
--- a/packages/io/flash/current/ChangeLog +++ b/packages/io/flash/current/ChangeLog @@ -1,3 +1,10 @@ +2001-02-06 Hugo Tyson <hmt@redhat.com> + + * src/flash.c (flash_erase): Add an additional argument to the + call into the driver, being the blocksize (as discovered). This + allows a gross check for actual erase in some drivers. Those that + don't use it, it's harmless - after all, this is an API by trust. + 2000-12-06 Jesper Skov <jskov@redhat.com> * src/flash.c (flash_dev_query): Added. Allows reloc/cache magic
--- a/packages/io/flash/current/src/flash.c +++ b/packages/io/flash/current/src/flash.c @@ -90,7 +90,6 @@ flash_dev_query(void* data) int code_len; code_fun *_flash_query; int d_cache, i_cache; - void* flash_id; // Query the device driver - copy 'query' code to RAM for execution code_len = (unsigned long)&flash_query_end - (unsigned long)&flash_query; @@ -147,7 +146,7 @@ flash_erase(void *addr, int len, void ** int stat = 0; extern char flash_erase_block[], flash_erase_block_end[]; int code_len; - typedef int code_fun(unsigned short *); + typedef int code_fun(unsigned short *, unsigned int); code_fun *_flash_erase_block; int d_cache, i_cache; @@ -170,7 +169,8 @@ flash_erase(void *addr, int len, void ** #ifdef RAM_FLASH_DEV_DEBUG _flash_erase_block = &flash_erase_block; #endif - stat = (*_flash_erase_block)(block); + // Supply the blocksize for a gross check for erase success + stat = (*_flash_erase_block)(block, flash_info.block_size); stat = flash_hwr_map_error(stat); if (stat) { *err_addr = (void *)block; @@ -351,3 +351,5 @@ flash_errmsg(int err) return "Unknown error"; } } + +// EOF io/flash/..../flash.c
--- a/packages/io/pci/current/ChangeLog +++ b/packages/io/pci/current/ChangeLog @@ -1,3 +1,7 @@ +2001-02-02 Jesper Skov <jskov@redhat.com> + + * tests/pci2.c (pci_test): Removed bogus check for 1MB IO limit. + 2001-01-10 Jesper Skov <jskov@redhat.com> * src/pci.c (cyg_pci_get_device_info): Do correct casting of
--- a/packages/io/pci/current/tests/pci2.c +++ b/packages/io/pci/current/tests/pci2.c @@ -128,17 +128,6 @@ pci_test( void ) "cyg_pci_allocate_io_priv(256) size failed"); CYG_TEST_CHECK(0x0100 == io_assigned_addr, "cyg_pci_allocate_io_priv(256) align failed"); - // Check IO space limit - io_base = 0x100000-0x80; - dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xffffff00; - CYG_TEST_CHECK(!cyg_pci_allocate_io_priv(&dev_info, 0, &io_base, - &io_assigned_addr), - "cyg_pci_allocate_io_priv overflow"); - dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xffffff80; - CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base, - &io_assigned_addr), - "cyg_pci_allocate_io_priv overflow (on limit)"); - // Check allocation and alignment of MEM space mem_base = 0x00000000;
new file mode 100644 --- /dev/null +++ b/packages/io/usb/common/current/ChangeLog @@ -0,0 +1,38 @@ +2001-01-25 Bart Veer <bartv@redhat.com> + + * cdl/usb.cdl: + Correctly parent below CYGPKG_IO + +2000-11-22 Bart Veer <bartv@redhat.com> + + * include/usb.h: Fix nested #include protection. + +2000-11-21 Bart Veer <bartv@redhat.com> + + * First check-in of eCos USB support. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//===========================================================================
new file mode 100644 --- /dev/null +++ b/packages/io/usb/common/current/cdl/usb.cdl @@ -0,0 +1,54 @@ +# ==================================================================== +# +# usb.cdl +# +# USB support +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 2000, 2001 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): bartv +# Original data: bartv +# Contributors: +# Date: 2000-10-04 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_IO_USB { + display "USB Support" + include_dir "cyg/io/usb" + parent CYGPKG_IO + + cdl_interface CYGHWR_IO_USB_HOST { + display "Availability of USB host-side hardware" + } + cdl_interface CYGHWR_IO_USB_SLAVE { + display "Availability of USB slave-side hardware" + } +}
new file mode 100644 --- /dev/null +++ b/packages/io/usb/common/current/include/usb.h @@ -0,0 +1,240 @@ +#ifndef CYGONCE_USB_H +# define CYGONCE_USB_H +//========================================================================== +// +// include/usb.h +// +// Data common to USB host and USB slave +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +//####DESCRIPTIONEND#### +//========================================================================== + +#ifdef __cplusplus +extern "C" { +#endif + +// USB device requests, the setup packet. +// +// The structure is defined entirely in terms of bytes, eliminating +// any confusion about who is supposed to swap what when. This avoids +// endianness-related portability problems, and eliminates any need +// to worry about alignment. Also for some requests the value field +// is split into separate bytes anyway. +typedef struct usb_devreq { + unsigned char type; + unsigned char request; + unsigned char value_lo; + unsigned char value_hi; + unsigned char index_lo; + unsigned char index_hi; + unsigned char length_lo; + unsigned char length_hi; +} usb_devreq __attribute__((packed)); + +// Encoding of the request_type +#define USB_DEVREQ_DIRECTION_OUT 0 +#define USB_DEVREQ_DIRECTION_IN (1 << 7) +#define USB_DEVREQ_DIRECTION_MASK (1 << 7) + +#define USB_DEVREQ_TYPE_STANDARD 0 +#define USB_DEVREQ_TYPE_CLASS (0x1 << 5) +#define USB_DEVREQ_TYPE_VENDOR (0x2 << 5) +#define USB_DEVREQ_TYPE_RESERVED (0x3 << 5) +#define USB_DEVREQ_TYPE_MASK (0x3 << 5) + +#define USB_DEVREQ_RECIPIENT_DEVICE 0x00 +#define USB_DEVREQ_RECIPIENT_INTERFACE 0x01 +#define USB_DEVREQ_RECIPIENT_ENDPOINT 0x02 +#define USB_DEVREQ_RECIPIENT_OTHER 0x03 +#define USB_DEVREQ_RECIPIENT_MASK 0x1F + +// The standard request codes. +#define USB_DEVREQ_GET_STATUS 0 +#define USB_DEVREQ_CLEAR_FEATURE 1 +#define USB_DEVREQ_SET_FEATURE 3 +#define USB_DEVREQ_SET_ADDRESS 5 +#define USB_DEVREQ_GET_DESCRIPTOR 6 +#define USB_DEVREQ_SET_DESCRIPTOR 7 +#define USB_DEVREQ_GET_CONFIGURATION 8 +#define USB_DEVREQ_SET_CONFIGURATION 9 +#define USB_DEVREQ_GET_INTERFACE 10 +#define USB_DEVREQ_SET_INTERFACE 11 +#define USB_DEVREQ_SYNCH_FRAME 12 + +// Descriptor types. These are placed in value_hi for the +// GET_DESCRIPTOR and SET_DESCRIPTOR requests, with an index +// in value_lo. They also go into the type fields of the +// various descriptor structures. +#define USB_DEVREQ_DESCRIPTOR_TYPE_DEVICE 1 +#define USB_DEVREQ_DESCRIPTOR_TYPE_CONFIGURATION 2 +#define USB_DEVREQ_DESCRIPTOR_TYPE_STRING 3 +#define USB_DEVREQ_DESCRIPTOR_TYPE_INTERFACE 4 +#define USB_DEVREQ_DESCRIPTOR_TYPE_ENDPOINT 5 + +// Feature selectors. These go into value_lo for the CLEAR_FEATURE and +// SET_FEATURE requests, and in the first response byte for +// GET_STATUS. +#define USB_DEVREQ_FEATURE_DEVICE_REMOTE_WAKEUP 1 +#define USB_DEVREQ_FEATURE_ENDPOINT_HALT 0 + +// Index decoding. When the CLEAR_FEATURE, SET_FEATURE and GET_STATUS +// requests is applied to an endpoint (as per the recipient field in +// the type field) index_lo identifies the endpoint. +#define USB_DEVREQ_INDEX_DIRECTION_OUT 0 +#define USB_DEVREQ_INDEX_DIRECTION_IN (1 << 7) +#define USB_DEVREQ_INDEX_DIRECTION_MASK (1 << 7) +#define USB_DEVREQ_INDEX_ENDPOINT_MASK 0x0F + +// Descriptors for the GET_DESCRIPTOR and SET_DESCRIPTOR requests. +typedef struct usb_device_descriptor { + unsigned char length; // USB_DEVICE_DESCRIPTOR_LENGTH == 18 + unsigned char type; // USB_DEVREQ_DESCRIPTOR_TYPE + unsigned char usb_spec_lo; + unsigned char usb_spec_hi; + unsigned char device_class; + unsigned char device_subclass; + unsigned char device_protocol; + unsigned char max_packet_size; + unsigned char vendor_lo; + unsigned char vendor_hi; + unsigned char product_lo; + unsigned char product_hi; + unsigned char device_lo; + unsigned char device_hi; + unsigned char manufacturer_str; + unsigned char product_str; + unsigned char serial_number_str; + unsigned char number_configurations; +} usb_device_descriptor __attribute__((packed)); + +#define USB_DEVICE_DESCRIPTOR_LENGTH 18 +#define USB_DEVICE_DESCRIPTOR_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_DEVICE +#define USB_DEVICE_DESCRIPTOR_USB11_LO 0x10 +#define USB_DEVICE_DESCRIPTOR_USB11_HI 0x01 + +#define USB_DEVICE_DESCRIPTOR_CLASS_INTERFACE 0x00 +#define USB_DEVICE_DESCRIPTOR_CLASS_VENDOR 0x00FF +#define USB_DEVICE_DESCRIPTOR_SUBCLASS_INTERFACE 0x00 +#define USB_DEVICE_DESCRIPTOR_SUBCLASS_VENDOR 0x00FF +#define USB_DEVICE_DESCRIPTOR_PROTOCOL_INTERFACE 0x00 +#define USB_DEVICE_DESCRIPTOR_PROTOCOL_VENDOR 0x00FF + +typedef struct usb_configuration_descriptor { + unsigned char length; + unsigned char type; + unsigned char total_length_lo; + unsigned char total_length_hi; + unsigned char number_interfaces; + unsigned char configuration_id; + unsigned char configuration_str; + unsigned char attributes; + unsigned char max_power; +} usb_configuration_descriptor __attribute__((packed)); + +#define USB_CONFIGURATION_DESCRIPTOR_LENGTH 9 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_CONFIGURATION +#define USB_CONFIGURATION_DESCRIPTOR_ATTR_REQUIRED (1 << 7) +#define USB_CONFIGURATION_DESCRIPTOR_ATTR_SELF_POWERED (1 << 6) +#define USB_CONFIGURATION_DESCRIPTOR_ATTR_REMOTE_WAKEUP (1 << 5) + +typedef struct usb_interface_descriptor { + unsigned char length; + unsigned char type; + unsigned char interface_id; + unsigned char alternate_setting; + unsigned char number_endpoints; + unsigned char interface_class; + unsigned char interface_subclass; + unsigned char interface_protocol; + unsigned char interface_str; +} usb_interface_descriptor __attribute__((packed)); + +#define USB_INTERFACE_DESCRIPTOR_LENGTH 9 +#define USB_INTERFACE_DESCRIPTOR_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_INTERFACE +#define USB_INTERFACE_DESCRIPTOR_CLASS_VENDOR 0x00FF +#define USB_INTERFACE_DESCRIPTOR_SUBCLASS_VENDOR 0x00FF +#define USB_INTERFACE_DESCRIPTOR_PROTOCOL_VENDOR 0x00FF + +typedef struct usb_endpoint_descriptor { + unsigned char length; + unsigned char type; + unsigned char endpoint; + unsigned char attributes; + unsigned char max_packet_lo; + unsigned char max_packet_hi; + unsigned char interval; +} usb_endpoint_descriptor; + +#define USB_ENDPOINT_DESCRIPTOR_LENGTH 7 +#define USB_ENDPOINT_DESCRIPTOR_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_ENDPOINT +#define USB_ENDPOINT_DESCRIPTOR_ENDPOINT_OUT 0 +#define USB_ENDPOINT_DESCRIPTOR_ENDPOINT_IN (1 << 7) +#define USB_ENDPOINT_DESCRIPTOR_ATTR_CONTROL 0x00 +#define USB_ENDPOINT_DESCRIPTOR_ATTR_ISOCHRONOUS 0x01 +#define USB_ENDPOINT_DESCRIPTOR_ATTR_BULK 0x02 +#define USB_ENDPOINT_DESCRIPTOR_ATTR_INTERRUPT 0x03 + +// String descriptors. If these are used at all then string 0 +// must be a table of supported LANGID codes. For a simple device +// which only supports US English, the following sequence of +// four bytes should suffice for string 0. In practice string +// constants tend to be used which makes the use of these +// #define's difficult. +#define USB_STRING_DESCRIPTOR_STRING0_LENGTH 4 +#define USB_STRING_DESCRIPTOR_STRING0_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_STRING +#define USB_STRING_DESCRIPTOR_STRING0_LANGID_LO 0x09 +#define USB_STRING_DESCRIPTOR_STRING0_LANGID_HI 0x04 + +// For subsequent strings the length and data will have to be +// determined by the application developer or by a suitable tool. +#define USB_STRING_DESCRIPTOR_TYPE USB_DEVREQ_DESCRIPTOR_TYPE_STRING + +// Utility macros to calculate the total_length fields in a +// configuration descriptor. +#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_LO(interfaces, endpoints) \ + (USB_CONFIGURATION_DESCRIPTOR_LENGTH + \ + (interfaces * USB_INTERFACE_DESCRIPTOR_LENGTH) + \ + (endpoints * USB_ENDPOINT_DESCRIPTOR_LENGTH)) % 256 + +#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_HI(interfaces, endpoints) \ + (USB_CONFIGURATION_DESCRIPTOR_LENGTH + \ + (interfaces * USB_INTERFACE_DESCRIPTOR_LENGTH) + \ + (endpoints * USB_ENDPOINT_DESCRIPTOR_LENGTH)) / 256 + +#ifdef __cplusplus +} // extern "C" { +#endif + +#endif // CYGONCE_USB_H +
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/ChangeLog @@ -0,0 +1,80 @@ +2001-02-02 Bart Veer <bartv@redhat.com> + + * cdl/usbs_eth.cdl: + Add doc property to point at the HTML + + * doc/usbseth.sgml, doc/*.html: + Incorporate changes from docs department, regenerate HTML + +2001-01-26 Bart Veer <bartv@redhat.com> + + * src/usbsethdrv.c (usbs_ethdrv_ioctl): + Change chipset specification to null, since there is no real + hardware involved, plus SNMP cleanup. + +2001-01-22 Bart Veer <bartv@redhat.com> + + * doc/usbseth.sgml, doc/makefile, doc/simple.fig, doc/tcpip.fig: + Added documentation. + +2000-12-15 Bart Veer <bartv@redhat.com> + + * src/usbsethdrv.c: + Enable poll functions. + +2000-11-29 Bart Veer <bartv@redhat.com> + + * host/ecos_usbeth.c: + Remove debugging and fix the MTU + +2000-11-28 Bart Veer <bartv@redhat.com> + + * cdl/usbs_eth.cdl + * include/usbs_eth.h + * src/usbseth.c + * src/usbsethdrv + Clean-up, adding missing functionality such as SNMP support, + update to current USB API. + +2000-11-24 Bart Veer <bartv@redhat.com> + + * host/ecos_usbeth.c: + Ignore runt packets, cope with the confusion between + CRC errors and timeouts. + + * include/usbs_eth.h, src/usbseth.c + Clean up alignments. + +2000-11-22 Bart Veer <bartv@redhat.com> + + * include/usbs_eth.h: Fix nested #include protection + +2000-11-21 Bart Veer <bartv@redhat.com> + + * First check-in of eCos USB support. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//===========================================================================
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/cdl/usbs_eth.cdl @@ -0,0 +1,110 @@ +# ==================================================================== +# +# usbs_eth.cdl +# +# USB slave-side ethernet package. +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): bartv +# Original data: bartv +# Contributors: +# Date: 2000-10-04 +# +#####DESCRIPTIONEND#### +# ==================================================================== + +cdl_package CYGPKG_IO_USB_SLAVE_ETH { + display "USB slave ethernet support" + include_dir "cyg/io/usb" + parent CYGPKG_IO_USB_SLAVE + requires { CYGHWR_IO_USB_SLAVE_OUT_ENDPOINTS >= 1 } + requires { CYGHWR_IO_USB_SLAVE_IN_ENDPOINTS >= 1 } + compile usbseth.c + implements CYGINT_IO_USB_SLAVE_CLIENTS + doc io-usb-slave-eth.html + + description " + The USB slave ethernet package supports the development + of USB peripherals which provide an ethernet service to + the host machine. Such a peripheral could be a simple + USB-ethernet converter, or it could be rather more + complicated internally." + + cdl_component CYGPKG_USBS_ETHDRV { + display "Provide a driver for a TCP/IP stack." + requires CYGPKG_IO_ETH_DRIVERS + implements CYGHWR_NET_DRIVERS + default_value CYGPKG_NET + compile -library=libextras.a usbsethdrv.c + + description " + The primary purpose of USB slave ethernet support is to provide + an ethernet service to the USB host. This is very different + from a conventional network driver which provides a service + to a TCP/IP stack running inside the peripheral. If this + component is enabled then the USB-ethernet code will implement + an eCos network driver, thus supporting both a host-side TCP/IP + stack and an eCos stack. This raises issues such as enabling + the bridge code in the stack, and the package documentation + should be consulted for further information." + + cdl_option CYGFUN_USBS_ETHDRV_STATISTICS { + display "Maintain traffic statistics" + flavor bool + default_value CYGPKG_SNMPAGENT + description " + The USB network device driver can maintain some statistics + about traffic, for example the number of incoming and + outgoing packets. These statistics are intended mainly + for SNMP agent software." + } + + cdl_option CYGDAT_USBS_ETHDRV_NAME { + display "Name to use for this network device" + flavor data + default_value { "\"eth0\"" } + description " + The name of this network device for control purposes. + " + } + + cdl_option CYGPRI_USBS_ETHDRV_ETH0 { + display "Enable/disable generic eth0 configury" + flavor bool + calculated { "\"eth0\"" == CYGDAT_USBS_ETHDRV_NAME } + implements CYGHWR_NET_DRIVER_ETH0 + } + cdl_option CYGPRI_USBS_ETHDRV_ETH1 { + display "Enable/disable generic eth1 configury" + flavor bool + calculated { "\"eth1\"" == CYGDAT_USBS_ETHDRV_NAME } + implements CYGHWR_NET_DRIVER_ETH1 + } + } +}
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/io-usb-slave-eth.html @@ -0,0 +1,166 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +eCos Support for Developing USB-ethernet Peripherals</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="NEXT" +TITLE="Introduction" +HREF="usbseth-intro.html"></HEAD> +<BODY +CLASS="REFERENCE" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> + </TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-intro.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<DIV +CLASS="REFERENCE"> +<A +NAME="IO-USB-SLAVE-ETH"> +</A> +<DIV +CLASS="TITLEPAGE"> +<H1 +CLASS="TITLE"> +I. eCos Support for Developing USB-ethernet Peripherals</H1> +<DIV +CLASS="TOC"> +<DL> +<DT> +<B> +Table of Contents</B> +</DT> +<DT> +<A +HREF="usbseth-intro.html"> +Introduction</A> + — eCos support for developing USB ethernet peripherals</DT> +<DT> +<A +HREF="usbseth-init.html"> +Initializing the USB-ethernet Package</A> + — Initializing the USB-ethernet Package</DT> +<DT> +<A +HREF="usbseth-data.html"> +USB-ethernet Data Transfers</A> + — Exchanging ethernet packets with the USB host</DT> +<DT> +<A +HREF="usbseth-control.html"> +USB-ethernet State Handling</A> + — Maintaining the USB-ethernet connection with the host</DT> +<DT> +<A +HREF="usbseth-netdev.html"> +Network Device for the eCos TCP/IP Stack</A> + — USB-ethernet support for the eCos TCP/IP Stack</DT> +<DT> +<A +HREF="usbseth-host.html"> +Example Host-side Device Driver</A> + — Provide host-side support for the eCos USB-ethernet package</DT> +<DT> +<A +HREF="usbseth-protocol.html"> +Communication Protocol</A> + — Protocol used between the host-side device driver and the eCos +USB-ethernet package </DT> +</DL> +</DIV> +</DIV> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> + </TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-intro.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> + </TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Introduction</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/simple.fig @@ -0,0 +1,23 @@ +#FIG 3.2 +Portrait +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 600 600 2400 600 2400 2400 600 2400 600 600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 2400 1500 4200 1500 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 4200 600 6000 600 6000 2400 4200 2400 4200 600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 6000 1500 6600 1500 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 6600 300 6600 2700 +4 0 0 50 0 0 12 0.0000 4 135 675 3000 1425 USB bus\001 +4 0 0 50 0 0 12 0.0000 4 135 735 1200 1425 USB host\001 +4 0 0 50 0 0 12 0.0000 4 180 1155 4500 1425 USB peripheral\001 +4 0 0 50 0 0 12 0.0000 4 135 945 6150 2925 real network\001
new file mode 100644 index 0000000000000000000000000000000000000000..d844d2ca2fe40509931cc74e0a7506e19cd0fcec GIT binary patch literal 70372 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 K*7dC-f$4w3b8nLX
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/tcpip.fig @@ -0,0 +1,33 @@ +#FIG 3.2 +Portrait +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 600 600 2400 600 2400 2400 600 2400 600 600 +2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5 + 4200 600 6000 600 6000 2400 4200 2400 4200 600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 6600 300 6600 2700 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 2400 2100 4200 2100 +2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 1 4 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 1500 1125 1500 1500 4950 1500 4950 1200 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 6000 2100 6600 2100 +2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 1 3 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 5175 1200 5175 1500 6600 1500 +4 0 0 50 0 0 12 0.0000 4 135 945 6150 2925 real network\001 +4 0 0 50 0 0 12 0.0000 4 135 735 1125 2100 USB host\001 +4 0 0 50 0 0 12 0.0000 4 180 1155 4500 2100 USB peripheral\001 +4 0 0 50 0 0 12 0.0000 4 135 675 2925 1950 USB bus\001 +4 0 0 50 0 0 12 0.0000 4 135 540 1200 1050 TCP/IP\001 +4 0 0 50 0 0 12 0.0000 4 135 540 4800 1050 TCP/IP\001
new file mode 100644 index 0000000000000000000000000000000000000000..f38f1ea53531d7e3d2ca6fffdba3d3855f016242 GIT binary patch literal 70372 zc%1E>eOwg9AIFCWh17(rOsz=7)FShV%<3vEF|x>ffb7WxkyA5~1i7BMQtNz3Gc&;= z%*+QWv#b=Zg35eE%&f>f0v{3|4@^Z-*!%6?9mhTF?as{3?hg3lukUN`Zg+;=?`Plh z{my(RcIf@L-;p%a??Z6T3fMnCKR<te|A2siz`(#(ty;Bi-8v{JC^$Iyvdb=O)22<^ zwr$(BYj^qOm$z@<J|rY0G&EGB(OhxG6<1z)<yBW*)uBU&tFOMgW5<r2I(6#Yx$`yG zTyyQU*Iswsbzxy)*I$2qmo8nx!^69F?HUmg(XCsz8*aFvd-v`=di3bov*(RB-gwhZ zH$_H9-hA`Ty?XV!<(6A|_wL=NPoKVh`}XVCuYdpkQBhI1-g@hR0RwKk?Y4mf2i|`B z?RVU9$DMcHsnu%ly6djH@4ow<d+v#jjvh2<(7pHGd*6Nc4IVr=CMIUckRkWqe}8Oj z>;n%xFm&k92OoU!p@$xdi;H{s;fIF}8}`T}j|?9^e8h+mBS(%LHEL9Re0)Me!lREq zI(qcz#~yp^@y8#3;)y4oeDcYso_cD`m@!X3{q)$eV-ph-lai9gjT@JooIHN~_>`0s zolZAl!i0$vCr+9)>6vGqnLK&&v(G*|Wy+M))YPd{r>3Q)J@?#m)22;JPfyRt$e2ET zdS+&(Uax=t`R8AF;e{7peDS51UV8cEmtT41l~-SVH7hI2U@*M)+H0@B{`!m=GiJ`5 zIcwIeH{N*T%{SjP8jZ7O&z>`9&fK|k=gph<)?07QpFe-Wf(38C{r19z3*UL?okfcl zz5DLFix)3`@4feyELoDBot=}Dvvldw_uqg2gAYE)&CUJr!w>WF@|G=I_R&WlEnmL; z<BvaHv0}w1pM0`%<;qp7R;^yWdd-?O`T6;ue){QWpMCcE=bx`#yY`DOzF4<z-Irf} z`PElntzW<X>#x85=9_Q6{r1}p8#Zj*xUrz1ps=veWHNpC-FM%A|NRd?{7_U>R9syA z<Bvc7^wUp2|NQf&O`CrC<(JKyH*eXpW$V_h+qP}nzJ2?S9Xm=&N_OttSz21UYuBz{ zfBkj$?%lur_S>F4dw&1@_dovl<Ig|;EGsMf>#x7|?%n(M-+%Ahx6f=gmzS6S^UpsO z6&010mHYSaKXBl{!Gi}69Xj;yzyBUSe7LHr>d28JM~@yocI?>k<Ht{&IC1jiNsGl& zU0q#MQ*-LnssH}_@AT=@XU?2Cd-iN?ZSA>p=gyx$UsqRm;lhQB7cbV=*EcjYFbre0 zTD#T-ay|gMGPi~gosu*mC453kYRa^vjFj==<6a1l9hMLtJ8^1yMtbtJNog73H;zxq zoRpk$cUtO{X-WE<+JIi%k2zlg!3?lATs&7@QIut6E<r=|OVI|ET6Xe+0@q?BpQuZ* z>h}=eU}QM8*8NCGB^_PmGZ+fm5mZBq^Ow?cTilF*^KzY;p`?e>48QMA<NchWq4n|` zz{hQ7)NYwx)vGg3>yqRj_-}jjPp;~%muyJK9;eY<_{ZcTlX75>FM~q<p#giGhA977 z>eX|83Jl`>qZIZiB$IyiXurBdu*Ye5@Q*n5=&RIkv}^|BeW-=-50p$|oLaT`j|>Ju z>~R{B`A4hRe?dv?aT@gS4_WLXC6mg<f2g<#$Ob9?alQu2>*(khAp??snmzX5%A}ot zRFC$kYw%!?(~z5gC<rS{`F#uEA1v&Fl}Y;JKdNAl(@>g!yu!*J*rTs1&DH8H=7My^ z4c<n}&Ode$QmfC<(JNmv*~mYb*g_)Oqguclrq9CsgO5G1ykQbazbQAo<7pU&J-!lP zii(g@hWn^Y2z#7O^u<4_aSO44H~P<b`m7NDK+Btm7`dEBj%bg!;le+vy1Lg#%3zOZ zpBwo{EM7udGT@^<>IJ;HKFh^F7_N?`Msmxf@A!|9WXSx^qlk!j`G*nrOfhazQ8FYO zZqXiB{!!P}Nr(~5d4#aX+klV%G!r5sdihdV{t*Kh#U#TEd*lsx3&wv`AR-6$K+Bul zGKnAm!6G6eNiHR2(u04b#!E0YgQ#Q>Jt0c|tDI3Sw*@P2#AVWzf21Y3nmrNmC%J^< zKhUl&qDB;u6&m(94Jr9AnurLmiJ~$oU;KwG5urqTND>iZ{!6Z~vT{i-M42R+|MIOt za!+ZNPbSI4e=s#eAw!Bx!tjs48%~C}vciT)!&v^2ZEg?!MAVq%5;&0>`7b2NkZAB= z57Nky?ED|a!^*_}uO2N^a{dnn5fMsq;mf24|G-K{bcC&dLt<HULKHCeO<#4bAsEE0 zzHn|qum+fz=>egBhTsIz^SELUUFo+*!;ODpY@IG%o0YEvp-G2_4Fnos9DcUCizWhO zHXLsq?hiEi2v=tmjVp7;hT|2{z-mqzIb`Nuo3jMeROjUfTMNtUf+{&RVH!qt*pKi} z462bp2V`B{r!lpR>sY~#6?1~u+nj~%YIK5znQl5AQp|n_)L&c``I9^{DZoDrqGs6I zs>`sspPp;<hRK_Yv?Yw+dDe{$S=P**=jD(Lxn$CTJt7mJxsEYAkJNHUEL>Nomd(r3 zXE(6VE%zidCzqZg<?5~m!LV}U?Xh<UM1lN`7h?}qFkI^!0uoyf>Yx|;y%+ybGC4=s zXuLhPBhf$y;-5RWV5?1EE(R61Gej~Ll*<eB*@J(i#!Fn!%o;t%l{s{dQ%7qy>otv% zf%s2!Z<u1Yj^iH`SLZtR$fmU}io^6{pLW{=?1!Q+uCDI&5pt3XRVL$Sr*WOvIc`*L zs)rvo>5EwWM~*=hWV8o?h-@8ObH#oOd!)p1qqOB7euyKJBJm%rurhD7$GpZLa6Xow zZv?|<?d=U%qT+P2Xbb@6y{$OvLh6P>GRYVJ5u<}9t6&t{G463q(D*HDv!3nhi3>KJ zGy$-2eOq7{gVrF))0Ht~QrPh3AF=T~MU!*nFg&9@cK&G*)0JVqjJ%QyBK|`^5s4+a zBm|qJ#(xwID<g>z5raSeqf%Iz<dkMYGKsPN3!8|fC%KfDNrL$=MyjhzG-Q!UxcpbC zxAWtvkrc_;aYjN{ab?oUKN8Xy^b?V|O!`c6K`ej|m-33DgNX1Kuw&)FlnyKN7z;WF z>YPW==k`F$B>DC4Dpo8bpMFEne+}N$YByQQP-Z0;o=g&1|1OLh2uUs}!6qG(BVhpR zt6|dlM|5rv1`!py9m&%QM$mm51Z2|AKSKT}c8$Co_SWJ5gK3(>$YU^W0iftkZeJ=} zwM$-Cmv2=^zrklhH0wpb>=S#OEkiAUDBVCNqV%BRa@Qm45@ChL1AB1NZ@l~?VGw1^ zP8s*c5$vBM5fSE;W+V|3;-C1G5ocYGbbm-rSN9Sl2`BP0zSze;6ou%mck++&gQ!OA zL60lvrn)|6=|MsBO<3)K=(C-F<OnM_VULtol-hF`QTS)VVfJ0#c!b5C_%$OxIY!Xc zk=002tSJR*0~eq1pXM`N*<#5s9ketZ3DaBf8t?L}rk57~1fb?RT^Z6qn9|(DKd7#r z7nz`sU(@uIPS~8QjgsK%(#5FpJS58%LdJh+3M-3X&yGWu`KGw0BcUh%o`nTuwmw6} ze-y2PfvXv^7y|JhbXWIy{!N*DUxtYGP_e2b$7bNhe|$=Y>?^r2h{)u2WNI10R2nz_ zff)S2CAlP}qNKc{h|8oW|H$d;=~WiIpDVVigXdk<#6Ob$_sxQca8_~&#eb-%f&u^7 z@?nqU^c(j2FU5(d344@GzsXep8J&noT^>Uw-Cfj8CXw=AQo_m%&WVT{$TCT){xgH) z>K@O3Cgz^8a>^uR{73QvcKYWq@_Q)9KVwXo&M)HXeHKOPq0~qcSs_lbb~o$|6M99- zwgD;z5yiP3*)X{b@9LiF=7~K8qo!{u2}`g*rQh)LU!}R+3WwvFRi(MyJv60P4O_{6 zlv0@9a}WES{^bSf+_P=6m<#rttSCy=Tg-d8bcj}O8DDt1dhANAzCZVr?XlN3-*6oB zgpBQstaQPhQ485b#|eSXOBAOcudS|F%YG+=%Zsqr%5?lYxFPM5qoujrecqA5UX=av z$wKy`8?vm0<pnd6xf{-2Ytd2mJUJHgHf}~-9D7mjKG{!Lc1v5(X(Ebb5KVHS%cNra ze~DErlg|*5w_UmUTAgL}H1Yb+G7O?%=l0M_L=yQ&INBq^8#`8Px98O<UezJYKXTUX zp`VEKobwA#fTnzMjzohWdp!Cq-v;ogt`03mkmn&&x5tBj=$NhyV~|U73HBMK{<D&j z;f_7(rQblcDv5SJSI1T(8D&x={)0<I1g138K}2}<pHZtc6E_r-NiY84JYA(7*eO`m z;o|&`Lx=?sTL2NEB_ufhQGdEJLCGLou23}oLm3faB)KHXq_p~n#EA$x+M^T^@x*^* ztb(D`6G%)Zk=K6-YLL7uxzvzJr1+2c+@2OkM6Uef3wx-Tt}MxblS$ssBo~0DpNPbg zT!JT(H~ym>5qV+{saQHj{!5KwL1cGeN03R<^`G&Gh(wZ09+^}m|Anp@#0^ZDBvAjk zypB+ki^e&OF#IEFN;CaLBv$_!zDhH31D%N6%BohSV$Sez(;(q*%di0|RbgeU*N;of zeDhC1z^^AOqIJOB@V@59b_=s&KnVzs;O2!eYy4}-yE>ME5beQBzwz)7MUugbJ-{Xm z#jIiGib~mPZ#!z^0^G~{?6ds)UkIohT9Qi@nY8l{jH}y={|3}lcUc(8$)v3ce3av( zNKJf-|GKuokY&`x3_1g&d~hNpp8+LrF!i6It27fgpd=%p#^G7%qr3aBXFbAP(9JHB z4FQ$y7aF;b0&4pBN9c3VWm15D<XXu^#i|Z*!x8P_p8y2q>bBb3tk<#5w&R8awmQ@W z_M6Fl6jaGMB&gpvU`DWbAr)8+B4<GM8KVF+-I9@K9K+rxhJCu)FL&IiifBD(lu(PY zKA>h-n1TIwq|AY!lt%ucaq#0?jCip}mS7W9{0GX_w>;Y#0G+vEUw40Ch+~l?Tl3mh zdz*XS7pT!$b;dz4hsMs-Mu<LuF4&`X`b~QMXLQLRHl<ksBJvggp?_N*;xf6*txA>I zwweed{=>-S>Zl^bZ@_JwQn2qV-$!06zg_sp;px(oTo97MzEBET#cF3TWkp3~cl~cc zu%R=E8E?B|30{M!R5ZzubPqg}T(AXz_*`9Jgzxp`7{}9|&$qQqa_dUz@&+f9A}6wM z3B!(dL)cr#@^%2=7JxbF!0pRb!#0tY4C01|2030f0wa81C-UA}hBJV`24IR#S9T7f zx{ds$yvV-i*)yB%A0@Uf4%5c~V`426vU^^z(Fg!!_=$i_Vy^$<b#>n({633<qcr^+ z(qjX`!ng>FdBlK&V|!?H5#uj#yHRPaW{uyVLt~j98oecccH&{dJ#!RIzX2Qna2+!z z%q~8`HcW3ZZneiJz{cd(26pUZ)YZ>5Y#p-_I{M^8GL%@!#VbOBBm7~DjahmCz`C}M zjkkh|b0amj&R1510pJJzI?K6gzD<>ip<Ug}fL0@vU=znAIWeAtC@TPIHp8R~O{x`Y zv{add=O2-153j3>j_@^lYttrFw)<l@VmH}XjnmX&J%HfWV)DwQlYbhq$F}2}#ZqsY zaip=)+-TS8kP{FU+K@i*AbYW#i24B7D81T)DEE)-BYgJ(KGXDYmKf`!(yQ`Jwzql^ zsN_7eU$_5kuR|uM;PkHYwXD%~=_&gWG*^dLBee5m?*yQDo+--|1HjuyD|&;dh|mIC z=kr0vs8*GuJ7^-Z8|J3PZpzJyD1n^V2ZL5J<iC8ny1)oOXwb}Hoi%$lNQ>=Yh-5!X ztPL>)Yf9q%j;w5B(CQ+9xo%aPL5t&n#mMa}<{oi#8)K7AzbUx>%V{JPq*s;ZYV{T~ zoWUS{TgYht9%5So@a7+AS#dLdo(9*{uwI@&$F0&#+~AW*`SV{4tgE{ke1M3T{F5k? zP4OShK@^GqBE54MJ@}`ipTVP)GIOqvKfu~Qphc|eU`Q1JBH-$RMsls!M_W!{T-{yW zgjRBi6@aFFy0RS3@7-sa_y@z)A;pNdO0#^18~@N1RwlfX3s2tQ>pznoM8QvKR+ETi z;~%kTPcvE7AvFJ4%C<Zb4O)oESNsPe$whz09^Yt6a(VC%U4tJSF@iY{!UA@b4KSJw z5fQw6Pz_bnm0=98H;SC;H<9>{3Pj|<9x95^OWXeoi-?G<<Wf#1z4%9Byac^UGjW5c zOrov-vM{t{+I=^Xs7!kBkF+Vx&7O#O=Jtrjf11g3WtfKH)a{YB0V-WYgw;e5nUpjB zLzak82GZn+2s!^HS6Eq@Xb()w+zhh&pZeAyvJ2QH$Qz<e5{myo&FyK9L<Gk_BwSrA zu1p|(jA;lo%+5cut>h|Kt<NYjDKw>7rTmwYhNN<Z(l>y|G}KFSAsLG0zi<sDl3W5Z zsmA;tS3^1M!82su|GhaRxdaVq{G;gR6sj14^`GfzqG|?*Jp>8>$zv#)<PtDiF8`3J z(#%@`nvxz08_HaaR{l{m$t7T@#6PrSkJFH+{<GZC9_0)y{-FSSRILB}f9!ENM798Q zb1=~A_OulKk(A^TFjR~G;2H{Fm9qNJN=JJ{4Q2U<(j=FFK{Wo;a<Io~pzsgfNiKN| z7yhB6K{6TQGRdFhqBj0R+Q2MVC^!Eo6;_sOPp;;|KcvqHE0c7@f2hMAr=bY{xMGi2 zi7&bh68zHwvBzmZ@DByi9`y`?LQR*3Au_k8rSp%}D$UJ2{v-QVq?GfI>g`aKf9S;? zry(c*G@B%sfFXf@WWpZ)%CX*tGN9?3e=ce4X;MCC0I0;fa%>^b??<)rT}!qZ8L(5D zsplWB!m+z@jl7QFc6W(wPSHI1N4Xu?o&3{hkx{F+)rqYriqw?Y$|e?NnPRg2(yH>b z5x`jA%^!f}oy+s%>-1F}G$10ID~eef2CO>sUPw(vb$<2lh8p~XxC47lHCHDVoVc*+ zn0?C;yVsS2dQ$)ZhB54s^qvRuBBQLKnxxv0-Sg~KF%vt&Z%ZO@b@Kev60pZ<_~sw> z9yrRxmTwEJbX449osMBG<3{dF+@YKi(_>=>CIGXeJ}Z01)dwsTbc~SU#Xq!T59eYf z=DMoXj>|hcs>>ER%FO2FXt`|}xcj7w>EAW~Kx*sdSr(nW0xd8ZVP@!g9a3ZiRBDVI z)Sp4~&!|?*wny9Q#4fq4I83AGO2}4M^akbeera3c0u5R#GrRBU>amNnEG6~Hj}GDL U&Bpt!{;DmA(C7+V1p@8=07^`5=Kufz
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-control.html @@ -0,0 +1,304 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +USB-ethernet State Handling</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="USB-ethernet Data Transfers" +HREF="usbseth-data.html"><LINK +REL="NEXT" +TITLE="Network Device for the eCos TCP/IP Stack" +HREF="usbseth-netdev.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-data.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-netdev.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-CONTROL"> +USB-ethernet State Handling</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN163"> +</A> +<H2> +Name</H2> +USB-ethernet State Handling -- Maintaining the USB-ethernet connection with the host</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN166"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs_eth.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +usbs_control_return usbs_eth_class_control_handler</CODE> +(usbs_control_endpoint* ep0, void* callback_data);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_state_change_handler</CODE> +(usbs_control_endpoint* ep0, void* callback_data, usbs_state_change change, int old_state);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_disable</CODE> +(usbs_eth* usbseth>);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_enable</CODE> +(usbs_eth* usbseth>);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN197"> +</A> +<H2> +Description</H2> +<P> +When the USB-ethernet package is initialized by a call to <A +HREF="usbseth-init.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +</A> + it +installs <TT +CLASS="FUNCTION"> +usbs_eth_state_change_handler</TT> + to handle +USB state changes. This allows the package to detect when the +connection between the host and the peripheral is established or +broken, resulting in internal calls to +<TT +CLASS="FUNCTION"> +usbs_eth_enable</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_disable</TT> + respectively. This is +appropriate if no other code needs to access the USB device. However, +if there is other code, either other USB-related packages or the +application itself, that needs to perform I/O over the USB bus, then +typically the USB-ethernet package should not have exclusive access to +state change events. Instead, the assumption is that higher-level +code, typically provided by the application, will install an +alternative state change handler in the control endpoint data +structure after the call to <TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +. This +alternative handler will either chain into +<TT +CLASS="FUNCTION"> +usbs_eth_state_change_handler</TT> + when appropriate, +or else it will invoke <TT +CLASS="FUNCTION"> +usbs_eth_enable</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_disable</TT> + directly. For further details of +state change handlers and control endpoints generally, see the +documentation for the common USB-slave package.</P> +<P> +Similarly, <TT +CLASS="FUNCTION"> +usbs_eth_init</TT> + will install +<TT +CLASS="FUNCTION"> +usbs_eth_class_control_handler</TT> + in the control +endpoint data structure as the appropriate handler for class-specific +USB control messages. This code will handle the ethernet-specific +<A +HREF="usbseth-protocol.html"> +control messages </A> +, for example +requests by the host to enable or disable promiscuous mode or to +obtain the MAC address. If the USB device is not shared with any other +code then this is both necessary and sufficient. However, if other code +is involved and if that code also needs to process certain control +messages, higher-level code should install its own handler and chain +to the USB-ethernet one when appropriate. It should be noted that the +request code is encoded in just a single byte, so there is a real +possibility that exactly the same number will be used by different +protocols for different requests. Any such problems will have to be +identified and resolved by application developers, and may involve +modifying the source code for the USB-ethernet package.</P> +<P> +As an alternative to chaining the state change handler, higher-level +code can instead call <TT +CLASS="FUNCTION"> +usbs_eth_disable</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_enable</TT> + directly. These functions may +also be called if the USB-ethernet package should become inactive for +reasons not related directly to events on the USB bus. The main effect +of <TT +CLASS="FUNCTION"> +usbs_eth_enable</TT> + is to restart receive +operations and to allow transmits. The main effect of +<TT +CLASS="FUNCTION"> +usbs_eth_disable</TT> + is to block further transmits: +any current receive operations need to be aborted at the USB level, +for example by halting the appropriate endpoint.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-data.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-netdev.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +USB-ethernet Data Transfers</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Network Device for the eCos TCP/IP Stack</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-data.html @@ -0,0 +1,369 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +USB-ethernet Data Transfers</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="Initializing the USB-ethernet Package" +HREF="usbseth-init.html"><LINK +REL="NEXT" +TITLE="USB-ethernet State Handling" +HREF="usbseth-control.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-init.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-control.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-DATA"> +USB-ethernet Data Transfers</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN94"> +</A> +<H2> +Name</H2> +USB-ethernet Data Transfers -- Exchanging ethernet packets with the USB host</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN97"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs_eth.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_start_rx</CODE> +(usbs_eth* usbseth, unsigned char* buffer, void (*)(usbs_eth*, void*, int) complete_fn, void* complete_data);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_start_tx</CODE> +(usbs_eth* usbseth, unsigned char* buffer, void (*)(usbs_eth*, void*, int) complete_fn, void* complete_data);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN122"> +</A> +<H2> +Description</H2> +<P> +The USB-ethernet package provides two main modes of operation. In the +first mode it provides a <A +HREF="usbseth-netdev.html"> +network device +driver</A> + for use by a TCP/IP stack running inside the USB +peripheral. All incoming ethernet packages should be passed up the +TCP/IP stack, and only the stack will generate outgoing packets. Apart +from <A +HREF="usbseth-init.html"> +initialization</A> + and possibly +certain <A +HREF="usbseth-control.html"> +control operations</A> +, +higher-level code will not interact with the USB-ethernet package +directly.</P> +<P> +In the second mode there is no TCP/IP stack running inside the USB +peripheral. For example, a simple USB-ethernet converter has an +ethernet chip and a USB port: ethernet packets received by the +ethernet chip need to be forwarded to the USB host, and ethernet +packets sent by the USB host need to be sent out of the ethernet chip. +<TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + allow for this lower-level +access to the USB-ethernet package.</P> +<P> +The two modes of operation are mutually exclusive. If the network +device driver mode is enabled then application code should communicate +at the TCP/IP level, and not by using the lower-level functions. +Instead, it is the network device driver that will make use of these +functions, and it assumes that it has exclusive access. The package +does not perform any locking.</P> +<P> +The transmit and receive functions work in much the same way. The +first argument identifies the <SPAN +CLASS="STRUCTNAME"> +usbs_eth</SPAN> + +structure that should be used. For the majority of applications this +will be <TT +CLASS="LITERAL"> +usbs_eth0</TT> +. The second argument specifies +the location of the ethernet packet; outgoing for +<TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + and incoming for +<TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> +. This buffer should correspond +to the <A +HREF="usbseth-protocol.html"> +protocol</A> +:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +Outgoing packets can consist of up to 1516 bytes, consisting of a +two-byte header specific to USB-ethernet followed by a standard +ethernet frame (a header with 6-byte destination address, 6-byte +source address and a further two bytes, followed by a payload of +up to 1500 bytes). The two-byte USB-ethernet header consists simply of +the size of the ethernet frame, i.e. the size of the rest of the +packet not including the USB-ethernet header, with the least +significant byte first.</P> +</LI> +<LI> +<P> +For incoming packets the supplied buffer should usually be at least +1516 bytes. There may be special circumstances in which a smaller +buffer might be safe; for example, if the host-side device driver is +modified to support only smaller packets. Once the packet has been +received the buffer will contain a two-byte header specific to +USB-ethernet, followed by a normal ethernet frame. The header +gives the size of the ethernet frame, excluding the header, with the +least significant byte first.</P> +</LI> +</OL> +<P> +Both <TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> + are asynchronous: the transfer +is started and, some time later, a completion function will be invoked. +The third and fourth arguments to both +<TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> + supply the completion function +and an argument to that function respectively. The completion function +will be invoked with three arguments: a pointer to the +<SPAN +CLASS="STRUCTNAME"> +usbs_eth</SPAN> + data structure, usually +<TT +CLASS="LITERAL"> +usbs_eth0</TT> +; the supplied completion data ; and a +return code field. A negative value indicates that an error occurred, +for example <TT +CLASS="LITERAL"> +-EPIPE</TT> + if the connection between USB +host and peripheral has been broken, or <TT +CLASS="LITERAL"> +-EAGAIN</TT> + if +an endpoint has been halted. A positive value indicates the total size +of the transfer, which should correspond to the size in the +USB-ethernet header plus an additional two bytes for the header +itself.</P> +<P> +If the data transfer is succesful then the completion function will +typically be invoked in DSR context rather than in thread context, +although this depends on the implementation of the underlying USB +device driver. Therefore the completion function is restricted in what +it can do; in particular, it must not make any calls that will or may +block such as locking a mutex or allocating memory. The kernel +documentation should be consulted for more details of DSR's and +interrupt handling generally. Note that if the transfer finishes +quickly then the completion function may be invoked before +<TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> + or +<TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + returns. This is especially +likely to happen if the current thread is descheduled after starting +the data transfer but before returning from these functions.</P> +<P> +For transmit operations, it is possible for +<TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + to invoke the completion +function immediately. If there is no current connection between host +and target then the transmit will fail immediately with +<TT +CLASS="LITERAL"> +-EPIPE</TT> +. In addition the USB-ethernet package will +check the destination MAC address and make sure that the ethernet +frame really is intended for the host: either it must be for the +address specified in the initialization call <A +HREF="usbseth-init.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +</A> +, or +it must be a broadcast packet, or the host must have enabled +promiscuous mode. </P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-init.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-control.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Initializing the USB-ethernet Package</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +USB-ethernet State Handling</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-host.html @@ -0,0 +1,326 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Example Host-side Device Driver</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="Network Device for the eCos TCP/IP Stack" +HREF="usbseth-netdev.html"><LINK +REL="NEXT" +TITLE="Communication Protocol" +HREF="usbseth-protocol.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-netdev.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-protocol.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-HOST"> +Example Host-side Device Driver</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN240"> +</A> +<H2> +Name</H2> +Example Host-side Device Driver -- Provide host-side support for the eCos USB-ethernet package</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN243"> +</A> +<H2> +Description</H2> +<P> +The USB-ethernet package is supplied with a single host-side device +driver. This driver has been developed against the Linux kernel +2.2.16-22, as shipped with Red Hat 7. The driver is provided as is and +should not be considered production quality: for example it only +checks for a bogus vendor id <TT +CLASS="LITERAL"> +0x4242</TT> + rather than an +official vendor id supplied by the <A +HREF="http://www.usb.org/" +TARGET="_top"> +USB Implementers Forum</A> +. Also, if the +peripheral involves multiple configurations or multiple interfaces, it +will fail to detect this. However, the driver can be used for simple +testing and as the basis of a full device driver. Details of the +protocol used between host and peripheral can be found in the <A +HREF="usbseth-protocol.html"> +Communication Protocol</A> + section.</P> +<P> +The host-side device driver can be found in the <TT +CLASS="FILENAME"> +host</TT> + subdirectory of the USB-ethernet +package, specifically the file <TT +CLASS="FILENAME"> +ecos_usbeth.c</TT> +, and +comes with a <TT +CLASS="FILENAME"> +Makefile</TT> +. Both files may need +to be modified for specific applications. For example, the vendor id +table <TT +CLASS="LITERAL"> +ecos_usbeth_implementations</TT> + may need to be +updated for the specific USB peripheral being built. The +<TT +CLASS="FILENAME"> +Makefile</TT> + assumes that the Linux kernel sources +reside in <TT +CLASS="FILENAME"> +/usr/src/linux</TT> +, and +that the kernel has already been configured and built. Assuming this +is the case, the device driver can be built simply by invoking +<B +CLASS="COMMAND"> +make</B> + with no additional arguments. This will result +in a dynamically loadable kernel module, +<TT +CLASS="FILENAME"> +ecos_usbeth.o</TT> +, in the current directory.</P> +<DIV +CLASS="NOTE"> +<BLOCKQUOTE +CLASS="NOTE"> +<P> +<B> +Note: </B> +As normal for Linux kernel builds, the generated files such as +<TT +CLASS="FILENAME"> +ecos_usbeth.o</TT> + live in the same directory as the +source tree. This is very different from eCos where the source tree +(or component repository) is kept separate from any builds. There may +be problems if the component repository is kept read-only or if it is +put under source code control. Any such problems can be avoided by +making a copy of the <TT +CLASS="FILENAME"> +host</TT> + +subdirectory and building that copy.</P> +</BLOCKQUOTE> +</DIV> +<P> +Loading the kernel module into the current system requires root +privileges. If the generic USB support is also a loadable module and +has not been loaded already, this must happen first:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +# insmod usb-uhci +Using /lib/modules/2.2.16-22/usb/usb-uhci.o</PRE> +</TD> +</TR> +</TABLE> +<P> +Depending on the host hardware, the <TT +CLASS="LITERAL"> +uhci</TT> + or +<TT +CLASS="LITERAL"> +usb-ohci</TT> + modules may be more appropriate. Loading +the generic USB module will typically result in a number of messages +to the logfile <TT +CLASS="FILENAME"> +/var/log/messages</TT> +, giving details +of the specific host-side hardware that has been detected plus any +hubs. The next step is to load the USB-ethernet module:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +# insmod ecos_usbeth.o</PRE> +</TD> +</TR> +</TABLE> +<P> +This should result in a number of additional diagnostics in the +logfile:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +Apr 1 18:01:08 grumpy kernel: eCos USB-ethernet device driver +Apr 1 18:01:08 grumpy kernel: usb.c: registered new driver ecos_usbeth</PRE> +</TD> +</TR> +</TABLE> +<P> +If a suitable USB peripheral is now connected the host will detect +this, assign an address in the local USB network, obtain enumeration +data, and find a suitable device driver. Assuming the peripheral and +device driver agree on the supported vendor ids, the +<TT +CLASS="FILENAME"> +ecos_usbeth.o</TT> + module will be selected and this +will be reported in the system log:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +Apr 1 18:04:12 grumpy kernel: usb.c: USB new device connect, assigned device number 3 +Apr 1 18:04:12 grumpy kernel: eCos-based USB ethernet peripheral active at eth1</PRE> +</TD> +</TR> +</TABLE> +<P> +What can happen next depends very much on the software that is running +on top of the USB-ethernet package inside the peripheral. For example, +if there is a TCP/IP stack then it should be possible to bring up a +network connection between host and peripheral using +<B +CLASS="COMMAND"> +ifconfig</B> +.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-netdev.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-protocol.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Network Device for the eCos TCP/IP Stack</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Communication Protocol</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-init.html @@ -0,0 +1,321 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Initializing the USB-ethernet Package</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="Introduction" +HREF="usbseth-intro.html"><LINK +REL="NEXT" +TITLE="USB-ethernet Data Transfers" +HREF="usbseth-data.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-intro.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-data.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-INIT"> +Initializing the USB-ethernet Package</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN47"> +</A> +<H2> +Name</H2> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> + -- Initializing the USB-ethernet Package</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN51"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs_eth.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_eth_init</CODE> +(usbs_eth* usbeth, usbs_control_endpoint* ep0, usbs_rx_endpoint* ep1, usbs_tx_endpoint* ep2, unsigned char* mac_address);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN67"> +</A> +<H2> +Description</H2> +<P> +The USB-ethernet package is not tied to any specific hardware. It +requires certain functionality: there must be USB-slave hardware +supported by a device driver; there must also be two endpoints for +bulk transfers between host and peripheral, one for each direction; +there must also be a control endpoint, although of course that is +implicit with any USB hardware.</P> +<P> +However, USB-slave hardware may well provide more endpoints than the +minimum required for ethernet support. Some of those endpoints might +be used by other packages, while other endpoints might be used +directly by the application, or might not be needed for the peripheral +being built. There is also the possibility of a USB peripheral that +supports multiple configurations, with the ethernet support active in +only some of those configurations. The USB-ethernet package has no +knowledge about any of this, so it relies on higher-level code to tell +it which endpoints should be used and other information. This is the +purpose of the <TT +CLASS="FUNCTION"> +usbs_eth_init</TT> + function.</P> +<P> +The first argument identifies the specific +<SPAN +CLASS="STRUCTNAME"> +usbs_eth</SPAN> + data structure that is affected. It +is expected that the vast majority of affected applications will only +provide a single USB-ethernet device to a single host, and the package +automatically provides a suitable data structure +<TT +CLASS="LITERAL"> +usbs_eth0</TT> + to support this. If multiple +<SPAN +CLASS="STRUCTNAME"> +usbs_eth</SPAN> + structures are needed for some +reason then these need to be instantiated by other code, and each one +needs to be initialised by a call to +<TT +CLASS="FUNCTION"> +usbs_eth_init()</TT> +. </P> +<P> +The next three arguments identify the endpoints that should be used +for USB communications: a control endpoint, a receive endpoint for +ethernet packets coming from the host to the peripheral, and a +transmit endpoint for ethernet packets going in the other direction. +Obviously all three endpoints should be provided by the same USB +hardware. The USB-ethernet package assumes that it has sole access to +the receive and transmit endpoints, subject to the use of +<TT +CLASS="FUNCTION"> +usbs_eth_disable</TT> + and +<TT +CLASS="FUNCTION"> +usbs_eth_enable</TT> + control functions. The package +also assumes that no other code is interested in USB state changes or +class control messages: it installs handlers +<A +HREF="usbseth-control.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_state_change_handler</TT> +</A> + +and +<A +HREF="usbseth-control.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_class_control_handler</TT> +</A> + +in the control endpoint. If any other code does need to handle USB +state changes or class control messages then replacement handlers +should be installed after the call to +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +, and those replacements should +invoke the USB-ethernet ones when appropriate.</P> +<P> +The final argument to <TT +CLASS="FUNCTION"> +usbs_eth_init</TT> + specifies +the MAC address (or Ethernet Station Address) that should be provided +to the host-side device driver. Since the USB-ethernet package does not +interact directly with a real ethernet device it cannot obtain the MAC +address from any hardware. Instead, it must be supplied by higher-level +code. The details depend on the <A +HREF="usbseth-intro.html#AEN22"> +scenario</A> + in which the +USB-ethernet package is being used.</P> +<P> +The call to <TT +CLASS="FUNCTION"> +usbs_eth_init</TT> + should normally happen +after the enumeration data has been provided but before the underlying +USB device driver has been started. If the USB device were to be +started first then a connection between host and peripheral could be +established immediately, and the host-side device driver would attempt +to contact the USB-ethernet package for information such as the MAC +address. </P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +int +main(int argc, char** argv) +{ + unsigned char host_MAC[6] = { 0x40, 0x5d, 0x90, 0xa9, 0xbc, 0x02 }; + + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_eth_init(&usbs_eth0, &usbs_sa11x0_ep0, &usbs_sa11x0_ep1, &usbs_sa11x0_ep2, host_MAC); + … + usbs_start(&usbs_sa11x0_ep0); + … +}</PRE> +</TD> +</TR> +</TABLE> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-intro.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-data.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Introduction</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +USB-ethernet Data Transfers</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-intro.html @@ -0,0 +1,306 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Introduction</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="NEXT" +TITLE="Initializing the USB-ethernet Package" +HREF="usbseth-init.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="io-usb-slave-eth.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-init.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-INTRO"> +Introduction</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN6"> +</A> +<H2> +Name</H2> +Introduction -- eCos support for developing USB ethernet peripherals</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN9"> +</A> +<H2> +Introduction</H2> +<P> +The eCos USB-ethernet package provides additional support for USB +peripherals that involve some sort of ethernet-style network. This can +be a traditional ethernet, or it can involve some other networking +technology that uses ethernet frames as a unit of transfer. It +provides functions to transfer ethernet frames over the USB bus, +handles certain control messages from the host, and optionally it can +provide a network device driver for use by the eCos TCP/IP stack. +The package comes with an example host-side device driver.</P> +<P> +The USB-ethernet package is not tied to any specific hardware. It +requires the presence of USB hardware and a suitable device driver, +but not all USB peripherals involve ethernet communications. Hence the +configuration system cannot load the package automatically for +specific targets, in the way that a USB device driver or an ethernet +driver can be loaded automatically. Instead, the package has to be +added explicitly. When using the command line tools this will involve +an operation like the following:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +$ ecosconfig add usbs_eth</PRE> +</TD> +</TR> +</TABLE> +<P> +Typically, this will automatically cause the USB device driver to +become active. Loading the USB-ethernet package automatically provides +functionality for <A +HREF="usbseth-init.html"> +initialization</A> +, +<A +HREF="usbseth-data.html"> +data transfer</A> +, and the handling of +<A +HREF="usbseth-control.html"> +control messages</A> + and state +changes. If the current configuration includes the eCos TCP/IP stack +then the <A +HREF="usbseth-netdev.html"> +network device driver</A> + +support will be enabled as well by default, allowing the stack to +exchange ethernet frames over the USB bus.</P> +<P> +There is a USB standard for a class of communication devices including +ethernet. The package does not implement this standard, due to +limitations in the hardware for which the package was first developed. +Instead, the package uses its own <A +HREF="usbseth-protocol.html"> +protocol</A> + between USB +<A +HREF="usbseth-host.html"> +host device driver</A> + and the +peripheral. </P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN22"> +</A> +<H2> +Usage Scenarios</H2> +<P> +The USB-ethernet package can be used several different scenarios. In +a simple scenario, the peripheral serves only to connect the USB host +to a suitable network:</P> +<DIV +CLASS="INFORMALFIGURE"> +<P> +</P> +<DIV +CLASS="MEDIAOBJECT"> +<P> +<IMG +SRC="simple.gif"> +</IMG> +</P> +</DIV> +<P> +</P> +</DIV> +<P> +After initialization, and once the USB connection between host and +peripheral has been established, higher-level code needs to detect +packets that are intended for the host, and to forward these. This can +be achieved by the low-level <TT +CLASS="FUNCTION"> +usbs_eth_start_tx</TT> + +function. Similarly, higher-level code needs to detect packets coming +from the host, using <TT +CLASS="FUNCTION"> +usbs_eth_start_rx</TT> +, and to +forward these using the real network. As far as the host is concerned +it is connected directly to the network. In this scenario there is no +confusion about addresses: there is a single MAC address for the +host/peripheral combination, corresponding to the connection to the +real network, and it is this address which should be supplied during +<A +HREF="usbseth-init.html"> +initialization</A> +.</P> +<P> +In a more complicated scenario, there is a TCP/IP stack running inside +the peripheral.</P> +<DIV +CLASS="INFORMALFIGURE"> +<P> +</P> +<DIV +CLASS="MEDIAOBJECT"> +<P> +<IMG +SRC="tcpip.gif"> +</IMG> +</P> +</DIV> +<P> +</P> +</DIV> +<P> +This involves the USB-ethernet package providing a service both to the +host and to the eCos TCP/IP stack. It achieves the latter by acting as +an eCos network device. Typically, the TCP/IP stack will be configured +to act as a network bridge. The USB peripheral needs to examine the +packets arriving over the real network. Some of these packets will be +intended for the host, while others will be intended for the +peripheral itself. To distinguish between these two scenarios, two +distinct MAC addresses are needed: one for the host, and one for the +peripheral. Similarly, packets sent by the host may have to be +forwarded via the real network, or they may be intended for the TCP/IP +stack inside the peripheral. Packets generated inside the peripheral's +TCP/IP stack may need to be sent via the real network or over the USB +bus. The network bridge software will have to take care of all these +possibilities. Unusually for a network bridge, one of the network +segments being bridged will only ever have one machine attached.</P> +<P> +There are other possible usage scenarios. For example, the peripheral +might not be attached to a real network at all. Instead it could be +the USB host that acts as a network bridge, allowing a TCP/IP stack +inside the peripheral to communicate with the outside world. The +various details will depend on the exact type of peripheral being +developed. </P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-init.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +eCos Support for Developing USB-ethernet Peripherals</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Initializing the USB-ethernet Package</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-netdev.html @@ -0,0 +1,200 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Network Device for the eCos TCP/IP Stack</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="USB-ethernet State Handling" +HREF="usbseth-control.html"><LINK +REL="NEXT" +TITLE="Example Host-side Device Driver" +HREF="usbseth-host.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-control.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbseth-host.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-NETDEV"> +Network Device for the eCos TCP/IP Stack</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN221"> +</A> +<H2> +Name</H2> +Network Device -- USB-ethernet support for the eCos TCP/IP Stack</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN224"> +</A> +<H2> +Description</H2> +<P> +If the USB peripheral involves running the eCos TCP/IP stack and that +stack needs to use USB-ethernet as a transport layer (or as one of the +transports), then the USB-ethernet package can provide a suitable +network device driver. It is still necessary for higher-level code to +perform appropriate initialization by calling <A +HREF="usbseth-init.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +</A> +, but +after that it will be the TCP/IP stack rather than application code +that transmits or receives ethernet frames.</P> +<P> +Not all peripherals involving the USB-ethernet package will require a +TCP/IP stack. Hence the provision of the network device is controlled +by a configuration option <TT +CLASS="LITERAL"> +CYGPKG_USBS_ETHDRV</TT> +. By +default this will be enabled if the TCP/IP package +<TT +CLASS="LITERAL"> +CYGPKG_NET</TT> + is loaded, and disabled otherwise. </P> +<P> +There are a number of other configuration options related to the +network device. <TT +CLASS="LITERAL"> +CYGFUN_USBS_ETHDRV_STATISTICS</TT> + +determines whether or not the package will maintain statistics, mainly +intended for SNMP: by default this will be enabled if the SNMP support +package <TT +CLASS="LITERAL"> +CYGPKG_SNMPAGENT</TT> + is loaded, and disabled +otherwise. The name of the ethernet device is controlled by +<TT +CLASS="LITERAL"> +CYGDATA_USBS_ETHDRV_NAME</TT> +, and has a default value +of <TT +CLASS="LITERAL"> +eth0</TT> +. If there are other network device drivers +present in the configuration then it is the responsibility of the +application developer to give each device a unique name.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-control.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbseth-host.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +USB-ethernet State Handling</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Example Host-side Device Driver</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth-protocol.html @@ -0,0 +1,267 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Communication Protocol</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos Support for Developing USB-ethernet Peripherals" +HREF="io-usb-slave-eth.html"><LINK +REL="PREVIOUS" +TITLE="Example Host-side Device Driver" +HREF="usbseth-host.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos Support for Developing USB-ethernet Peripherals</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbseth-host.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> + </TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBSETH-PROTOCOL"> +Communication Protocol</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN279"> +</A> +<H2> +Name</H2> +Communication Protocol -- Protocol used between the host-side device driver and the eCos +USB-ethernet package </DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN282"> +</A> +<H2> +Description</H2> +<P> +There is a USB standard for the protocol to be used between the host +and a class of communication devices, including ethernet. However, the +eCos USB-ethernet package does not implement this protocol: the target +hardware for which the package was first developed had certain +limitations, and could not implement the standard. Instead, the package +implements a simple new protocol.</P> +<P> +A USB-ethernet peripheral involves bulk transfers on two endpoints: +one endpoint will be used for packets from host to peripheral and the +other will be used for the opposite direction. Transfers in both +directions are variable length, with a lower limit of 16 bytes and an +upper limit of 1516 bytes. The first two bytes of each transfer +constitute a header specific to USB-ethernet. The next 14 bytes form +the normal header for an ethernet frame: destination MAC address, +source MAC address, and a protocol field. The remaining data, up to +1500 bytes, are the payload. The first two bytes give the size of the +ethernet frame, least significant byte first, with a value between 14 +and 1514.</P> +<P> +For example an ARP request from host to peripheral involves an +ethernet frame of 42 bytes (0x002A), with the usual 14-byte header and +a 28-byte payload. The destination is the broadcast address +0xFFFFFFFFFFFF. The source depends on the MAC address specified for +the host in the call to <A +HREF="usbseth-init.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +</A> +, e.g. +0x405D90A9BC02. The remaining data is as specified by the appropriate +<A +HREF="http://www.ietf.org" +TARGET="_top"> +IETF RFC's</A> +. The actual bulk +USB transfer involves the following sequence of 44 bytes:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SCREEN"> +2a 00 ff ff ff ff ff ff 40 5d 90 a9 bc 02 08 06 +00 01 08 00 06 04 00 01 40 5d 90 a9 bc 02 0a 00 +00 01 00 00 00 00 00 00 0a 00 00 02</PRE> +</TD> +</TR> +</TABLE> +<P> +In addition there are two control messages. These will be sent by the +host to endpoint 0, the control endpoint, and by default they will +be handled by <A +HREF="usbseth-control.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_class_control_handler</TT> +</A> +. If class-specific +control messages are intercepted by other code then it is the +responsibility of that code to invoke the USB-ethernet handler when +appropriate.</P> +<P> +The first control message can be used by the host to obtain a MAC +address:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +#define ECOS_USBETH_CONTROL_GET_MAC_ADDRESS 0x01</PRE> +</TD> +</TR> +</TABLE> +<P> +The control message's type field should specify IN as the direction. +The request field should be <TT +CLASS="LITERAL"> +0x01</TT> +. The length fields +should specify a size of 6 bytes. The remaining fields of the control +message will be ignored by the USB-ethernet package. The response +consists of the 6-byte MAC address supplied by the initialization call +<A +HREF="usbseth-init.html"> +<TT +CLASS="FUNCTION"> +usbs_eth_init</TT> +</A> +.</P> +<P> +The second control message can be used by the host to enable or +disable promiscuous mode.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +#define ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE 0x02</PRE> +</TD> +</TR> +</TABLE> +<P> +This control message involves no further data so the length field +should be set to 0. The value field should be non-zero to enable +promiscuous mode, zero to disable it. The request field should be +<TT +CLASS="LITERAL"> +0x02</TT> +. The remaining fields in the control message +will be ignored. It is the responsibility of the host-side device +driver to keep track of whether or not promiscuous mode is currently +enabled. It will be disabled when the peripheral changes to +Configured state, typically at the point where the host-side device +driver has been activated.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbseth-host.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave-eth.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> + </TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Example Host-side Device Driver</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> + </TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/doc/usbseth.sgml @@ -0,0 +1,802 @@ +<!DOCTYPE reference PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> + +<!-- {{{ Banner --> + +<!-- =============================================================== --> +<!-- --> +<!-- usbseth.sgml --> +<!-- --> +<!-- USB slave-side ethernet support package. --> +<!-- --> +<!-- =============================================================== --> +<!-- ####COPYRIGHTBEGIN#### --> +<!-- --> +<!-- =============================================================== --> +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<!-- =============================================================== --> +<!-- --> +<!-- ####COPYRIGHTEND#### --> +<!-- =============================================================== --> +<!-- #####DESCRIPTIONBEGIN#### --> +<!-- --> +<!-- Author(s): bartv --> +<!-- Contact(s): bartv --> +<!-- Date: 2001/01/13 --> +<!-- Version: 0.01 --> +<!-- --> +<!-- ####DESCRIPTIONEND#### --> +<!-- =============================================================== --> + +<!-- }}} --> + +<reference id="io-usb-slave-eth"> + <title>eCos Support for Developing USB-ethernet Peripherals</title> + +<!-- {{{ Intro --> + +<refentry id="usbseth-intro"> +<refmeta> +<refentrytitle>Introduction</refentrytitle> +</refmeta> +<refnamediv> +<refname>Introduction</refname> +<refpurpose>eCos support for developing USB ethernet peripherals</refpurpose> +</refnamediv> + +<refsect1><title>Introduction</title> +<para> +The eCos USB-ethernet package provides additional support for USB +peripherals that involve some sort of ethernet-style network. This can +be a traditional ethernet, or it can involve some other networking +technology that uses ethernet frames as a unit of transfer. It +provides functions to transfer ethernet frames over the USB bus, +handles certain control messages from the host, and optionally it can +provide a network device driver for use by the eCos TCP/IP stack. +The package comes with an example host-side device driver. +</para> +<para> +The USB-ethernet package is not tied to any specific hardware. It +requires the presence of USB hardware and a suitable device driver, +but not all USB peripherals involve ethernet communications. Hence the +configuration system cannot load the package automatically for +specific targets, in the way that a USB device driver or an ethernet +driver can be loaded automatically. Instead, the package has to be +added explicitly. When using the command line tools this will involve +an operation like the following: +</para> +<screen width=72 format=linespecific> +$ ecosconfig add usbs_eth +</screen> +<para> +Typically, this will automatically cause the USB device driver to +become active. Loading the USB-ethernet package automatically provides +functionality for <link linkend="usbseth-init">initialization</link>, +<link linkend="usbseth-data">data transfer</link>, and the handling of +<link linkend="usbseth-control">control messages</link> and state +changes. If the current configuration includes the eCos TCP/IP stack +then the <link linkend="usbseth-netdev">network device driver</link> +support will be enabled as well by default, allowing the stack to +exchange ethernet frames over the USB bus. +</para> +<para> +There is a USB standard for a class of communication devices including +ethernet. The package does not implement this standard, due to +limitations in the hardware for which the package was first developed. +Instead, the package uses its own <link +linkend="usbseth-protocol">protocol</link> between USB +<link linkend="usbseth-host">host device driver</link> and the +peripheral. +</para> +</refsect1> + +<refsect1><title id="usbseth-intro-scenarios">Usage Scenarios</title> +<para> +The USB-ethernet package can be used several different scenarios. In +a simple scenario, the peripheral serves only to connect the USB host +to a suitable network: +</para> +<informalfigure PgWide=1> +<mediaobject> +<imageobject> +<imagedata fileref="simple.eps" format="eps" Scalefit=1 Align="Center"> +</imageobject> +<imageobject> +<imagedata fileref="simple.gif" format="gif" Align="Center"> +</imageobject> +</mediaobject> +</informalfigure> +<para> +After initialization, and once the USB connection between host and +peripheral has been established, higher-level code needs to detect +packets that are intended for the host, and to forward these. This can +be achieved by the low-level <function>usbs_eth_start_tx</function> +function. Similarly, higher-level code needs to detect packets coming +from the host, using <function>usbs_eth_start_rx</function>, and to +forward these using the real network. As far as the host is concerned +it is connected directly to the network. In this scenario there is no +confusion about addresses: there is a single MAC address for the +host/peripheral combination, corresponding to the connection to the +real network, and it is this address which should be supplied during +<link linkend="usbseth-init">initialization</link>. +</para> +<para> +In a more complicated scenario, there is a TCP/IP stack running inside +the peripheral. +</para> +<informalfigure PgWide=1> +<mediaobject> +<imageobject> +<imagedata fileref="tcpip.eps" format="eps" Scalefit=1 Align="Center"> +</imageobject> +<imageobject> +<imagedata fileref="tcpip.gif" format="gif" Align="Center"> +</imageobject> +</mediaobject> +</informalfigure> +<para> +This involves the USB-ethernet package providing a service both to the +host and to the eCos TCP/IP stack. It achieves the latter by acting as +an eCos network device. Typically, the TCP/IP stack will be configured +to act as a network bridge. The USB peripheral needs to examine the +packets arriving over the real network. Some of these packets will be +intended for the host, while others will be intended for the +peripheral itself. To distinguish between these two scenarios, two +distinct MAC addresses are needed: one for the host, and one for the +peripheral. Similarly, packets sent by the host may have to be +forwarded via the real network, or they may be intended for the TCP/IP +stack inside the peripheral. Packets generated inside the peripheral's +TCP/IP stack may need to be sent via the real network or over the USB +bus. The network bridge software will have to take care of all these +possibilities. Unusually for a network bridge, one of the network +segments being bridged will only ever have one machine attached. +</para> +<para> +There are other possible usage scenarios. For example, the peripheral +might not be attached to a real network at all. Instead it could be +the USB host that acts as a network bridge, allowing a TCP/IP stack +inside the peripheral to communicate with the outside world. The +various details will depend on the exact type of peripheral being +developed. +</para> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ Initialization --> + +<refentry id="usbseth-init"> +<refmeta> +<refentrytitle>Initializing the USB-ethernet Package</refentrytitle> +</refmeta> +<refnamediv> +<refname><function>usbs_eth_init</function></refname> +<refpurpose>Initializing the USB-ethernet Package</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs_eth.h> +</funcsynopsisinfo> +<funcprototype> +<funcdef>void <function>usbs_eth_init</function></funcdef> +<paramdef>usbs_eth* <parameter>usbeth</parameter></paramdef> +<paramdef>usbs_control_endpoint* <parameter>ep0</parameter></paramdef> +<paramdef>usbs_rx_endpoint* <parameter>ep1</parameter></paramdef> +<paramdef>usbs_tx_endpoint* <parameter>ep2</parameter></paramdef> +<paramdef>unsigned char* <parameter>mac_address</parameter></paramdef> +</funcprototype> +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title>Description</title> +<para> +The USB-ethernet package is not tied to any specific hardware. It +requires certain functionality: there must be USB-slave hardware +supported by a device driver; there must also be two endpoints for +bulk transfers between host and peripheral, one for each direction; +there must also be a control endpoint, although of course that is +implicit with any USB hardware. +</para> +<para> +However, USB-slave hardware may well provide more endpoints than the +minimum required for ethernet support. Some of those endpoints might +be used by other packages, while other endpoints might be used +directly by the application, or might not be needed for the peripheral +being built. There is also the possibility of a USB peripheral that +supports multiple configurations, with the ethernet support active in +only some of those configurations. The USB-ethernet package has no +knowledge about any of this, so it relies on higher-level code to tell +it which endpoints should be used and other information. This is the +purpose of the <function>usbs_eth_init</function> function. +</para> +<para> +The first argument identifies the specific +<structname>usbs_eth</structname> data structure that is affected. It +is expected that the vast majority of affected applications will only +provide a single USB-ethernet device to a single host, and the package +automatically provides a suitable data structure +<literal>usbs_eth0</literal> to support this. If multiple +<structname>usbs_eth</structname> structures are needed for some +reason then these need to be instantiated by other code, and each one +needs to be initialised by a call to +<function>usbs_eth_init()</function>. +</para> +<para> +The next three arguments identify the endpoints that should be used +for USB communications: a control endpoint, a receive endpoint for +ethernet packets coming from the host to the peripheral, and a +transmit endpoint for ethernet packets going in the other direction. +Obviously all three endpoints should be provided by the same USB +hardware. The USB-ethernet package assumes that it has sole access to +the receive and transmit endpoints, subject to the use of +<function>usbs_eth_disable</function> and +<function>usbs_eth_enable</function> control functions. The package +also assumes that no other code is interested in USB state changes or +class control messages: it installs handlers +<link linkend="usbseth-control"><function>usbs_eth_state_change_handler</function></link> +and +<link linkend="usbseth-control"><function>usbs_eth_class_control_handler</function></link> +in the control endpoint. If any other code does need to handle USB +state changes or class control messages then replacement handlers +should be installed after the call to +<function>usbs_eth_init</function>, and those replacements should +invoke the USB-ethernet ones when appropriate. +</para> +<para> +The final argument to <function>usbs_eth_init</function> specifies +the MAC address (or Ethernet Station Address) that should be provided +to the host-side device driver. Since the USB-ethernet package does not +interact directly with a real ethernet device it cannot obtain the MAC +address from any hardware. Instead, it must be supplied by higher-level +code. The details depend on the <link +linkend="usbseth-intro-scenarios">scenario</link> in which the +USB-ethernet package is being used. +</para> +<para> +The call to <function>usbs_eth_init</function> should normally happen +after the enumeration data has been provided but before the underlying +USB device driver has been started. If the USB device were to be +started first then a connection between host and peripheral could be +established immediately, and the host-side device driver would attempt +to contact the USB-ethernet package for information such as the MAC +address. +</para> +<programlisting width=72> +int +main(int argc, char** argv) +{ + unsigned char host_MAC[6] = { 0x40, 0x5d, 0x90, 0xa9, 0xbc, 0x02 }; + + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_eth_init(&usbs_eth0, &usbs_sa11x0_ep0, &usbs_sa11x0_ep1, &usbs_sa11x0_ep2, host_MAC); + … + usbs_start(&usbs_sa11x0_ep0); + … +} +</programlisting> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ Data Transfer --> + +<refentry id="usbseth-data"> +<refmeta> +<refentrytitle>USB-ethernet Data Transfers</refentrytitle> +</refmeta> +<refnamediv> +<refname>USB-ethernet Data Transfers</refname> +<refpurpose>Exchanging ethernet packets with the USB host</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs_eth.h> +</funcsynopsisinfo> + +<funcprototype> +<funcdef>void <function>usbs_eth_start_rx</function></funcdef> +<paramdef>usbs_eth* <parameter>usbseth</parameter></paramdef> +<paramdef>unsigned char* <parameter>buffer</parameter></paramdef> +<paramdef>void (*)(usbs_eth*, void*, int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void* <parameter>complete_data</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>void <function>usbs_eth_start_tx</function></funcdef> +<paramdef>usbs_eth* <parameter>usbseth</parameter></paramdef> +<paramdef>unsigned char* <parameter>buffer</parameter></paramdef> +<paramdef>void (*)(usbs_eth*, void*, int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void* <parameter>complete_data</parameter></paramdef> +</funcprototype> + +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title>Description</title> +<para> +The USB-ethernet package provides two main modes of operation. In the +first mode it provides a <link linkend="usbseth-netdev">network device +driver</link> for use by a TCP/IP stack running inside the USB +peripheral. All incoming ethernet packages should be passed up the +TCP/IP stack, and only the stack will generate outgoing packets. Apart +from <link linkend="usbseth-init">initialization</link> and possibly +certain <link linkend="usbseth-control">control operations</link>, +higher-level code will not interact with the USB-ethernet package +directly. +</para> +<para> +In the second mode there is no TCP/IP stack running inside the USB +peripheral. For example, a simple USB-ethernet converter has an +ethernet chip and a USB port: ethernet packets received by the +ethernet chip need to be forwarded to the USB host, and ethernet +packets sent by the USB host need to be sent out of the ethernet chip. +<function>usbs_eth_start_rx</function> and +<function>usbs_eth_start_tx</function> allow for this lower-level +access to the USB-ethernet package. +</para> +<para> +The two modes of operation are mutually exclusive. If the network +device driver mode is enabled then application code should communicate +at the TCP/IP level, and not by using the lower-level functions. +Instead, it is the network device driver that will make use of these +functions, and it assumes that it has exclusive access. The package +does not perform any locking. +</para> +<para> +The transmit and receive functions work in much the same way. The +first argument identifies the <structname>usbs_eth</structname> +structure that should be used. For the majority of applications this +will be <literal>usbs_eth0</literal>. The second argument specifies +the location of the ethernet packet; outgoing for +<function>usbs_eth_start_tx</function> and incoming for +<function>usbs_eth_start_rx</function>. This buffer should correspond +to the <link linkend="usbseth-protocol">protocol</link>: +</para> +<orderedlist> +<listitem> +<para> +Outgoing packets can consist of up to 1516 bytes, consisting of a +two-byte header specific to USB-ethernet followed by a standard +ethernet frame (a header with 6-byte destination address, 6-byte +source address and a further two bytes, followed by a payload of +up to 1500 bytes). The two-byte USB-ethernet header consists simply of +the size of the ethernet frame, i.e. the size of the rest of the +packet not including the USB-ethernet header, with the least +significant byte first. +</para> +</listitem> +<listitem> +<para> +For incoming packets the supplied buffer should usually be at least +1516 bytes. There may be special circumstances in which a smaller +buffer might be safe; for example, if the host-side device driver is +modified to support only smaller packets. Once the packet has been +received the buffer will contain a two-byte header specific to +USB-ethernet, followed by a normal ethernet frame. The header +gives the size of the ethernet frame, excluding the header, with the +least significant byte first. +</para> +</listitem> +</orderedlist> +<para> +Both <function>usbs_eth_start_tx</function> and +<function>usbs_eth_start_rx</function> are asynchronous: the transfer +is started and, some time later, a completion function will be invoked. +The third and fourth arguments to both +<function>usbs_eth_start_tx</function> and +<function>usbs_eth_start_rx</function> supply the completion function +and an argument to that function respectively. The completion function +will be invoked with three arguments: a pointer to the +<structname>usbs_eth</structname> data structure, usually +<literal>usbs_eth0</literal>; the supplied completion data ; and a +return code field. A negative value indicates that an error occurred, +for example <literal>-EPIPE</literal> if the connection between USB +host and peripheral has been broken, or <literal>-EAGAIN</literal> if +an endpoint has been halted. A positive value indicates the total size +of the transfer, which should correspond to the size in the +USB-ethernet header plus an additional two bytes for the header +itself. +</para> +<para> +If the data transfer is succesful then the completion function will +typically be invoked in DSR context rather than in thread context, +although this depends on the implementation of the underlying USB +device driver. Therefore the completion function is restricted in what +it can do; in particular, it must not make any calls that will or may +block such as locking a mutex or allocating memory. The kernel +documentation should be consulted for more details of DSR's and +interrupt handling generally. Note that if the transfer finishes +quickly then the completion function may be invoked before +<function>usbs_eth_start_rx</function> or +<function>usbs_eth_start_tx</function> returns. This is especially +likely to happen if the current thread is descheduled after starting +the data transfer but before returning from these functions. +</para> +<para> +For transmit operations, it is possible for +<function>usbs_eth_start_tx</function> to invoke the completion +function immediately. If there is no current connection between host +and target then the transmit will fail immediately with +<literal>-EPIPE</literal>. In addition the USB-ethernet package will +check the destination MAC address and make sure that the ethernet +frame really is intended for the host: either it must be for the +address specified in the initialization call <link +linkend="usbseth-init"><function>usbs_eth_init</function></link>, or +it must be a broadcast packet, or the host must have enabled +promiscuous mode. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ State and Control Messages --> + +<refentry id="usbseth-control"> +<refmeta> +<refentrytitle>USB-ethernet State Handling</refentrytitle> +</refmeta> +<refnamediv> +<refname>USB-ethernet State Handling</refname> +<refpurpose>Maintaining the USB-ethernet connection with the host</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs_eth.h> +</funcsynopsisinfo> + +<funcprototype> +<funcdef>usbs_control_return <function>usbs_eth_class_control_handler</function></funcdef> +<paramdef>usbs_control_endpoint* <parameter>ep0</parameter></paramdef> +<paramdef>void* <parameter>callback_data</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>void <function>usbs_eth_state_change_handler</function></funcdef> +<paramdef>usbs_control_endpoint* <parameter>ep0</parameter></paramdef> +<paramdef>void* <parameter>callback_data</parameter></paramdef> +<paramdef>usbs_state_change <parameter>change</parameter></paramdef> +<paramdef>int <parameter>old_state</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>void <function>usbs_eth_disable</function></funcdef> +<paramdef>usbs_eth* <parameter>usbseth></parameter></paramdef> +</funcprototype> +<funcprototype> +<funcdef>void <function>usbs_eth_enable</function></funcdef> +<paramdef>usbs_eth* <parameter>usbseth></parameter></paramdef> +</funcprototype> + +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title>Description</title> +<para> +When the USB-ethernet package is initialized by a call to <link +linkend="usbseth-init"><function>usbs_eth_init</function></link> it +installs <function>usbs_eth_state_change_handler</function> to handle +USB state changes. This allows the package to detect when the +connection between the host and the peripheral is established or +broken, resulting in internal calls to +<function>usbs_eth_enable</function> and +<function>usbs_eth_disable</function> respectively. This is +appropriate if no other code needs to access the USB device. However, +if there is other code, either other USB-related packages or the +application itself, that needs to perform I/O over the USB bus, then +typically the USB-ethernet package should not have exclusive access to +state change events. Instead, the assumption is that higher-level +code, typically provided by the application, will install an +alternative state change handler in the control endpoint data +structure after the call to <function>usbs_eth_init</function>. This +alternative handler will either chain into +<function>usbs_eth_state_change_handler</function> when appropriate, +or else it will invoke <function>usbs_eth_enable</function> and +<function>usbs_eth_disable</function> directly. For further details of +state change handlers and control endpoints generally, see the +documentation for the common USB-slave package. +</para> +<para> +Similarly, <function>usbs_eth_init</function> will install +<function>usbs_eth_class_control_handler</function> in the control +endpoint data structure as the appropriate handler for class-specific +USB control messages. This code will handle the ethernet-specific +<link linkend="usbseth-protocol">control messages </link>, for example +requests by the host to enable or disable promiscuous mode or to +obtain the MAC address. If the USB device is not shared with any other +code then this is both necessary and sufficient. However, if other code +is involved and if that code also needs to process certain control +messages, higher-level code should install its own handler and chain +to the USB-ethernet one when appropriate. It should be noted that the +request code is encoded in just a single byte, so there is a real +possibility that exactly the same number will be used by different +protocols for different requests. Any such problems will have to be +identified and resolved by application developers, and may involve +modifying the source code for the USB-ethernet package. +</para> +<para> +As an alternative to chaining the state change handler, higher-level +code can instead call <function>usbs_eth_disable</function> and +<function>usbs_eth_enable</function> directly. These functions may +also be called if the USB-ethernet package should become inactive for +reasons not related directly to events on the USB bus. The main effect +of <function>usbs_eth_enable</function> is to restart receive +operations and to allow transmits. The main effect of +<function>usbs_eth_disable</function> is to block further transmits: +any current receive operations need to be aborted at the USB level, +for example by halting the appropriate endpoint. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ netdev device --> + +<refentry id="usbseth-netdev"> +<refmeta> +<refentrytitle>Network Device for the eCos TCP/IP Stack</refentrytitle> +</refmeta> +<refnamediv> +<refname>Network Device</refname> +<refpurpose>USB-ethernet support for the eCos TCP/IP Stack</refpurpose> +</refnamediv> + +<refsect1><title>Description</title> +<para> +If the USB peripheral involves running the eCos TCP/IP stack and that +stack needs to use USB-ethernet as a transport layer (or as one of the +transports), then the USB-ethernet package can provide a suitable +network device driver. It is still necessary for higher-level code to +perform appropriate initialization by calling <link +linkend="usbseth-init"><function>usbs_eth_init</function></link>, but +after that it will be the TCP/IP stack rather than application code +that transmits or receives ethernet frames. +</para> +<para> +Not all peripherals involving the USB-ethernet package will require a +TCP/IP stack. Hence the provision of the network device is controlled +by a configuration option <literal>CYGPKG_USBS_ETHDRV</literal>. By +default this will be enabled if the TCP/IP package +<literal>CYGPKG_NET</literal> is loaded, and disabled otherwise. +</para> +<para> +There are a number of other configuration options related to the +network device. <literal>CYGFUN_USBS_ETHDRV_STATISTICS</literal> +determines whether or not the package will maintain statistics, mainly +intended for SNMP: by default this will be enabled if the SNMP support +package <literal>CYGPKG_SNMPAGENT</literal> is loaded, and disabled +otherwise. The name of the ethernet device is controlled by +<literal>CYGDATA_USBS_ETHDRV_NAME</literal>, and has a default value +of <literal>eth0</literal>. If there are other network device drivers +present in the configuration then it is the responsibility of the +application developer to give each device a unique name. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ ecos_usbeth --> + +<refentry id="usbseth-host"> +<refmeta> +<refentrytitle>Example Host-side Device Driver</refentrytitle> +</refmeta> +<refnamediv> +<refname>Example Host-side Device Driver</refname> +<refpurpose>Provide host-side support for the eCos USB-ethernet package</refpurpose> +</refnamediv> + +<refsect1><title>Description</title> +<para> +The USB-ethernet package is supplied with a single host-side device +driver. This driver has been developed against the Linux kernel +2.2.16-22, as shipped with Red Hat 7. The driver is provided as is and +should not be considered production quality: for example it only +checks for a bogus vendor id <literal>0x4242</literal> rather than an +official vendor id supplied by the <ulink +url="http://www.usb.org/">USB Implementers Forum</ulink>. Also, if the +peripheral involves multiple configurations or multiple interfaces, it +will fail to detect this. However, the driver can be used for simple +testing and as the basis of a full device driver. Details of the +protocol used between host and peripheral can be found in the <link +linkend="usbseth-protocol">Communication Protocol</link> section. +</para> +<para> +The host-side device driver can be found in the <filename +class="directory">host</filename> subdirectory of the USB-ethernet +package, specifically the file <filename>ecos_usbeth.c</filename>, and +comes with a <filename>Makefile</filename>. Both files may need +to be modified for specific applications. For example, the vendor id +table <literal>ecos_usbeth_implementations</literal> may need to be +updated for the specific USB peripheral being built. The +<filename>Makefile</filename> assumes that the Linux kernel sources +reside in <filename class="directory">/usr/src/linux</filename>, and +that the kernel has already been configured and built. Assuming this +is the case, the device driver can be built simply by invoking +<command>make</command> with no additional arguments. This will result +in a dynamically loadable kernel module, +<filename>ecos_usbeth.o</filename>, in the current directory. +</para> +<note> +<para> +As normal for Linux kernel builds, the generated files such as +<filename>ecos_usbeth.o</filename> live in the same directory as the +source tree. This is very different from eCos where the source tree +(or component repository) is kept separate from any builds. There may +be problems if the component repository is kept read-only or if it is +put under source code control. Any such problems can be avoided by +making a copy of the <filename class="directory">host</filename> +subdirectory and building that copy. +</para> +</note> +<para> +Loading the kernel module into the current system requires root +privileges. If the generic USB support is also a loadable module and +has not been loaded already, this must happen first: +</para> +<screen width=72 format=linespecific> +# insmod usb-uhci +Using /lib/modules/2.2.16-22/usb/usb-uhci.o +</screen> +<para> +Depending on the host hardware, the <literal>uhci</literal> or +<literal>usb-ohci</literal> modules may be more appropriate. Loading +the generic USB module will typically result in a number of messages +to the logfile <filename>/var/log/messages</filename>, giving details +of the specific host-side hardware that has been detected plus any +hubs. The next step is to load the USB-ethernet module: +</para> +<screen width=72 format=linespecific> +# insmod ecos_usbeth.o +</screen> +<para> +This should result in a number of additional diagnostics in the +logfile: +</para> +<screen width=72 format=linespecific> +Apr 1 18:01:08 grumpy kernel: eCos USB-ethernet device driver +Apr 1 18:01:08 grumpy kernel: usb.c: registered new driver ecos_usbeth +</screen> +<para> +If a suitable USB peripheral is now connected the host will detect +this, assign an address in the local USB network, obtain enumeration +data, and find a suitable device driver. Assuming the peripheral and +device driver agree on the supported vendor ids, the +<filename>ecos_usbeth.o</filename> module will be selected and this +will be reported in the system log: +</para> +<screen width=86 format=linespecific> +Apr 1 18:04:12 grumpy kernel: usb.c: USB new device connect, assigned device number 3 +Apr 1 18:04:12 grumpy kernel: eCos-based USB ethernet peripheral active at eth1 +</screen> +<para> +What can happen next depends very much on the software that is running +on top of the USB-ethernet package inside the peripheral. For example, +if there is a TCP/IP stack then it should be possible to bring up a +network connection between host and peripheral using +<command>ifconfig</command>. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ Protocol --> + +<refentry id="usbseth-protocol"> +<refmeta> +<refentrytitle>Communication Protocol</refentrytitle> +</refmeta> +<refnamediv> +<refname>Communication Protocol</refname> +<refpurpose>Protocol used between the host-side device driver and the eCos +USB-ethernet package </refpurpose> +</refnamediv> + +<refsect1><title>Description</title> +<para> +There is a USB standard for the protocol to be used between the host +and a class of communication devices, including ethernet. However, the +eCos USB-ethernet package does not implement this protocol: the target +hardware for which the package was first developed had certain +limitations, and could not implement the standard. Instead, the package +implements a simple new protocol. +</para> +<para> +A USB-ethernet peripheral involves bulk transfers on two endpoints: +one endpoint will be used for packets from host to peripheral and the +other will be used for the opposite direction. Transfers in both +directions are variable length, with a lower limit of 16 bytes and an +upper limit of 1516 bytes. The first two bytes of each transfer +constitute a header specific to USB-ethernet. The next 14 bytes form +the normal header for an ethernet frame: destination MAC address, +source MAC address, and a protocol field. The remaining data, up to +1500 bytes, are the payload. The first two bytes give the size of the +ethernet frame, least significant byte first, with a value between 14 +and 1514. +</para> +<para> +For example an ARP request from host to peripheral involves an +ethernet frame of 42 bytes (0x002A), with the usual 14-byte header and +a 28-byte payload. The destination is the broadcast address +0xFFFFFFFFFFFF. The source depends on the MAC address specified for +the host in the call to <link +linkend="usbseth-init"><function>usbs_eth_init</function></link>, e.g. +0x405D90A9BC02. The remaining data is as specified by the appropriate +<ulink url="http://www.ietf.org">IETF RFC's</ulink>. The actual bulk +USB transfer involves the following sequence of 44 bytes: +</para> +<screen width=72 format=linespecific> +2a 00 ff ff ff ff ff ff 40 5d 90 a9 bc 02 08 06 +00 01 08 00 06 04 00 01 40 5d 90 a9 bc 02 0a 00 +00 01 00 00 00 00 00 00 0a 00 00 02 +</screen> +<para> +In addition there are two control messages. These will be sent by the +host to endpoint 0, the control endpoint, and by default they will +be handled by <link linkend="usbseth-control"><function> +usbs_eth_class_control_handler</function></link>. If class-specific +control messages are intercepted by other code then it is the +responsibility of that code to invoke the USB-ethernet handler when +appropriate. +</para> +<para> +The first control message can be used by the host to obtain a MAC +address: +</para> +<programlisting width=72> +#define ECOS_USBETH_CONTROL_GET_MAC_ADDRESS 0x01 +</programlisting> +<para> +The control message's type field should specify IN as the direction. +The request field should be <literal>0x01</literal>. The length fields +should specify a size of 6 bytes. The remaining fields of the control +message will be ignored by the USB-ethernet package. The response +consists of the 6-byte MAC address supplied by the initialization call +<link +linkend="usbseth-init"><function>usbs_eth_init</function></link>. +</para> +<para> +The second control message can be used by the host to enable or +disable promiscuous mode. +</para> +<programlisting width=72> +#define ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE 0x02 +</programlisting> +<para> +This control message involves no further data so the length field +should be set to 0. The value field should be non-zero to enable +promiscuous mode, zero to disable it. The request field should be +<literal>0x02</literal>. The remaining fields in the control message +will be ignored. It is the responsibility of the host-side device +driver to keep track of whether or not promiscuous mode is currently +enabled. It will be disabled when the peripheral changes to +Configured state, typically at the point where the host-side device +driver has been activated. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> + +</reference> \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/host/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License.
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/host/Makefile @@ -0,0 +1,95 @@ +# +# Makefile for the Linux device driver for eCos USB-ethernet +# devices. This makefile has been cloned from the one in +# /usr/src/linux-2.2.16/drivers/usb +# + +# This makefile will chain to the Linux makefile if appropriate. +# The toplevel Linux makefile sets the variable KERNELRELEASE +ifeq (,$(KERNELRELEASE)) + +default: + make -C /usr/src/linux SUBDIRS=$(shell pwd) modules + +modules: default + +modules_install: + @echo Support for installing this module not yet implemented. + +else + +# A recursive invocation of this makefile from the Linux one. + +# Build this driver as a module. +CONFIG_USB_ECOS_USBETH = m + +# Subdirs. + +SUB_DIRS := +MOD_SUB_DIRS := $(SUB_DIRS) +MOD_IN_SUB_DIRS := $(SUB_DIRS) +ALL_SUB_DIRS := $(SUB_DIRS) + +# The target object and module list name. + +O_TARGET := +M_OBJS := +O_OBJS := +MOD_LIST_NAME := ECOS_USBETH_MODULE + +# Objects that export symbols. + +export-objs := + +# Multipart objects. + +list-multi := + +# Optional parts of multipart objects. + +# Object file lists. + +obj-y := +obj-m := +obj-n := +obj- := + +# Object files in subdirectories + +# Each configuration option enables a list of files. + +obj-$(CONFIG_USB_ECOS_USBETH) += ecos_usbeth.o + +# Extract lists of the multi-part drivers. +# The 'int-*' lists are the intermediate files used to build the multi's. + +multi-y := $(filter $(list-multi), $(obj-y)) +multi-m := $(filter $(list-multi), $(obj-m)) +int-y := $(sort $(foreach m, $(multi-y), $($(basename $(m))-objs))) +int-m := $(sort $(foreach m, $(multi-m), $($(basename $(m))-objs))) + +# Files that are both resident and modular: remove from modular. + +obj-m := $(filter-out $(obj-y), $(obj-m)) +int-m := $(filter-out $(int-y), $(int-m)) + +# Take multi-part drivers out of obj-y and put components in. + +obj-y := $(filter-out $(list-multi), $(obj-y)) $(int-y) + +# Translate to Rules.make lists. + +O_OBJS := $(sort $(filter-out $(export-objs), $(obj-y))) +OX_OBJS := $(sort $(filter $(export-objs), $(obj-y))) +M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m))) +MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) +MI_OBJS := $(sort $(filter-out $(export-objs), $(int-m))) +MIX_OBJS := $(sort $(filter $(export-objs), $(int-m))) + +# The global Rules.make. + +include $(TOPDIR)/Rules.make + +# Link rules for multi-part drivers. + +endif
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/host/ecos_usbeth.c @@ -0,0 +1,522 @@ +//========================================================================== +// +// ecos_usbeth.c +// +// Linux device driver for eCos-based USB ethernet peripherals. +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ---------------------------------------------------------------------------- +// Copyright (C) 2000 Red Hat, Inc. +// +// This file is part of the eCos USB support. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// ---------------------------------------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-11-12 +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/usb.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> + +#ifdef MODULE +MODULE_AUTHOR("Bart Veer <bartv@redhat.com>"); +MODULE_DESCRIPTION("USB ethernet driver for eCos-based peripherals"); +#endif + +// This array identifies specific implementations of eCos USB-ethernet +// devices. All implementations should add their vendor and device +// details. + +typedef struct ecos_usbeth_impl { + const char* name; + __u16 vendor; + __u16 id; +} ecos_usbeth_impl; + +const static ecos_usbeth_impl ecos_usbeth_implementations[] = { + { "eCos ether", 0x4242, 0x4242 }, + { (const char*) 0, 0, 0 } +}; + + +// Constants. These have to be kept in sync with the target-side +// code. +#define ECOS_USBETH_MAXTU 1516 +#define ECOS_USBETH_MAX_CONTROL_TU 8 +#define ECOS_USBETH_CONTROL_GET_MAC_ADDRESS 0x01 +#define ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE 0x02 + +// The main data structure. It keeps track of both the USB +// and network side of things, and provides buffers for +// the various operations. +// +// NOTE: currently this driver only supports a single +// plugged-in device. Theoretically multiple eCos-based +// USB ethernet devices could be plugged in to a single +// host and each one would require an ecos_usbeth +// structure. +typedef struct ecos_usbeth { + spinlock_t usb_lock; + int target_promiscuous; + struct usb_device* usb_dev; + struct net_device* net_dev; + struct net_device_stats stats; + struct urb rx_urb; + struct urb tx_urb; + unsigned char rx_buffer[ECOS_USBETH_MAXTU]; + unsigned char tx_buffer[ECOS_USBETH_MAXTU]; +} ecos_usbeth; + + +// open() +// Invoked by the TCP/IP stack when the interface is brought up. +// This just starts a receive operation. +static int +ecos_usbeth_open(struct net_device* net) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) net->priv; + int res; + + netif_start_queue(net); + res = usb_submit_urb(&(usbeth->rx_urb)); + if (0 != res) { + printk("ecos_usbeth: failed to start USB receives, %d\n", res); + } + MOD_INC_USE_COUNT; + return 0; +} + +// close() +// Invoked by the TCP/IP stack when the interface is taken down. +// Any active USB operations need to be cancelled. During +// a disconnect this may get called twice, once for the +// disconnect and once for the network interface being +// brought down. +static int +ecos_usbeth_close(struct net_device* net) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) net->priv; + + if (0 != netif_running(net)) { + netif_stop_queue(net); + net->start = 0; + + if (-EINPROGRESS == usbeth->rx_urb.status) { + usb_unlink_urb(&(usbeth->rx_urb)); + } + if (-EINPROGRESS == usbeth->tx_urb.status) { + usb_unlink_urb(&(usbeth->tx_urb)); + } + MOD_DEC_USE_COUNT; + } + + return 0; +} + +// Reception. +// probe() fills in an rx_urb. When the net device is brought up +// the urb is activated, and this callback gets run for incoming +// data. +static void +ecos_usbeth_rx_callback(struct urb* urb) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) urb->context; + struct net_device* net = usbeth->net_dev; + struct sk_buff* skb; + int len; + int res; + + if (0 != urb->status) { + // This happens numerous times during a disconnect. Do not + // issue a warning, but do clear the status field or things + // get confused when resubmitting. + // + // Some host hardware does not distinguish between CRC errors + // (very rare) and timeouts (perfectly normal). Do not + // increment the error count if it might have been a timeout. + if (USB_ST_CRC != urb->status) { + usbeth->stats.rx_errors++; + } + urb->status = 0; + } else if (2 > urb->actual_length) { + // With some hardware the target may have to send a bogus + // first packet. Just ignore those. + + } else { + len = usbeth->rx_buffer[0] + (usbeth->rx_buffer[1] << 8); + if (len > (urb->actual_length - 2)) { + usbeth->stats.rx_errors++; + usbeth->stats.rx_length_errors++; + printk("ecos_usbeth: warning, packet size mismatch, got %d bytes, expected %d\n", + urb->actual_length, len); + } else { + skb = dev_alloc_skb(len + 2); + if ((struct sk_buff*)0 == skb) { + printk("ecos_usbeth: failed to alloc skb, dropping packet\n"); + usbeth->stats.rx_dropped++; + } else { +#if 0 + { + int i; + printk("--------------------------------------------------------------\n"); + printk("ecos_usbeth RX: total size %d\n", len); + for (i = 0; (i < len) && (i < 128); i+= 8) { + printk("rx %x %x %x %x %x %x %x %x\n", + usbeth->rx_buffer[i+0], usbeth->rx_buffer[i+1], usbeth->rx_buffer[i+2], usbeth->rx_buffer[i+3], + usbeth->rx_buffer[i+4], usbeth->rx_buffer[i+5], usbeth->rx_buffer[i+6], usbeth->rx_buffer[i+7]); + } + printk("--------------------------------------------------------------\n"); + } +#endif + skb->dev = net; + eth_copy_and_sum(skb, &(usbeth->rx_buffer[2]), len, 0); + skb_put(skb, len); + skb->protocol = eth_type_trans(skb, net); + netif_rx(skb); + usbeth->stats.rx_packets++; + usbeth->stats.rx_bytes += len; + } + } + } + + if (0 != netif_running(net)) { + res = usb_submit_urb(&(usbeth->rx_urb)); + if (0 != res) { + printk("ecos_usbeth: failed to restart USB receives after packet, %d\n", res); + } + } +} + +// start_tx(). +// Transmit a single packet. The relevant USB protocol requires a +// 2-byte length field at the start, the incoming buffer has no space +// for this, and the URB API does not support any form of +// scatter/gather. Therefore unfortunately the whole packet has to be +// copied. The callback function is specified when the URB is filled +// in by probe(). +static void +ecos_usbeth_tx_callback(struct urb* urb) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) urb->context; + spin_lock(&usbeth->usb_lock); + if (0 != netif_running(usbeth->net_dev)) { + netif_wake_queue(usbeth->net_dev); + } + spin_unlock(&usbeth->usb_lock); +} + +static int +ecos_usbeth_start_tx(struct sk_buff* skb, struct net_device* net) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) net->priv; + int res; + + if ((skb->len + 2) > ECOS_USBETH_MAXTU) { + printk("ecos_usbeth: oversized packet of %d bytes\n", skb->len); + return 0; + } + + if (netif_queue_stopped(net)) { + // Another transmission already in progress. + // USB bulk operations should complete within 5s. + int current_delay = jiffies - net->trans_start; + if (current_delay < (5 * HZ)) { + return 1; + } else { + // There has been a timeout. Discard this message. + //printk("transmission timed out\n"); + usbeth->stats.tx_errors++; + dev_kfree_skb(skb); + return 0; + } + } + + spin_lock(&usbeth->usb_lock); + usbeth->tx_buffer[0] = skb->len & 0x00FF; + usbeth->tx_buffer[1] = (skb->len >> 8) & 0x00FF; + memcpy(&(usbeth->tx_buffer[2]), skb->data, skb->len); + usbeth->tx_urb.transfer_buffer_length = skb->len + 2; +#if 0 + { + int i; + printk("--------------------------------------------------------------\n"); + printk("ecos_usbeth start_tx: len %d\n", skb->len + 2); + for (i = 0; (i < (skb->len + 2)) && (i < 128); i+= 8) { + printk("tx %x %x %x %x %x %x %x %x\n", + usbeth->tx_buffer[i], usbeth->tx_buffer[i+1], usbeth->tx_buffer[i+2], usbeth->tx_buffer[i+3], + usbeth->tx_buffer[i+4], usbeth->tx_buffer[i+5], usbeth->tx_buffer[i+6], usbeth->tx_buffer[i+7]); + } + printk("--------------------------------------------------------------\n"); + } +#endif + res = usb_submit_urb(&(usbeth->tx_urb)); + if (0 == res) { + netif_stop_queue(net); + net->trans_start = jiffies; + usbeth->stats.tx_packets++; + usbeth->stats.tx_bytes += skb->len; + } else { + printk("ecos_usbeth: failed to start USB packet transmission, %d\n", res); + usbeth->stats.tx_errors++; + } + + spin_unlock(&usbeth->usb_lock); + dev_kfree_skb(skb); + return 0; +} + + +// set_rx_mode() +// Invoked by the network stack to enable/disable promiscuous mode or +// for multicasting. The latter is not yet supported on the target +// side. The former involves a USB control message. The main call +// is not allowed to block. +static void +ecos_usbeth_set_rx_mode_callback(struct urb* urb) +{ + kfree(urb->setup_packet); + usb_free_urb(urb); +} + +static void +ecos_usbeth_set_rx_mode(struct net_device* net) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) net->priv; + __u16 promiscuous = net->flags & IFF_PROMISC; + int res; + + if (promiscuous != usbeth->target_promiscuous) { + devrequest* req; + urb_t* urb; + + urb = usb_alloc_urb(0); + if ((urb_t*)0 == urb) { + return; + } + req = kmalloc(sizeof(devrequest), GFP_KERNEL); + if ((devrequest*)0 == req) { + usb_free_urb(urb); + return; + } + req->requesttype = USB_TYPE_CLASS | USB_RECIP_DEVICE; + req->request = ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE; + req->value = cpu_to_le16p(&promiscuous); + req->index = 0; + req->length = 0; + + FILL_CONTROL_URB(urb, + usbeth->usb_dev, + usb_sndctrlpipe(usbeth->usb_dev, 0), + (unsigned char*) req, + (void*) 0, + 0, + &ecos_usbeth_set_rx_mode_callback, + (void*) usbeth); + res = usb_submit_urb(urb); + if (0 != res) { + kfree(req); + usb_free_urb(urb); + } else { + usbeth->target_promiscuous = promiscuous; + } + } +} + +// netdev_stats() +// Supply the current network statistics. These are held in +// the stats field of the ecos_usbeth structure +static struct net_device_stats* +ecos_usbeth_netdev_stats(struct net_device* net) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) net->priv; + return &(usbeth->stats); +} + +// ioctl() +// Currently none of the network ioctl()'s are supported +static int +ecos_usbeth_ioctl(struct net_device* net, struct ifreq* request, int command) +{ + return -EINVAL; +} + +// probe(). +// This is invoked by the generic USB code when a new device has +// been detected and its configuration details have been extracted +// and stored in the usbdev structure. The interface_id specifies +// a specific USB interface, to cope with multifunction peripherals. +// +// FIXME; right now this code only copes with simple enumeration data. +// OK, to be really honest it just looks for the vendor and device ids +// in the simple test cases and ignores everything else. +// +// On success it should return a non-NULL pointer, which happens to be +// a newly allocated ecos_usbeth structure. This will get passed to +// the disconnect function. Filling in the ecos_usbeth structure will, +// amongst other things, register this as a network device driver. +// The MAC address is obtained from the peripheral via a control +// request. + +static void* +ecos_usbeth_probe(struct usb_device* usbdev, unsigned int interface_id) +{ + struct net_device* net; + ecos_usbeth* usbeth; + int res; + unsigned char MAC[6]; + unsigned char dummy[1]; + + if ((usbdev->descriptor.idVendor != ecos_usbeth_implementations[0].vendor) || + (usbdev->descriptor.idProduct != ecos_usbeth_implementations[0].vendor)) { + return (void*) 0; + } + res = usb_set_configuration(usbdev, usbdev->config[0].bConfigurationValue); + if (0 != res) { + printk("ecos_usbeth: failed to set configuration, %d\n", res); + return (void*) 0; + } + res = usb_control_msg(usbdev, + usb_rcvctrlpipe(usbdev, 0), + ECOS_USBETH_CONTROL_GET_MAC_ADDRESS, + USB_TYPE_CLASS | USB_RECIP_DEVICE | USB_DIR_IN, + 0, + 0, + (void*) MAC, + 6, + 5 * HZ); + if (6 != res) { + printk("ecos_usbeth: failed to get MAC address, %d\n", res); + return (void*) 0; + } + res = usb_control_msg(usbdev, + usb_sndctrlpipe(usbdev, 0), // pipe + ECOS_USBETH_CONTROL_SET_PROMISCUOUS_MODE, // request + USB_TYPE_CLASS | USB_RECIP_DEVICE, // requesttype + 0, // value + 0, // index + (void*) dummy, // data + 0, // size + 5 * HZ); // timeout + if (0 != res) { + printk("ecos_usbeth: failed to disable promiscous mode, %d\n", res); + } + + usbeth = (ecos_usbeth*) kmalloc(sizeof(ecos_usbeth), GFP_KERNEL); + if ((ecos_usbeth*)0 == usbeth) { + printk("ecos_usbeth: failed to allocate memory for usbeth data structure\n"); + return (void*) 0; + } + memset(usbeth, 0, sizeof(ecos_usbeth)); + + net = init_etherdev(0, 0); + if ((struct net_device*) 0 == net) { + kfree(usbeth); + printk("ecos_usbeth: failed to allocate memory for net data structure\n"); + return (void*) 0; + } + + usbeth->usb_lock = SPIN_LOCK_UNLOCKED; + usbeth->usb_dev = usbdev; + FILL_BULK_URB(&(usbeth->tx_urb), usbdev, usb_sndbulkpipe(usbdev, 1), + usbeth->tx_buffer, ECOS_USBETH_MAXTU, &ecos_usbeth_tx_callback, (void*) usbeth); + FILL_BULK_URB(&(usbeth->rx_urb), usbdev, usb_rcvbulkpipe(usbdev, 2), + usbeth->rx_buffer, ECOS_USBETH_MAXTU, &ecos_usbeth_rx_callback, (void*) usbeth); + + usbeth->net_dev = net; + usbeth->target_promiscuous = 0; + + net->priv = (void*) usbeth; + net->open = &ecos_usbeth_open; + net->stop = &ecos_usbeth_close; + net->do_ioctl = &ecos_usbeth_ioctl; + net->hard_start_xmit = &ecos_usbeth_start_tx; + net->set_multicast_list = &ecos_usbeth_set_rx_mode; + net->get_stats = &ecos_usbeth_netdev_stats; + net->mtu = 1500; // ECOS_USBETH_MAXTU - 2; + memcpy(net->dev_addr, MAC, 6); + + printk("eCos-based USB ethernet peripheral active at %s\n", net->name); + MOD_INC_USE_COUNT; + return (void*) usbeth; +} + +// disconnect(). +// Invoked after probe() has recognized a device but that device +// has gone away. +static void +ecos_usbeth_disconnect(struct usb_device* usbdev, void* data) +{ + ecos_usbeth* usbeth = (ecos_usbeth*) data; + if (!usbeth) { + printk("ecos_usbeth: warning, disconnecting unconnected device\n"); + return; + } + if (0 != netif_running(usbeth->net_dev)) { + ecos_usbeth_close(usbeth->net_dev); + } + unregister_netdev(usbeth->net_dev); + if (-EINPROGRESS == usbeth->rx_urb.status) { + usb_unlink_urb(&(usbeth->rx_urb)); + } + if (-EINPROGRESS == usbeth->tx_urb.status) { + usb_unlink_urb(&(usbeth->tx_urb)); + } + kfree(usbeth); + MOD_DEC_USE_COUNT; +} + +static struct usb_driver ecos_usbeth_driver = { + name: "ecos_usbeth", + probe: ecos_usbeth_probe, + disconnect: ecos_usbeth_disconnect, +}; + +// init() +// Called when the module is loaded. It just registers the device with +// the generic USB code. Nothing else can really be done until +// the USB code detects that a device has been attached. +int __init +ecos_usbeth_init(void) +{ + printk("eCos USB-ethernet device driver\n"); + return usb_register(&ecos_usbeth_driver); +} + +// exit() +// Called when the module is unloaded. disconnect() will be +// invoked if appropriate. +void __exit +ecos_usbeth_exit(void) +{ + usb_deregister(&ecos_usbeth_driver); +} + +module_init(ecos_usbeth_init); +module_exit(ecos_usbeth_exit);
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/include/usbs_eth.h @@ -0,0 +1,375 @@ +#ifndef CYGONCE_USBS_ETH_H +#define CYGONCE_USBS_ETH_H_ +//========================================================================== +// +// include/usbs_eth.h +// +// Description of the USB slave-side ethernet support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// Purpose: +// Description: USB slave-side ethernet support +// +// +//####DESCRIPTIONEND#### +//========================================================================== + +#ifdef __cplusplus +extern "C" { +#endif + +// +// The primary purpose of the USB slave-side ethernet code is to +// provide an ethernet service for the host. Essentially this means +// the following: +// +// 1) the host can transmit an ethernet frame to the USB peripheral. +// This frame is received by the code in this package and then +// passed up to higher-level code for processing. Typically the +// frame will originate from a TCP/IP stack running inside the +// host, and the higher-level code will forward the frame via a +// real ethernet chip or some other ethernet-style device. +// +// 2) higher-level code will provide ethernet frames to be sent to +// the host, usually to a TCP/IP stack running on the host. The +// exact source of the ethernet frame is not known. +// +// 3) the host may initiate a number of control operations, for +// example it may request the MAC address or it may want to +// control the filtering mode (e.g. enable promiscuous mode). +// +// 4) there are USB control-related operations, for example actions +// to be taken when the peripheral is disconnected from the +// bus or when the host wants to disable the ethernet interface. +// +// It is possible to develop a USB ethernet peripheral that does not +// involve a TCP/IP stack inside the peripheral, in fact that is the +// most common implementation. Instead a typical peripheral would +// involve a USB port, an ethernet port, and a cheap microcontroller +// just powerful enough to forward packets between the two. The eCos +// USB code can be used in this way, and the primary external +// interface provides enough functionality for this to work. +// +// +---------------+ ethernet +// +----+ | | | +// | | USB | app | | +// |host|---------| / \ |-----o +// | | | / \ | | +// +----+ | USB-eth eth | | +// +---------------+ | +// USB peripheral +// +// Note that the USB-ethernet code does not know anything about the +// real ethernet device or what the application gets up to, it just +// provides an interface to the app. The above represents just one +// possible use for a USB-ethernet device. +// +// Also worth mentioning: when the host TCP/IP stack requests the MAC +// address USB-eth would normally respond with the MAC address for the +// real ethernet device. That way things like host-side DHCP should +// just work. +// +// Alternatively for some applications it is desirable to run a TCP/IP +// stack inside the peripheral as well as on the host. This makes +// things a fair bit more complicated, something like this. +// +// +---------------+ +// | app | +// | | | ethernet +// +----+ | | | | +// | | USB | TCP/IP | | +// |host|---------| / \ |-----o +// | | | / \ | | +// +----+ | USB-eth eth | | +// +---------------+ | +// USB peripheral +// +// +// Usually this will involve enabling the bridge code in the TCP/IP +// stack, or possibly performing some sort of bridging below the +// TCP/IP stack. One way of getting things to work is to view the +// USB connection as a small ethernet segment with just two +// attached machines, the host and the peripheral. The two will +// need separate MAC addresses, in addition to the MAC address +// for the real ethernet device. This way the bridge code +// sees things the way it expects. +// +// There will still be some subtle differences between a setup like +// this and a conventional ethernet bridge, mainly because there +// is a host-side TCP/IP stack which can perform control operations. +// For example the host stack may request that USB-eth go into +// promiscuous mode. A conventional ethernet bridge just deals +// with ethernet segments and does not need to worry about +// control requests coming in from one of the segments. +// +// It is not absolutely essential that there is another network. +// However without another network this setup would look to the host +// like an ethernet segment with just two machines attached to it, the +// host itself and the USB peripheral, yet it still involves all the +// complexities of ethernet such as broadcast masks and IP subnets. +// Anything along these lines is likely to prove somewhat confusing, +// and the USB peripheral should probably act like some other class +// of USB device instead. +// +// One special setup has the host acting as a bridge to another +// network, rather than the peripheral. This might make sense for +// mobile peripherals such as PDA's, as a way of connecting the +// peripheral to an existing LAN without needing a LAN adapter. +// Enabling bridging in the host may be a complex operation, limiting +// the applicability of such a setup. +// +// This package will only implement the eCos network driver interface +// if explicitly enabled. The package-specific interface is always +// provided, although trying to mix and match the two may lead to +// terrible confusion: once the network driver is active nothing else +// should use the lower-level USB ethernet code. However application +// code is responsible for initializing the package, and specifically +// for providing details of the USB endpoints that should be used. +// +// The package assumes that it needs to provide just one +// instantiation. Conceivably there may be applications where it makes +// sense for a USB peripheral to supply two separate ethernet devices +// to the host, but that would be an unusual setup. Also a peripheral +// might provide two or more USB slave ports to allow multiple hosts +// to be connected, with a separate USB-ethernet instantiation for +// each port, but again that would be an unusual setup. Applications +// which do require more than one instantiation are responsible +// for doing this inside the application code. + +// The public interface depends on configuration options. +#include <pkgconf/io_usb_slave_eth.h> + +// Define the interface in terms of eCos data types. +#include <cyg/infra/cyg_type.h> + +// The generic USB support +#include <cyg/io/usb/usbs.h> + +// Network driver definition, to support cloning of usbs_eth_netdev0 +#ifdef CYGPKG_USBS_ETHDRV +# include <netdev.h> +#endif + +// ---------------------------------------------------------------------------- +// Maximum transfer size. This is not specified by io/eth. It can be +// determined from <netinet/if_ether.h> but the TCP/IP stack may not +// be loaded so that header file cannot be used. +// +// Some (most?) USB implementations have implementation problems. For +// example the SA11x0 family cannot support transfers that are exact +// multiples of the 64-byte USB bulk packet size, instead it is +// necessary to add explicit size information. This can be encoded +// conveniently at the start of the buffer. +// +// So the actual MTU consists of: +// 1) a 1500 byte payload +// 2) the usual ethernet header with a six-byte source MAC +// address, a six-byte destination MAC address, and a +// two-byte protocol or length field, for a total header +// size of 14 bytes. +// 3) an extra two bytes of size info. +// +// For a total of 1516 bytes. +#define CYGNUM_USBS_ETH_MAX_FRAME_SIZE 1514 +#define CYGNUM_USBS_ETH_MAXTU (CYGNUM_USBS_ETH_MAX_FRAME_SIZE + 2) + +// Although the minimum ethernet frame size is 60 bytes, this includes +// padding which is not needed when transferring over USB. Hence the +// actual minimum is just the 14 byte ethernet header plus two bytes +// for the length. +#define CYGNUM_USBS_ETH_MIN_FRAME_SIZE 14 +#define CYGNUM_USBS_ETH_MINTU (CYGNUM_USBS_ETH_MIN_FRAME_SIZE + 2) + +// ---------------------------------------------------------------------------- +// This data structure serves two purposes. First, it keeps track of +// the information needed by the low-level USB ethernet code, for +// example which endpoints should be used for incoming and outgoing +// packets. Second, if the support for the TCP/IP stack is enabled +// then there are additional fields to support that (e.g. for keeping +// track of statistics). +// +// Arguably the two uses should be separated into distinct data +// structures. That would make it possible to instantiate multiple +// low-level USB-ethernet devices but only have a network driver for +// one of them. Achieving that flexibility would require some extra +// indirection, affecting performance and code-size, and it is not +// clear that that flexibility would ever prove useful. For now having +// a single data structure seems more appropriate. + +typedef struct usbs_eth { + + // What endpoints should be used for communication? + usbs_control_endpoint* control_endpoint; + usbs_rx_endpoint* rx_endpoint; + usbs_tx_endpoint* tx_endpoint; + + // Is the host ready to receive packets? This state is determined + // largely by control packets sent from the host. It can change at + // DSR level. + volatile cyg_bool host_up; + + // Has the host-side set promiscuous mode? This is relevant to the + // network driver which may need to do filtering based on the MAC + // address and host-side promiscuity. + volatile cyg_bool host_promiscuous; + + // The host MAC address. This is the address supplied to the + // host's TCP/IP stack and filled in by the init function. There + // is no real hardware to extract the address from. + unsigned char host_MAC[6]; + + // Needed for callback operations. + void (*tx_callback_fn)(struct usbs_eth*, void*, int); + void* tx_callback_arg; + + void (*rx_callback_fn)(struct usbs_eth*, void*, int); + void* rx_callback_arg; + + // RX operations just block if the host is not connected, resuming + // when a connection is established. This means saving the buffer + // pointer so that when the host comes back up the rx operation + // proper can start. This is not quite consistent because if the + // connection breaks while an RX is in progress there will be a + // callback with an error code whereas an RX on a broken + // connection just blocks, but this does fit neatly into an + // event-driven I/O model. + unsigned char* rx_pending_buf; + +#ifdef CYGPKG_USBS_ETHDRV + // Has the TCP/IP stack brought up this interface yet? + cyg_bool ecos_up; + + // Is there an ongoing receive? Cancelling a receive operation + // during a stop() may be difficult, and a stop() may be followed + // immediately by a restart. + cyg_bool rx_active; + + // The eCos-side MAC. If the host and the eCos stack are to + // communicate then they must be able to address each other, i.e. + // they need separate addresses. Again there is no real hardware + // to extract the address from so it has to be supplied by higher + // level code via e.g. an ioctl(). + unsigned char ecos_MAC[6]; + + // SNMP statistics +# ifdef CYGFUN_USBS_ETHDRV_STATISTICS + unsigned int interrupts; + unsigned int tx_count; + unsigned int rx_count; + unsigned int rx_short_frames; + unsigned int rx_too_long_frames; +# endif + + // The need for a receive buffer is unavoidable for now because + // the network driver interface does not support pre-allocating an + // mbuf and then passing it back to the stack later. Ideally the + // rx operation would read a single USB packet, determine the + // required mbuf size from the 2-byte header, copy the initial + // data, and then read more USB packets. Alternatively, a + // 1516 byte mbuf could be pre-allocated and then the whole + // transfer could go there, potentially wasting some mbuf space. + // None of this is possible at present. + unsigned char rx_buffer[CYGNUM_USBS_ETH_MAXTU]; + cyg_bool rx_buffer_full; + + // It should be possible to eliminate the tx buffer once the + // USB driver supports refill functions. + unsigned char tx_buffer[CYGNUM_USBS_ETH_MAXTU]; + cyg_bool tx_buffer_full; + cyg_bool tx_done; + unsigned long tx_key; + + // Prevent recursion send()->tx_done()->can_send()/send() + cyg_bool tx_in_send; +#endif + +} usbs_eth; + +// The package automatically instantiates one USB ethernet device. +extern usbs_eth usbs_eth0; + +// ---------------------------------------------------------------------------- +// If the network driver option is enabled then the package also +// provides a single cyg_netdevtab_entry. This is exported so that +// application code can clone the entry. +#ifdef CYGPKG_USBS_ETHDRV +extern cyg_netdevtab_entry_t usbs_eth_netdev0; +#endif + +// ---------------------------------------------------------------------------- +// A C interface to the low-level USB code. + +// Initialize the USBS-eth support for a particular usbs_eth device. +// This associates a usbs_eth structure with specific endpoints. +extern void usbs_eth_init(usbs_eth*, usbs_control_endpoint*, usbs_rx_endpoint*, usbs_tx_endpoint*, unsigned char*); + +// Start an asynchronous transmit of a single buffer of up to +// CYGNUM_USBS_ETH_MAXTU bytes. This buffer should contain a 2-byte +// size field, a 14-byte ethernet header, and upto 1500 bytes of +// payload. When the transmit has completed the callback function (if +// any) will be invoked with the specified pointer. NOTE: figure out +// what to do about error reporting +extern void usbs_eth_start_tx(usbs_eth*, unsigned char*, void (*)(usbs_eth*, void*, int), void*); + +// Start an asynchronous receive of an ethernet packet. The supplied +// buffer should be at least CYGNUM_USBS_ETH_MAXTU bytes. When a +// complete ethernet frame has been received or when some sort of +// error occurs the callback function will be invoked. The third +// argument +extern void usbs_eth_start_rx(usbs_eth*, unsigned char*, void (*)(usbs_eth*, void*, int), void*); + +// The handler for application class control messages. The init call +// will install this in the control endpoint by default. However the +// handler is fairly dumb: it assumes that all application control +// messages are for the ethernet interface and does not bother to +// check the control message's destination. This is fine for simple +// USB ethernet devices, but for any kind of multi-function peripheral +// higher-level code will have to perform multiplexing and invoke this +// handler only when appropriate. +extern usbs_control_return usbs_eth_class_control_handler(usbs_control_endpoint*, void*); + +// Similarly a handler for state change messages. Installing this +// means that the ethernet code will have sufficient knowledge about +// the state of the USB connection for simple ethernet-only +// peripherals, but not for anything more complicated. In the latter +// case higher-level code will need to keep track of which +// configuration, interfaces, etc. are currently active and explicitly +// enable or disable the ethernet device using the functions below. +extern void usbs_eth_state_change_handler(usbs_control_endpoint*, void*, usbs_state_change, int); +extern void usbs_eth_disable(usbs_eth*); +extern void usbs_eth_enable(usbs_eth*); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // CYGONCE_USBS_ETH_H_
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/src/usbseth.c @@ -0,0 +1,306 @@ +//========================================================================== +// +// usbseth.c +// +// Support for USB-ethernet devices, slave-side. +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> +#include <cyg/infra/cyg_trac.h> +#include <cyg/infra/diag.h> +#include <cyg/hal/hal_arch.h> +#include <cyg/infra/diag.h> +#include <cyg/hal/drv_api.h> + +#include <pkgconf/io_usb_slave_eth.h> + +#define __ECOS 1 +#include <cyg/io/usb/usbs_eth.h> + +#ifdef CYGPKG_USBS_ETHDRV +#include <netdev.h> +#include <eth_drv.h> +#endif + +// ---------------------------------------------------------------------------- +// Static data. +// +// usbs_eth0 contains the per-device data, both the low-level data +// such as which endpoints to use and the network-driver data such as +// SNMP statistics. If this package is loaded then the assumption +// is that there should be at least one USB-ethernet device. Additional +// ones can be instantiated in application code if necessary. A call +// to usbs_eth_init() is required for initialization. +usbs_eth usbs_eth0; + +// ---------------------------------------------------------------------------- +// Initialization. This should be called explicitly by application code +// at an appropriate point in the system startup. +void +usbs_eth_init(usbs_eth* eth, usbs_control_endpoint* ctrl, usbs_rx_endpoint* rx, usbs_tx_endpoint* tx, unsigned char* mac) +{ + eth->control_endpoint = ctrl; + eth->rx_endpoint = rx; + eth->tx_endpoint = tx; + eth->host_up = false; + eth->host_promiscuous = false; + memcpy(eth->host_MAC, mac, 6); + eth->rx_pending_buf = (unsigned char*) 0; + + // Install default handlers for some messages. Higher level code + // may override this. + ctrl->state_change_fn = &usbs_eth_state_change_handler; + ctrl->state_change_data = (void*) eth; + ctrl->class_control_fn = &usbs_eth_class_control_handler; + ctrl->class_control_data = (void*) eth; + +#ifdef CYGPKG_USBS_ETHDRV + eth->ecos_up = false; + eth->rx_active = false; +# ifdef CYGFUN_USBS_ETHDRV_STATISTICS + eth->interrupts = 0; + eth->tx_count = 0; + eth->rx_count = 0; +# endif + eth->rx_buffer_full = false; + eth->tx_in_send = false; + eth->tx_buffer_full = false; + eth->tx_done = false; +#endif +} + + +// ---------------------------------------------------------------------------- +// Generic transmit and receive operations. These can be called +// explicitly by application code, or implicitly via the eCos ethernet +// device driver code in usbsethdrv.c. These two modes of operation +// should not be mixed since the routines do not perform any +// synchronization themselves, instead they rely on higher level code. + +// Packet transmission. The exported function is usbs_eth_start_tx(), +// which can be invoked from thread context or DSR context. The +// supplied buffer must already be in a form that can be transmitted +// directly out of the USB endpoint with no further processing +// (although it is necessary to extract the size information from the +// buffer). +// +// When the underlying USB transfer has completed the USB code will invoke +// usbs_eth_tx_callback(), usually in DSR context although possibly in +// thread context depending on the specific USB implementation. The +// underlying USB driver may have had to do some padding so the amount +// transferred may be slightly greater than requested. + +static void +usbs_eth_tx_callback(void* usbs_callback_arg, int size) +{ + usbs_eth* eth = (usbs_eth*) usbs_callback_arg; + CYG_ASSERT( (size < 0) || (size >= CYGNUM_USBS_ETH_MINTU), "returned size must be valid."); + (*eth->tx_callback_fn)(eth, eth->tx_callback_arg, size); +} + +void +usbs_eth_start_tx(usbs_eth* eth, unsigned char* buf, void (*callback_fn)(usbs_eth*, void*, int), void* callback_arg) +{ + int size; + cyg_bool address_ok = false; + static const unsigned char broadcast_mac[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + + size = buf[0] + (buf[1] << 8); + CYG_ASSERT( (size < 0) || ((size >= CYGNUM_USBS_ETH_MIN_FRAME_SIZE) && (size <= CYGNUM_USBS_ETH_MAX_FRAME_SIZE)), \ + "ethernet frame size constraints must be observed"); + + if ((0 == memcmp(buf + 2, eth->host_MAC, 6)) || + (0 == memcmp(buf + 2, broadcast_mac, 6))) { + address_ok = true; + } + + // The following checks involve data that can change as a result + // of control operations, so it is necessary to synchronize with + // those. The control operations will typically run at DSR level + // so a DSR lock has to be used. + + cyg_drv_dsr_lock(); + if (eth->host_up && (address_ok || eth->host_promiscuous)) { + + eth->tx_callback_fn = callback_fn; + eth->tx_callback_arg = callback_arg; + eth->tx_endpoint->buffer = buf; + eth->tx_endpoint->buffer_size = size + 2; + eth->tx_endpoint->complete_fn = &usbs_eth_tx_callback; + eth->tx_endpoint->complete_data = (void*) eth; + (*(eth->tx_endpoint->start_tx_fn))(eth->tx_endpoint); + + } else { + // Packets not intended for the host can be discarded quietly. + // A broken connection needs to be reported. + (*callback_fn)(eth, callback_arg, eth->host_up ? size : -EPIPE); + } + cyg_drv_dsr_unlock(); +} + +// Packet reception. This simply involves starting a transfer for +// up to the maximum ethernet frame size. The lower-level USB code +// will detect the end of the transfer. The exported function is +// usbs_eth_start_rx(). +static void +usbs_eth_rx_callback(void* usbs_callback_arg, int size) +{ + usbs_eth* eth = (usbs_eth*) usbs_callback_arg; + + CYG_ASSERT( (size <= 0) || ((size >= CYGNUM_USBS_ETH_MINTU) && (size <= CYGNUM_USBS_ETH_MAXTU)), \ + "ethernet frame size constraints must be observed"); + + (*eth->rx_callback_fn)(eth, eth->rx_callback_arg, size); +} + +void +usbs_eth_start_rx(usbs_eth* eth, unsigned char* buf, void (*callback_fn)(usbs_eth*, void*, int), void* callback_arg) +{ + eth->rx_callback_fn = callback_fn; + eth->rx_callback_arg = callback_arg; + + cyg_drv_dsr_lock(); + if (eth->host_up) { + eth->rx_endpoint->buffer = buf; + eth->rx_endpoint->buffer_size = CYGNUM_USBS_ETH_MAXTU; + eth->rx_endpoint->complete_fn = &usbs_eth_rx_callback; + eth->rx_endpoint->complete_data = (void*) eth; + (*(eth->rx_endpoint->start_rx_fn))(eth->rx_endpoint); + } else { + CYG_ASSERT( (void*) 0 == eth->rx_pending_buf, "No RX operation should be in progress"); + eth->rx_pending_buf = buf; + } + cyg_drv_dsr_unlock(); +} + +// ---------------------------------------------------------------------------- +// Control operations. The host may send two types of application-specific +// control messages, one to get the MAC address and one to enable/disable +// promiscuous mode on the host side. This callback will typically be invoked +// in DSR context. + +// These constants need to be shared somehow with the driver in ../host/, +// but if some variant of that driver becomes part of the Linux kernel +// then its sources must be self-contained with no dependencies on +// eCos sources or headers. Hence a duplicate definition for now. +#define USBS_ETH_CONTROL_GET_MAC_ADDRESS 0x01 +#define USBS_ETH_CONTROL_SET_PROMISCUOUS_MODE 0x02 + +usbs_control_return +usbs_eth_class_control_handler(usbs_control_endpoint* endpoint, void* callback_data) +{ + usbs_control_return result = USBS_CONTROL_RETURN_STALL; + + usbs_eth* eth = (usbs_eth*) callback_data; + usb_devreq* devreq = (usb_devreq*) endpoint->control_buffer; + int size = (devreq->length_hi << 8) + devreq->length_lo; + + CYG_ASSERT(endpoint == eth->control_endpoint, "USB ethernet control messages correctly routed"); + + if (USBS_ETH_CONTROL_GET_MAC_ADDRESS == devreq->request) { + // This should be an IN operation for at least six bytes. + if ((size >= 6) && + (USB_DEVREQ_DIRECTION_IN == (devreq->type & USB_DEVREQ_DIRECTION_MASK))) { + + endpoint->buffer = eth->host_MAC; + endpoint->buffer_size = 6; + result = USBS_CONTROL_RETURN_HANDLED; + } + // Otherwise drop through with a return value of STALL + + } else if (USBS_ETH_CONTROL_SET_PROMISCUOUS_MODE == devreq->request) { + // The length should be 0, no more data is expected by either side. + if (0 == size) { + // The new promiscuity mode is encoded in value_lo; + eth->host_promiscuous = devreq->value_lo; + result = USBS_CONTROL_RETURN_HANDLED; + } + } + + return result; +} + +// State changes. As far as the ethernet code is concerned, if there +// is a change to CONFIGURED state then the device has come up, +// otherwise if there is a change from CONFIGURED state it has gone +// down. All other state changes are irrelevant. +void +usbs_eth_state_change_handler(usbs_control_endpoint* endpoint, void* callback_data, usbs_state_change change, int old_state) +{ + usbs_eth* eth = (usbs_eth*) callback_data; + CYG_ASSERT(endpoint == eth->control_endpoint, "USB ethernet state changes correctly routed"); + + if (USBS_STATE_CHANGE_CONFIGURED == change) { + if (USBS_STATE_CONFIGURED != old_state) { + usbs_eth_enable(eth); + } + } else if ((USBS_STATE_CHANGE_RESUMED == change) && (USBS_STATE_CONFIGURED == (USBS_STATE_MASK & old_state))) { + usbs_eth_enable(eth); + } else if (eth->host_up) { + usbs_eth_disable(eth); + } +} + +// Disabling the ethernet device means clearing the host_up flag. +// This will block future transmits and receives but not any +// that are currently underway. +void +usbs_eth_disable(usbs_eth* eth) +{ + eth->host_up = false; +} + +// Enabling the ethernet device means setting the host_up flag and +// possibly activating a pending rx operation. +void +usbs_eth_enable(usbs_eth* eth) +{ + if (!eth->host_up) { + eth->host_up = true; + eth->host_promiscuous = false; + if ((void*) 0 != eth->rx_pending_buf) { + eth->rx_endpoint->buffer = eth->rx_pending_buf; + eth->rx_endpoint->buffer_size = CYGNUM_USBS_ETH_MAXTU; + eth->rx_endpoint->complete_fn = &usbs_eth_rx_callback; + eth->rx_endpoint->complete_data = (void*) eth; + eth->rx_pending_buf = (void*) 0; + (*(eth->rx_endpoint->start_rx_fn))(eth->rx_endpoint); + } + } +} +
new file mode 100644 --- /dev/null +++ b/packages/io/usb/eth/slave/current/src/usbsethdrv.c @@ -0,0 +1,607 @@ +//========================================================================== +// +// usbethdrv.c +// +// Network device driver for USB-ethernet devices. +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_arch.h> +#include <cyg/infra/diag.h> +#include <cyg/hal/drv_api.h> + +#define __ECOS 1 +#include <netdev.h> +#include <eth_drv.h> +#include <eth_drv_stats.h> + +#include <pkgconf/io_usb_slave_eth.h> +#include <cyg/io/usb/usbs_eth.h> + +// ---------------------------------------------------------------------------- +// The network driver data structure. +ETH_DRV_SC(usbs_eth_sc0, + (void*) &usbs_eth0, + CYGDAT_USBS_ETHDRV_NAME, + usbs_ethdrv_start, + usbs_ethdrv_stop, + usbs_ethdrv_ioctl, + usbs_ethdrv_can_send, + usbs_ethdrv_send, + usbs_ethdrv_recv, + usbs_ethdrv_deliver, + usbs_ethdrv_poll, + usbs_ethdrv_intvector); + +NETDEVTAB_ENTRY(usbs_eth_netdev0, + "usbs_eth0", + usbs_ethdrv_init, + &usbs_eth_sc0); + +// ---------------------------------------------------------------------------- +// Statics gathering. The following macro can be used to increment a +// statistic without having to use a #ifdef for the statistics +// configuration option everywhere. +#ifdef CYGFUN_USBS_ETHDRV_STATISTICS +# define INCR_STAT(a) \ + CYG_MACRO_START \ + (a) += 1; \ + CYG_MACRO_END +#else +# define INCR_STAT(a) CYG_EMPTY_STATEMENT +#endif + +// Various constants related to SNMP statistics. It is not clear +// what these are all for. +#ifdef CYGFUN_USBS_ETHDRV_STATISTICS +# define CYGDAT_USBS_ETHDRV_DESCRIPTION "eCos USB ethernet device" +#endif +// ---------------------------------------------------------------------------- +// Utility functions. +// +// The TCP/IP stack works in terms of scatter/gather buffers. USB tends to +// involve DMA operations so it is more convenient to work in terms of +// 1514 byte flat buffers. Actually, the first two bytes of the buffer +// are used to hold the ethernet frame size to work around restrictions +// with certain hardware implementations of USB that may be unable to +// transfer certain packet sizes. + +static bool +scatter(unsigned char* buf, struct eth_drv_sg* sg, int sg_len) +{ + unsigned int size; + + size = buf[0] | (buf[1] << 8); + buf++; buf++; + + CYG_ASSERT((size >= CYGNUM_USBS_ETH_MIN_FRAME_SIZE) && (size <= CYGNUM_USBS_ETH_MAX_FRAME_SIZE),\ + "ethernet frame size limits must be observed"); + + while ((size > 0) && (sg_len > 0)) { + if (size > sg->len) { + memcpy((void*) sg->buf, buf, sg->len); + buf += sg->len; + size -= sg->len; + sg++; + sg_len--; + } else { + memcpy((void*) sg->buf, buf, size); + size = 0; + } + } + + return 0 == size; +} + +static bool +gather(unsigned char* buf, unsigned int size, struct eth_drv_sg* sg, int sg_len) +{ + unsigned int left = size; + unsigned char* base = buf; + + buf++; buf++; + while ((left > 0) && (sg_len > 0)) { + if (left > sg->len) { + memcpy(buf, (void*) sg->buf, sg->len); + buf += sg->len; + left -= sg->len; + sg++; + sg_len--; + } else { + memcpy(buf, (void*) sg->buf, left); + left = 0; + } + } + size = size - left; + base[0] = size & 0x00FF; + base[1] = (size >> 8) & 0x00FF; + + return 0 == left; +} + + +// ---------------------------------------------------------------------------- +// usbs_ethdrv_init() +// +// This function is called during system initialization to decide +// whether or not this particular network device is usable. For +// USB-ethernet this is problematical, the device is only really +// usable once both sides have come up. The typical sequence +// of events is something like: +// +// 1) the eCos peripheral is powered up. Static constructors are +// run resulting in basic initialization. +// +// 2) the eCos TCP/IP stack initialization happens. Roughly in +// parallel the eCos USB slave side is initialized as well, +// i.e. enumeration data is supplied to control endpoints, +// endpoints are associated with application classes, and so +// on. The relative order of TCP/IP and USB initialization is +// not particularly important. +// +// It is the TCP/IP stack's initialization code that will +// invoke usbs_eth_init(). +// +// 3) host-side USB detects that the eCos peripheral has been +// connected or powered up. It goes through the enumeration +// process and will end up loading a host-side network driver. +// This connects to the eCos-side USB ethernet code to +// e.g. obtain the MAC address. +// +// 4) when the host-side is ready, the eCos side can be brought up. +// The required call is (sc->funs->eth_drv->init)(sc, enaddr) +// +// In practice it is easier for now to invoke the init() function +// immediately. There are not going to be any incoming packets +// until the host is ready, and can_send() can just return false +// for the time being. +// +// Invoked in: thread context only +// ---------------------------------------------------------------------------- + +static bool +usbs_ethdrv_init(struct cyg_netdevtab_entry* ndp) +{ + struct eth_drv_sc* sc = (struct eth_drv_sc*)(ndp->device_instance); + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + + (*sc->funs->eth_drv->init)(sc, eth->ecos_MAC); + return true; +} + +// ---------------------------------------------------------------------------- +// The receive process that is used to transfer a received ethernet +// packet into the stack. The calling sequence is somewhat convoluted. +// It started off as: +// +// 1) Ethernet hw ISR invoked by hardware, schedules its own +// hw_dsr(), and blocks further interrupts in the ethernet chip +// 2) hw_dsr() calls generic eth_drv_dsr() from io/eth common package +// 3) eth_drv_dsr() interacts with the TCP/IP stack and allocates mbufs +// (typically, the TCP/IP stack might not be in use) +// 4) eth_drv_dsr() calls usbs_eth_recv() to transfer the data to mbufs +// 5) eth_drv_dsr() returns to hw_dsr() which reenables interrupts +// 6) hw_dsr() completes and everything can proceed. +// +// The problem with this is that the whole ethernet packet gets copied +// inside a DSR, affecting dispatch latency (but not interrupt latency). +// This is bad. Hence there is an alternative route involving a separate +// thread in the TCP/IP stack. +// +// 1) Ethernet hw ISR runs as before, scheduling hw_dsr() +// 2) hw_dsr() calls up into eth_drv_dsr() +// 3) eth_drv_dsr() wakes up a thread inside the TCP/IP stack +// 4) eth_drv_dsr() returns to hw_dsr(), which performs no further +// processing. Ethernet chip interrupts remain disabled. +// 5) The TCP/IP thread ends up calling hw_deliver(). This should take +// care of any pending activity. For every buffered packet there should +// be a call to a generic recv() function which then goes back into +// the driver-specific recv() function. +// +// The advantage is that ethernet packet copying now happens at thread +// level rather than DSR level so thread priorities can be used to +// schedule things. +// +// USB-ethernet does not interact directly with any hardware, instead +// it just passes information to lower levels of USB code. The reception +// process is started by usbs_ethdrv_start() when the TCP/IP stack brings +// up the interface. +// +// When the USB transfer has completed a callback will be invoked, at +// DSR level. Assuming the transfer went ok, the callback will invoke +// eth_drv_dsr() to inform the higher level code. +// +// The deliver function can check the state of the buffer +// and go through the sc->funs->eth_drv->recv()/recv() sequence +// to transfer the data into the stack. +// +// usbs_ethdrv_recv() does a scatter from the internal buffer into the +// mbuf, thus freeing up the buffer. This allows it to start another +// receive, +// +// Synchronisation involves the scheduler lock because the recv +// callback is invoked inside a DSR. + +static void usbs_ethdrv_halted_callback(void*, int); + +static void +usbs_ethdrv_recv_callback(usbs_eth* eth, void* callback_data, int size) +{ + cyg_bool resubmit = true; + + struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data; + CYG_ASSERT( eth == (usbs_eth*)(sc->driver_private), "USB and TCP/IP worlds need to be consistent"); + + INCR_STAT(eth->interrupts); + if (!eth->ecos_up) { + // This message should just be discarded since the eCos TCP/IP + // stack is not expecting anything from this interface. + // Reception will resume when the interface comes back up. + eth->rx_active = false; + resubmit = false; + } else if (size < 0) { + // An error has occurred. The likely possibilities are: + // -EPIPE: connection to the host has been broken + // -EAGAIN: the endpoint is haltedn + // -EMSGSIZE: bogus message from host + // -EIO: other + + if (-EAGAIN == size) { + // EAGAIN should be handled by waiting for the endpoint to be reset. + resubmit = false; + usbs_start_rx_endpoint_wait(eth->rx_endpoint, &usbs_ethdrv_halted_callback, (void*) sc); + } else if (-EMSGSIZE == size) { + // Do nothing for now + } else { + // EPIPE should be resubmitted, the usbseth.c will use the + // pending rx support. EIO could mean anything. + } + } else if (0 == size) { + // The endpoint is no longer halted. Just do the resubmit at + // the end. + } else { + // A packet has been received. Now do a size sanity check + // based on the first two bytes. + int real_size = eth->rx_buffer[0] + (eth->rx_buffer[1] << 8); + if (real_size < CYGNUM_USBS_ETH_MIN_FRAME_SIZE) { + INCR_STAT(eth->rx_short_frames); + } else if (real_size > CYGNUM_USBS_ETH_MAX_FRAME_SIZE) { + INCR_STAT(eth->rx_too_long_frames); + } else { + // The packet appears to be valid. Inform higher level + // code and mark the buffer as in use. + resubmit = false; + eth->rx_buffer_full = true; + eth->rx_active = false; + eth_drv_dsr(0, 0, (cyg_addrword_t) sc); + } + } + + if (resubmit) { + eth->rx_active = true; + usbs_eth_start_rx(eth, eth->rx_buffer, &usbs_ethdrv_recv_callback, callback_data); + } +} + +// Another callback, used to wait while an endpoint is halted. +static void +usbs_ethdrv_halted_callback(void* callback_data, int size) +{ + struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data; + usbs_ethdrv_recv_callback((usbs_eth*) sc->driver_private, callback_data, 0); +} + +// Start a receive operation. It is not possible to abort an existing +// rx operation, so a valid sequence of events is: start, rx ongoing, +// stop, restart. The rx_active field is used to keep track of whether +// or not there is still a receive in progress. The receive callback +// will just discard incoming data if the eCos stack is not currently +// running. +static void +usbs_ethdrv_start_recv(struct eth_drv_sc* sc, usbs_eth* eth) +{ + cyg_drv_dsr_lock(); + if (!eth->rx_active) { + eth->rx_active = true; + usbs_eth_start_rx(eth, eth->rx_buffer, &usbs_ethdrv_recv_callback, (void*) sc); + } + cyg_drv_dsr_unlock(); +} + +// This is invoked from the delivery thread when a valid buffer +// has been received. The buffer should be scattered into the +// supplied list, then another receive should be started. + +static void +usbs_ethdrv_recv(struct eth_drv_sc* sc, + struct eth_drv_sg* sg_list, int sg_len) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + + CYG_ASSERT( eth->rx_buffer_full, "This function should only be called when there is a buffer available"); + (void) scatter(eth->rx_buffer, sg_list, sg_len); + eth->rx_buffer_full = false; + eth->rx_active = true; + usbs_eth_start_rx(eth, eth->rx_buffer, &usbs_ethdrv_recv_callback, (void*) sc); +} + +// ---------------------------------------------------------------------------- +// Now for the transmit process. +// +// When an application thread writes down a socket the data gets moved +// into mbufs, and then passed to the appropriate device driver - which +// may or may not be able to process it immediately. There is also a +// timeout thread within the TCP/IP to handle retransmits etc. +// +// The stack will start by calling usbs_ethdrv_can_send() to determine +// whether or not the driver can accept the packet. For the purposes +// of the USB-ethernet driver this is true provided both host +// and target are up and there is a spare buffer available. +// +// If the usbs_eth_can_send() returns true then there will be a call +// to usbs_ethdrv_send(). This gathers the data into a single +// buffer. If there is no transmit in progress yet then one is started. +// +// At some point the packet will have been transmitted and a callback +// gets invoked. This needs to call eth_drv_dsr(), waking up the +// delivery thread. The deliver() function can then check which +// transmissions have completed and inform the higher level code +// via sc->funs->eth_drv->tx_done(). The buffer can be re-used at +// that point. + +static void +usbs_ethdrv_send_callback(usbs_eth* eth, void* callback_data, int size) +{ + struct eth_drv_sc* sc = (struct eth_drv_sc*) callback_data; + CYG_ASSERT( eth == (usbs_eth*)(sc->driver_private), "USB and TCP/IP worlds need to be consistent"); + + INCR_STAT(eth->interrupts); + + // There are a variety of possible error codes. -EAGAIN indicates + // that the endpoint is stalled. -EPIPE indicates that the + // connection to the host has been lost. These are not really + // particularly interesting. Whatever happens the buffer + // must be cleared and higher-level code informed so that + // the mbufs can be released. + if (size > 0) { + INCR_STAT(eth->tx_count); + } + eth->tx_done = true; + eth_drv_dsr(0, 0, (cyg_addrword_t) sc); +} + +// Is it possible to send an ethernet frame? This requires +// an empty buffer, i.e. there should be no existing +// transmit in progress. It also requires that the host +// is connected and that the endpoint is not currently halted. +static int +usbs_ethdrv_can_send(struct eth_drv_sc* sc) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + return eth->host_up && !eth->tx_buffer_full && !eth->tx_endpoint->halted; +} + +// Actually start a packet transmission. This means collecting +// all the data into a single buffer and then invoking the +// lower-level code. The latter may discard the packet immediately +// if the MAC is not appropriate: it would be more efficient to +// catch that here, especially for large packets, but the check +// has to happen inside the lower-level code anyway in case +// that is being invoked directly rather than via the driver. +// +// There is a possible recursion problem, +// send->start_tx->tx_done->can_send->send, which is guarded +// against using the tx_in_send flag. + +static void +usbs_ethdrv_send(struct eth_drv_sc* sc, + struct eth_drv_sg* sgl_list, int sg_len, int total_len, + unsigned long key) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + + CYG_ASSERT( 0 == eth->tx_in_send, "send() should not be invoked recursively"); + CYG_ASSERT( total_len <= CYGNUM_USBS_ETH_MAX_FRAME_SIZE, "ethernet maximum frame size should be observed"); + CYG_ASSERT( CYGNUM_USBS_ETH_MIN_FRAME_SIZE <= total_len, "ethernet minimum frame size should be observed"); + + eth->tx_in_send = true; + CYG_ASSERT( !eth->tx_buffer_full, "the transmit buffer should be empty"); + gather(eth->tx_buffer, CYGNUM_USBS_ETH_MAX_FRAME_SIZE, sgl_list, sg_len); + eth->tx_buffer_full = true; + eth->tx_done = false; + eth->tx_key = key; + usbs_eth_start_tx(eth, eth->tx_buffer, &usbs_ethdrv_send_callback, (void*) sc); + eth->tx_in_send = false; +} + +// ---------------------------------------------------------------------------- +// Deliver needs to take into account both receive and transmit buffers. + +static void +usbs_ethdrv_deliver(struct eth_drv_sc* sc) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + + if (eth->rx_buffer_full) { + int size = eth->rx_buffer[0] + (eth->rx_buffer[1] << 8); + (*sc->funs->eth_drv->recv)(sc, size); + } + if (eth->tx_done) { + unsigned long key = eth->tx_key; + eth->tx_buffer_full = false; + eth->tx_done = false; + (*sc->funs->eth_drv->tx_done)(sc, key, 1); + } +} + +// ---------------------------------------------------------------------------- +// usbs_ethdrv_start() +// +// This gets called by the TCP/IP stack later on during +// initialization, when the stack is ready to send and receive +// packets. It may get called multiple times while the stack +// is running, with different flags values. +// +// As far as transmits are concerned, nothing needs to be done. If no +// transmit is in progress then everything is fine anyway. If a +// transmit is already in progress then it must be allowed to complete +// via the usual route. Receives should however be restarted, the +// start function has appropriate safeguards. +// +// Invoked in: thread context only +// ---------------------------------------------------------------------------- + +static void +usbs_ethdrv_start(struct eth_drv_sc* sc, unsigned char* enaddr, int flags) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + if (!eth->ecos_up) { + eth->ecos_up = true; + usbs_ethdrv_start_recv(sc, eth); + } +} + +// ---------------------------------------------------------------------------- +// usbs_ethdrv_stop() +// +// Similarly this gets called by the TCP/IP stack to bring the network +// interface down. Nothing should happen for any packets currently +// being transmitted or received, that would cause confusion everywhere. +// The receive callback checks the ecos_up flag and does the right +// thing. The TCP/IP stack should not call can_send() after taking +// the interface down so no new transmits will be initiated. +// +// Invoked in: thread context only +// ---------------------------------------------------------------------------- + +static void +usbs_ethdrv_stop(struct eth_drv_sc* sc) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + eth->ecos_up = false; +} + +// ---------------------------------------------------------------------------- +// usbs_eth_ioctl() +// +// The operations to worry about here are: +// +// SET_MAC_ADDRESS,via the SIOCSIFHWADDR ioctl +// +// GET_IF_STATS and GET_IF_STATS_UD, to report gathered statistics. +// +// Invoked in: thread context only +// ---------------------------------------------------------------------------- + +static int +usbs_ethdrv_ioctl(struct eth_drv_sc* sc, unsigned long key, void* data, int data_length) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + int result = EINVAL; + + switch(key) { + case ETH_DRV_SET_MAC_ADDRESS: + { + if (6 == data_length) { + memcpy(eth->ecos_MAC, data, 6); + result = 0; + } + } + break; +#if defined(CYGFUN_USBS_ETHDRV_STATISTICS) && defined(ETH_DRV_GET_IF_STATS_UD) + case ETH_DRV_GET_IF_STATS_UD: + case ETH_DRV_GET_IF_STATS: + { + static unsigned char my_chipset[] = { 0, 0 }; + struct ether_drv_stats *p = (struct ether_drv_stats*) data; + int i; + strcpy(p->description, CYGDAT_USBS_ETHDRV_DESCRIPTION); + for ( i = 0; i < SNMP_CHIPSET_LEN; i++ ) { + if ( 0 == (p->snmp_chipset[i] = my_chipset[i]) ) { + break; + } + } + p->duplex = 3; // 3 == duplex + p->operational = (eth->host_up && eth->ecos_up) ? 3 : 2; // 3 == up, 2 == down + p->speed = 10 * 1000000; + p->supports_dot3 = 1; + p->rx_too_long_frames = eth->rx_too_long_frames; + p->rx_short_frames = eth->rx_short_frames; + p->interrupts = eth->interrupts; + p->rx_count = eth->rx_count; + p->tx_count = eth->tx_count; + p->tx_queue_len = 1; + } + break; +#endif + + default: + break; + } + + return result; +} + + +// ---------------------------------------------------------------------------- +// usbs_ethdrv_poll() +// +// On real ethernet hardware this is used by RedBoot once the +// application has started running, so that the network device can be +// used for debugging purposes as well as for the application's own +// needs. The lower-level USB device may supply a poll function as well. +// ---------------------------------------------------------------------------- +static void +usbs_ethdrv_poll(struct eth_drv_sc* sc) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + (*eth->control_endpoint->poll_fn)(eth->control_endpoint); +} + +// ---------------------------------------------------------------------------- +// usbs_ethdrv_intvector() +// +// See usbs_eth_poll(). +// ---------------------------------------------------------------------------- + +static int +usbs_ethdrv_intvector(struct eth_drv_sc* sc) +{ + usbs_eth* eth = (usbs_eth*)(sc->driver_private); + return eth->control_endpoint->interrupt_vector; +} + +
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/ChangeLog @@ -0,0 +1,75 @@ +2001-02-02 Bart Veer <bartv@redhat.com> + + * cdl/usbs.cdl: + Add doc property to point at the HTML + + * doc/usbs.sgml, *.html: + Incorporate changes from docs department, regenerate HTML + +2001-01-25 Bart Veer <bartv@redhat.com> + + * src/usbs.c: + * include/usbs.h: + Only declare the devtab support functions if the I/O package is + present, since that provides required data types. + + * cdl/usbs.cdl: + devtab support should be enabled by default iff the I/O package is + present. + +2001-01-22 Bart Veer <bartv@redhat.com> + + * doc/usbs.sgml, doc/makefile: + Added documentation + +2001-01-16 Bart Veer <bartv@redhat.com> + + * include/usbs.h: + * src/usbs.c: + Update the start() and poll() functions to match the documentation. + +2000-12-15 Bart Veer <bartv@redhat.com> + + * src/usbs.c: + Fix missing return statements. + +2000-11-28 Bart Veer <bartv@redhat.com> + + * cdl/usbs.cdl + * include/usbs.h: + * usbs.c + Update interface to USB device drivers + +2000-11-22 Bart Veer <bartv@redhat.com> + + * include/usbs.h: Fix nested #include protection + +2000-11-21 Bart Veer <bartv@redhat.com> + + * First check-in of eCos USB support. + +//=========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//===========================================================================
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/cdl/usbs.cdl @@ -0,0 +1,97 @@ +# ==================================================================== +# +# usbs.cdl +# +# USB slave-side support +# +# ==================================================================== +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 2000, 2001 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): bartv +# Original data: bartv +# Contributors: +# Date: 2000-10-04 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_IO_USB_SLAVE { + display "USB slave-side support" + parent CYGPKG_IO_USB + include_dir "cyg/io/usb" + active_if CYGHWR_IO_USB_SLAVE + doc io-usb-slave.html + + compile usbs.c + + cdl_interface CYGINT_IO_USB_SLAVE_CLIENTS { + display "Number of clients of USB devices" + description " + This counter keeps track of the number of clients of + USB devices, especially application-class packages such + as the USB-ethernet support. It can be used by USB + device drivers for default settings. + " + } + + cdl_option CYGGLO_IO_USB_SLAVE_APPLICATION { + display "Application code uses USB devices" + default_value 0 + implements CYGINT_IO_USB_SLAVE_CLIENTS + description " + If the USB devices are accessed by application code + rather than by other packages then enabling this + option will cause the USB device drivers to be enabled. + " + } + + cdl_option CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES { + display "Provide devtab entries by default" + default_value CYGPKG_IO + requires CYGPKG_IO + description " + The USB slave-side endpoints can typically be accessed in two + different ways. There is support for the traditional way of + doing I/O with open/read/write calls, which involves the + use of devtab entries. It is also possible to use a + USB-specific API, defined largely in terms of asynchronous + operations and callbacks (the read/write implementation uses + these lower-level calls). If neither the application nor + any other USB-related packages require the higher-level + read/write calls then it is possible to save some memory + by eliminating the devtab entries. + " + } + + cdl_interface CYGHWR_IO_USB_SLAVE_OUT_ENDPOINTS { + display "Number of available host->slave endpoints" + } + cdl_interface CYGHWR_IO_USB_SLAVE_IN_ENDPOINTS { + display "Number of available slave->host endpoints" + } +}
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/io-usb-slave.html @@ -0,0 +1,180 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +eCos USB Slave Support</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="NEXT" +TITLE="Introduction" +HREF="usbs-intro.html"></HEAD> +<BODY +CLASS="REFERENCE" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> + </TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-intro.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<DIV +CLASS="REFERENCE"> +<A +NAME="IO-USB-SLAVE"> +</A> +<DIV +CLASS="TITLEPAGE"> +<H1 +CLASS="TITLE"> +I. eCos USB Slave Support</H1> +<DIV +CLASS="TOC"> +<DL> +<DT> +<B> +Table of Contents</B> +</DT> +<DT> +<A +HREF="usbs-intro.html"> +Introduction</A> + — eCos support for USB slave devices</DT> +<DT> +<A +HREF="usbs-enum.html"> +USB Enumeration Data</A> + — The USB enumeration data structures</DT> +<DT> +<A +HREF="usbs-start.html"> +Starting up a USB Device</A> + — Starting up a USB Device</DT> +<DT> +<A +HREF="usbs-devtab.html"> +Devtab Entries</A> + — Data endpoint data structure</DT> +<DT> +<A +HREF="usbs-start-rx.html"> +Receiving Data from the Host</A> + — Receiving Data from the Host</DT> +<DT> +<A +HREF="usbs-start-tx.html"> +Sending Data to the Host</A> + — Sending Data to the Host</DT> +<DT> +<A +HREF="usbs-halt.html"> +Halted Endpoints</A> + — Support for Halting and Halted Endpoints</DT> +<DT> +<A +HREF="usbs-control.html"> +Control Endpoints</A> + — Control endpoint data structure</DT> +<DT> +<A +HREF="usbs-data.html"> +Data Endpoints</A> + — Data endpoint data structures</DT> +<DT> +<A +HREF="usbs-writing.html"> +Writing a USB Device Driver</A> + — USB Device Driver Porting Guide</DT> +</DL> +</DIV> +</DIV> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> + </TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-intro.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> + </TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Introduction</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-control.html @@ -0,0 +1,931 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Control Endpoints</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Halted Endpoints" +HREF="usbs-halt.html"><LINK +REL="NEXT" +TITLE="Data Endpoints" +HREF="usbs-data.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-halt.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-data.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-CONTROL"> +Control Endpoints</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN489"> +</A> +<H2> +Name</H2> +Control Endpoints -- Control endpoint data structure</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN492"> +</A> +<H2> +Synopsis</H2> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SYNOPSIS"> +#include <cyg/io/usb/usbs.h> + +typedef struct usbs_control_endpoint { + *hellip; +} usbs_control_endpoint;</PRE> +</TD> +</TR> +</TABLE> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN494"> +</A> +<H2> +<TT +CLASS="LITERAL"> +usbs_control_endpoint</TT> + Data Structure</H2> +<P> +The device driver for a USB slave device should supply one +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + data structure per USB +device. This corresponds to endpoint 0 which will be used for all +control message interaction between the host and that device. The data +structure is also used for internal management purposes, for example +to keep track of the current state. In a typical USB peripheral there +will only be one such data structure in the entire system, but if +there are multiple USB slave ports, allowing the peripheral to be +connected to multiple hosts, then there will be a separate data +structure for each one. The name or names of the data structures are +determined by the device drivers. For example, the SA11x0 USB device +driver package provides <TT +CLASS="LITERAL"> +usbs_sa11x0_ep0</TT> +.</P> +<P> +The operations on a control endpoint do not fit cleanly into a +conventional open/read/write I/O model. For example, when the host +sends a control message to the USB peripheral this may be one of four +types: standard, class, vendor and reserved. Some or all of the +standard control messages will be handled automatically by the common +USB slave package or by the device driver itself. Other standard +control messages and the other types of control messages may be +handled by a class-specific package or by application code. Although +it would be possible to have devtab entries such as +<TT +CLASS="LITERAL"> +/dev/usbs_ep0/standard</TT> + and +<TT +CLASS="LITERAL"> +/dev/usbs_ep0/class</TT> +, and then support read and +write operations on these devtab entries, this would add significant +overhead and code complexity. Instead, all of the fields in the +control endpoint data structure are public and can be manipulated +directly by higher level code if and when required. </P> +<P> +Control endpoints involve a number of callback functions, with +higher-level code installing suitable function pointers in the control +endpoint data structure. For example, if the peripheral involves +vendor-specific control messages then a suitable handler for these +messages should be installed. Although the exact details depend on the +device driver, typically these callback functions will be invoked at +DSR level rather than thread level. Therefore, only certain eCos +functions can be invoked; specifically, those functions that are +guaranteed not to block. If a potentially blocking function such as a +semaphore wait or a mutex lock operation is invoked from inside the +callback then the resulting behaviour is undefined, and the system as +a whole may fail. In addition, if one of the callback functions +involves significant processing effort then this may adversely affect +the system's real time characteristics. The eCos kernel documentation +should be consulted for more details of DSR handling.</P> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN504"> +</A> +<H3> +Initialization</H3> +<P> +The <SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + data structure +contains the following fields related to initialization.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + … + const usbs_enumeration_data* enumeration_data; + void (*start_fn)(usbs_control_endpoint*); + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +It is the responsibility of higher-level code, usually the +application, to define the USB enumeration data. This needs to be +installed in the control endpoint data structure early on during +system startup, before the USB device is actually started and any +interaction with the host is possible. Details of the enumeration data +are supplied in the section <A +HREF="usbs-enum.html"> +USB Enumeration +Data</A> +. Typically, the enumeration data is constant for a given +peripheral, although it can be constructed dynamically if necessary. +However, the enumeration data cannot change while the peripheral is +connected to a host: the peripheral cannot easily claim to be a +keyboard one second and a printer the next.</P> +<P> +The <TT +CLASS="STRUCTFIELD"> +<I> +start_fn</I> +</TT> + member is normally accessed +via the utility <A +HREF="usbs-start.html"> +<TT +CLASS="FUNCTION"> +usbs_start</TT> +</A> + rather +than directly. It is provided by the device driver and should be +invoked once the system is fully initialized and interaction with the +host is possible. A typical implementation would change the USB data +pins from tristated to active. If the peripheral is already plugged +into a host then the latter should detect this change and start +interacting with the peripheral, including requesting the enumeration +data.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN515"> +</A> +<H3> +State</H3> +<P> +There are three <SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + fields +related to the current state of a USB slave device, plus some state +constants and an enumeration of the possible state changes:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + … + int state; + void (*state_change_fn)(struct usbs_control_endpoint*, void*, + usbs_state_change, int); + void* state_change_data; + … +}; + +#define USBS_STATE_DETACHED 0x01 +#define USBS_STATE_ATTACHED 0x02 +#define USBS_STATE_POWERED 0x03 +#define USBS_STATE_DEFAULT 0x04 +#define USBS_STATE_ADDRESSED 0x05 +#define USBS_STATE_CONFIGURED 0x06 +#define USBS_STATE_MASK 0x7F +#define USBS_STATE_SUSPENDED (1 << 7) + +typedef enum { + USBS_STATE_CHANGE_DETACHED = 1, + USBS_STATE_CHANGE_ATTACHED = 2, + USBS_STATE_CHANGE_POWERED = 3, + USBS_STATE_CHANGE_RESET = 4, + USBS_STATE_CHANGE_ADDRESSED = 5, + USBS_STATE_CHANGE_CONFIGURED = 6, + USBS_STATE_CHANGE_DECONFIGURED = 7, + USBS_STATE_CHANGE_SUSPENDED = 8, + USBS_STATE_CHANGE_RESUMED = 9 +} usbs_state_change;</PRE> +</TD> +</TR> +</TABLE> +<P> +The USB standard defines a number of states for a given USB +peripheral. The initial state is <I +CLASS="EMPHASIS"> +detached</I> +, where +the peripheral is either not connected to a host at all or, from the +host's perspective, the peripheral has not started up yet because the +relevant pins are tristated. The peripheral then moves via +intermediate <I +CLASS="EMPHASIS"> +attached</I> + and +<I +CLASS="EMPHASIS"> +powered</I> + states to its default or +<I +CLASS="EMPHASIS"> +reset</I> + state, at which point the host and +peripheral can actually start exchanging data. The first message is +from host to peripheral and provides a unique 7-bit address within the +local USB network, resulting in a state change to +<I +CLASS="EMPHASIS"> +addressed</I> +. The host then requests enumeration +data and performs other initialization. If everything succeeds the +host sends a standard set-configuration control message, after which +the peripheral is <I +CLASS="EMPHASIS"> +configured</I> + and expected to be +up and running. Note that some USB device drivers may be unable to +distinguish between the <I +CLASS="EMPHASIS"> +detached</I> +, +<I +CLASS="EMPHASIS"> +attached</I> + and <I +CLASS="EMPHASIS"> +powered</I> + states +but generally this is not important to higher-level code.</P> +<P> +A USB host should generate at least one token every millisecond. If a +peripheral fails to detect any USB traffic for a period of time then +typically this indicates that the host has entered a power-saving +mode, and the peripheral should do the same if possible. This +corresponds to the <I +CLASS="EMPHASIS"> +suspended</I> + bit. The actual +state is a combination of <I +CLASS="EMPHASIS"> +suspended</I> + and the +previous state, for example <I +CLASS="EMPHASIS"> +configured</I> + and +<I +CLASS="EMPHASIS"> +suspended</I> + rather than just +<I +CLASS="EMPHASIS"> +suspended</I> +. When the peripheral subsequently +detects USB traffic it would switch back to the +<I +CLASS="EMPHASIS"> +configured</I> + state.</P> +<P> +The USB device driver and the common USB slave package will maintain +the current state in the control endpoint's +<TT +CLASS="STRUCTFIELD"> +<I> +state</I> +</TT> + field. There should be no need for +any other code to change this field, but it can be examined whenever +appropriate. In addition whenever a state change occurs the generic +code can invoke a state change callback function. By default, no such +callback function will be installed. Some class-specific packages such +as the USB-ethernet package will install a suitable function to keep +track of whether or not the host-peripheral connection is up, that is +whether or not ethernet packets can be exchanged. Application code can +also update this field. If multiple parties want to be informed of +state changes, for example both a class-specific package and +application code, then typically the application code will install its +state change handler after the class-specific package and is +responsible for chaining into the package's handler.</P> +<P> +The state change callback function is invoked with four arguments. The +first identifies the control endpoint. The second is an arbitrary +pointer: higher-level code can fill in the +<TT +CLASS="STRUCTFIELD"> +<I> +state_change_data</I> +</TT> + field to set this. The +third argument specifies the state change that has occurred, and the +last argument supplies the previous state (the new state is readily +available from the control endpoint structure).</P> +<P> +eCos does not provide any utility functions for updating or examining +the <TT +CLASS="STRUCTFIELD"> +<I> +state_change_fn</I> +</TT> + or +<TT +CLASS="STRUCTFIELD"> +<I> +state_change_data</I> +</TT> + fields. Instead, it is +expected that the fields in the +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + data structure will be +manipulated directly. Any utility functions would do just this, but +at the cost of increased code and cpu overheads.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN545"> +</A> +<H3> +Standard Control Messages</H3> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + … + unsigned char control_buffer[8]; + usbs_control_return (*standard_control_fn)(struct usbs_control_endpoint*, void*); + void* standard_control_data; + … +} usbs_control_endpoint; + +typedef enum { + USBS_CONTROL_RETURN_HANDLED = 0, + USBS_CONTROL_RETURN_UNKNOWN = 1, + USBS_CONTROL_RETURN_STALL = 2 +} usbs_control_return; + +extern usbs_control_return usbs_handle_standard_control(struct usbs_control_endpoint*);</PRE> +</TD> +</TR> +</TABLE> +<P> +When a USB peripheral is connected to the host it must always respond +to control messages sent to endpoint 0. Control messages always +consist of an initial eight-byte header, containing fields such as a +request type. This may be followed by a further data transfer, either +from host to peripheral or from peripheral to host. The way this is +handled is described in the <A +HREF="usbs-control.html#AEN578"> +Buffer Management</A> + section below.</P> +<P> +The USB device driver will always accept the initial eight-byte +header, storing it in the <TT +CLASS="STRUCTFIELD"> +<I> +control_buffer</I> +</TT> + +field. Then it determines the request type: standard, class, vendor, +or reserved. The way in which the last three of these are processed is +described in the section <A +HREF="usbs-control.html#AEN570"> +Other +Control Messages</A> +. Some +standard control messages will be handled by the device driver itself; +typically the <I +CLASS="EMPHASIS"> +set-address</I> + request and the +<I +CLASS="EMPHASIS"> +get-status</I> +, <I +CLASS="EMPHASIS"> +set-feature</I> + and +<I +CLASS="EMPHASIS"> +clear-feature</I> + requests when applied to endpoints.</P> +<P> +If a standard control message cannot be handled by the device driver +itself, the driver checks the +<TT +CLASS="STRUCTFIELD"> +<I> +standard_control_fn</I> +</TT> + field in the control +endpoint data structure. If higher-level code has installed a suitable +callback function then this will be invoked with two argument, the +control endpoint data structure itself and the +<TT +CLASS="STRUCTFIELD"> +<I> +standard_control_data</I> +</TT> + field. The latter +allows the higher level code to associate arbitrary data with the +control endpoint. The callback function can return one of three +values: <I +CLASS="EMPHASIS"> +HANDLED</I> + to indicate that the request has +been processed; <I +CLASS="EMPHASIS"> +UNKNOWN</I> + if the message should be +handled by the default code; or <I +CLASS="EMPHASIS"> +STALL</I> + to indicate +an error condition. If higher level code has not installed a callback +function or if the callback function has returned +<I +CLASS="EMPHASIS"> +UNKNOWN</I> + then the device driver will invoke a +default handler, <TT +CLASS="FUNCTION"> +usbs_handle_standard_control</TT> + +provided by the common USB slave package.</P> +<P> +The default handler can cope with all of the standard control messages +for a simple USB peripheral. However, if the peripheral involves +multiple configurations, multiple interfaces in a configuration, or +alternate settings for an interface, then this cannot be handled by +generic code. For example, a multimedia peripheral may support various +alternate settings for a given data source with different bandwidth +requirements, and the host can select a setting that takes into +account the current load. Clearly higher-level code needs to be aware +when the host changes the current setting, so that it can adjust the +rate at which data is fed to or retrieved from the host. Therefore the +higher-level code needs to install its own standard control callback +and process appropriate messages, rather than leaving these to the +default handler.</P> +<P> +The default handler will take care of the +<I +CLASS="EMPHASIS"> +get-descriptor</I> + request used to obtain the +enumeration data. It has support for string descriptors but ignores +language encoding issues. If language encoding is important for the +peripheral then this will have to be handled by an +application-specific standard control handler.</P> +<P> +The header file <TT +CLASS="FILENAME"> +<cyg/io/usb/usb.h></TT> + defines various +constants related to control messages, for example the function codes +corresponding to the standard request types. This header file is +provided by the common USB package, not by the USB slave package, +since the information is also relevant to USB hosts.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN570"> +</A> +<H3> +Other Control Messages</H3> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + … + usbs_control_return (*class_control_fn)(struct usbs_control_endpoint*, void*); + void* class_control_data; + usbs_control_return (*vendor_control_fn)(struct usbs_control_endpoint*, void*); + void* vendor_control_data; + usbs_control_return (*reserved_control_fn)(struct usbs_control_endpoint*, void*); + void* reserved_control_data; + … +} usbs_control_endpoint;</PRE> +</TD> +</TR> +</TABLE> +<P> +Non-standard control messages always have to be processed by +higher-level code. This could be class-specific packages. For example, +the USB-ethernet package will handle requests for getting the MAC +address and for enabling or disabling promiscuous mode. In all cases +the device driver will store the initial request in the +<TT +CLASS="STRUCTFIELD"> +<I> +control_buffer</I> +</TT> + field, check for an +appropriate handler, and invoke it with details of the control +endpoint and any handler-specific data that has been installed +alongside the handler itself. The handler should return either +<TT +CLASS="LITERAL"> +USBS_CONTROL_RETURN_HANDLED</TT> + to report success or +<TT +CLASS="LITERAL"> +USBS_CONTROL_RETURN_STALL</TT> + to report failure. The +device driver will report this to the host.</P> +<P> +If there are multiple parties interested in a particular type of +control messages, it is the responsibility of application code to +install an appropriate handler and process the requests appropriately. </P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN578"> +</A> +<H3> +Buffer Management</H3> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + … + unsigned char* buffer; + int buffer_size; + void (*fill_buffer_fn)(struct usbs_control_endpoint*); + void* fill_data; + int fill_index; + usbs_control_return (*complete_fn)(struct usbs_control_endpoint*, int); + … +} usbs_control_endpoint;</PRE> +</TD> +</TR> +</TABLE> +<P> +Many USB control messages involve transferring more data than just the +initial eight-byte header. The header indicates the direction of the +transfer, OUT for host to peripheral or IN for peripheral to host. +It also specifies a length field, which is exact for an OUT transfer +or an upper bound for an IN transfer. Control message handlers can +manipulate six fields within the control endpoint data structure to +ensure that the transfer happens correctly.</P> +<P> +For an OUT transfer, the handler should examine the length field in +the header and provide a single buffer for all the data. A +class-specific protocol would typically impose an upper bound on the +amount of data, allowing the buffer to be allocated statically. +The handler should update the <TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> + fields. When all the data has +been transferred the completion callback will be invoked, and its +return value determines the response sent back to the host. The USB +standard allows for a new control message to be sent before the +current transfer has completed, effectively cancelling the current +operation. When this happens the completion function will also be +invoked. The second argument to the completion function specifies what +has happened, with a value of 0 indicating success and an error code +such as <TT +CLASS="LITERAL"> +-EPIPE</TT> + or <TT +CLASS="LITERAL"> +-EIO</TT> + +indicating that the current transfer has been cancelled.</P> +<P> +IN transfers are a little bit more complicated. The required +information, for example the enumeration data, may not be in a single +contiguous buffer. Instead a mechanism is provided by which the buffer +can be refilled, thus allowing the transfer to move from one record to +the next. Essentially, the transfer operates as follows:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +When the host requests another chunk of data (typically eight bytes), +the USB device driver will examine the +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + field. If non-zero then +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + contains at least one more byte of +data, and then <TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + is decremented.</P> +</LI> +<LI> +<P> +When <TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + has dropped to 0, the +<TT +CLASS="STRUCTFIELD"> +<I> +fill_buffer_fn</I> +</TT> + field will be examined. If +non-null it will be invoked to refill the buffer.</P> +</LI> +<LI> +<P> +The <TT +CLASS="STRUCTFIELD"> +<I> +fill_data</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +fill_index</I> +</TT> + fields are not used by the +device driver. Instead these fields are available to the refill +function to keep track of the current state of the transfer.</P> +</LI> +<LI> +<P> +When <TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + is 0 and +<TT +CLASS="STRUCTFIELD"> +<I> +fill_buffer_fn</I> +</TT> + is NULL, no more data is +available and the transfer has completed.</P> +</LI> +<LI> +<P> +Optionally a completion function can be installed. This will be +invoked with 0 if the transfer completes successfully, or with an +error code if the transfer is cancelled because of another control +messsage. </P> +</LI> +</OL> +<P> +If the requested data is contiguous then the only fields that need +to be manipulated are <TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> +, and optionally +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> +. If the requested data is not +contiguous then the initial control message handler should update +<TT +CLASS="STRUCTFIELD"> +<I> +fill_buffer_fn</I> +</TT> + and some or all of the other +fields, as required. An example of this is the handling of the +standard <I +CLASS="EMPHASIS"> +get-descriptor</I> + control message by +<TT +CLASS="FUNCTION"> +usbs_handle_standard_control</TT> +.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN615"> +</A> +<H3> +Polling Support</H3> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +typedef struct usbs_control_endpoint { + void (*poll_fn)(struct usbs_control_endpoint*); + int interrupt_vector; + … +} usbs_control_endpoint;</PRE> +</TD> +</TR> +</TABLE> +<P> +In nearly all circumstances USB I/O should be interrupt-driven. +However, there are special environments such as RedBoot where polled +operation may be appropriate. If the device driver can operate in +polled mode then it will provide a suitable function via the +<TT +CLASS="STRUCTFIELD"> +<I> +poll_fn</I> +</TT> + field, and higher-level code can +invoke this regularly. This polling function will take care of all +endpoints associated with the device, not just the control endpoint. +If the USB hardware involves a single interrupt vector then this will +be identified in the data structure as well.</P> +</DIV> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-halt.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-data.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Halted Endpoints</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Data Endpoints</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-data.html @@ -0,0 +1,374 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Data Endpoints</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Control Endpoints" +HREF="usbs-control.html"><LINK +REL="NEXT" +TITLE="Writing a USB Device Driver" +HREF="usbs-writing.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-control.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-writing.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-DATA"> +Data Endpoints</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN623"> +</A> +<H2> +Name</H2> +Data Endpoints -- Data endpoint data structures</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN626"> +</A> +<H2> +Synopsis</H2> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SYNOPSIS"> +#include <cyg/io/usb/usbs.h> + +typedef struct usbs_rx_endpoint { + void (*start_rx_fn)(struct usbs_rx_endpoint*); + void (*set_halted_fn)(struct usbs_rx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + unsigned char* buffer; + int buffer_size; + cyg_bool halted; +} usbs_rx_endpoint; + +typedef struct usbs_tx_endpoint { + void (*start_tx_fn)(struct usbs_tx_endpoint*); + void (*set_halted_fn)(struct usbs_tx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + const unsigned char* buffer; + int buffer_size; + cyg_bool halted; +} usbs_tx_endpoint;</PRE> +</TD> +</TR> +</TABLE> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN628"> +</A> +<H2> +Receive and Transmit Data Structures</H2> +<P> +In addition to a single <SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> + +data structure per USB slave device, the USB device driver should also +provide receive and transmit data structures corresponding to the +other endpoints. The names of these are determined by the device +driver. For example, the SA1110 USB device driver package provides +<TT +CLASS="LITERAL"> +usbs_sa11x0_ep1</TT> + for receives and +<TT +CLASS="LITERAL"> +usbs_sa11x0_ep2</TT> + for transmits.</P> +<P> +Unlike control endpoints, the common USB slave package does provide a +number of utility routines to manipulate data endpoints. For example +<A +HREF="usbs-start-rx.html"> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +</A> + +can be used to receive data from the host into a buffer. In addition +the USB device driver can provide devtab entries such as +<TT +CLASS="LITERAL"> +/dev/usbs1r</TT> + and <TT +CLASS="LITERAL"> +/dev/usbs2w</TT> +, so +higher-level code can <TT +CLASS="FUNCTION"> +open</TT> + these devices and then +perform blocking <TT +CLASS="FUNCTION"> +read</TT> + and +<TT +CLASS="FUNCTION"> +write</TT> + operations.</P> +<P> +However, the operation of data endpoints and the various +endpoint-related functions is relatively straightforward. First +consider a <SPAN +CLASS="STRUCTNAME"> +usbs_rx_endpoint</SPAN> + structure. The +device driver will provide the members +<TT +CLASS="STRUCTFIELD"> +<I> +start_rx_fn</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +set_halted_fn</I> +</TT> +, and it will maintain the +<TT +CLASS="STRUCTFIELD"> +<I> +halted</I> +</TT> + field. To receive data, higher-level +code sets the <TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> + and optionally the +<TT +CLASS="STRUCTFIELD"> +<I> +complete_data</I> +</TT> + fields. Next the +<TT +CLASS="STRUCTFIELD"> +<I> +start_rx_fn</I> +</TT> + member should be called. When +the transfer has finished the device driver will invoke the completion +function, using <TT +CLASS="STRUCTFIELD"> +<I> +complete_data</I> +</TT> + as the first +argument and a size field for the second argument. A negative size +indicates an error of some sort: <TT +CLASS="LITERAL"> +-EGAIN</TT> + indicates +that the endpoint has been halted, usually at the request of the host; +<TT +CLASS="LITERAL"> +-EPIPE</TT> + indicates that the connection between the +host and the peripheral has been broken. Certain device drivers may +generate other error codes.</P> +<P> +If higher-level code needs to halt or unhalt an endpoint then it can +invoke the <TT +CLASS="STRUCTFIELD"> +<I> +set_halted_fn</I> +</TT> + member. When an +endpoint is halted, invoking <TT +CLASS="STRUCTFIELD"> +<I> +start_rx_fn</I> +</TT> + +wit <TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + set to 0 indicates that +higher-level code wants to block until the endpoint is no longer +halted; at that point the completion function will be invoked.</P> +<P> +USB device drivers are allowed to assume that higher-level protocols +ensure that host and peripheral agree on the amount of data that will +be transferred, or at least on an upper bound. Therefore there is no +need for the device driver to maintain its own buffers, and copy +operations are avoided. If the host sends more data than expected then +the resulting behaviour is undefined.</P> +<P> +Transmit endpoints work in essentially the same way as receive +endpoints. Higher-level code should set the +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + fields to point at the data to +be transferred, then call <TT +CLASS="STRUCTFIELD"> +<I> +start_tx_fn</I> +</TT> +, and +the device driver will invoked the completion function when the +transfer has completed.</P> +<P> +USB device drivers are not expected to perform any locking. If at any +time there are two concurrent receive operations for a given endpoint, +or two concurrent transmit operations, then the resulting behaviour is +undefined. It is the responsibility of higher-level code to perform +any synchronisation that may be necessary. In practice, conflicts are +unlikely because typically a given endpoint will only be accessed +sequentially by just one part of the overall system.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-control.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-writing.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Control Endpoints</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Writing a USB Device Driver</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-devtab.html @@ -0,0 +1,477 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Devtab Entries</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Starting up a USB Device" +HREF="usbs-start.html"><LINK +REL="NEXT" +TITLE="Receiving Data from the Host" +HREF="usbs-start-rx.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-start.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-start-rx.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-DEVTAB"> +Devtab Entries</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN200"> +</A> +<H2> +Name</H2> +Devtab Entries -- Data endpoint data structure</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN203"> +</A> +<H2> +Synopsis</H2> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SYNOPSIS"> +/dev/usb0c +/dev/usb1r +/dev/usb2w</PRE> +</TD> +</TR> +</TABLE> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN205"> +</A> +<H2> +Devtab Entries</H2> +<P> +USB device drivers provide two ways of transferring data between host +and peripheral. The first involves USB-specific functionality such as +<A +HREF="usbs-start-rx.html"> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +</A> +. +This provides non-blocking I/O: a transfer is started, and some time +later the device driver will call a supplied completion function. The +second uses the conventional I/O model: there are entries in the +device table corresponding to the various endpoints. Standard calls +such as <TT +CLASS="FUNCTION"> +open</TT> + can then be used to get a suitable +handle. Actual I/O happens via blocking <TT +CLASS="FUNCTION"> +read</TT> + and +<TT +CLASS="FUNCTION"> +write</TT> + calls. In practice the blocking operations +are simply implemented using the underlying non-blocking +functionality.</P> +<P> +Each endpoint will have its own devtab entry. The exact names are +controlled by the device driver package, but typically the root will +be <TT +CLASS="LITERAL"> +/dev/usb</TT> +. This is followed by one or more +decimal digits giving the endpoint number, followed by +<TT +CLASS="LITERAL"> +c</TT> + for a control endpoint, <TT +CLASS="LITERAL"> +r</TT> + for +a receive endpoint (host to peripheral), and <TT +CLASS="LITERAL"> +w</TT> + for +a transmit endpoint (peripheral to host). If the target hardware +involves more than one USB device then different roots should be used, +for example <TT +CLASS="LITERAL"> +/dev/usb0c</TT> + and +<TT +CLASS="LITERAL"> +/dev/usb1_0c</TT> +. This may require explicit +manipulation of device driver configuration options by the application +developer.</P> +<P> +At present the devtab entry for a control endpoint does not support +any I/O operations. </P> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN221"> +</A> +<H3> +<TT +CLASS="FUNCTION"> +write</TT> + operations</H3> +<P> +<TT +CLASS="FUNCTION"> +cyg_io_write</TT> + and similar functions in +higher-level packages can be used to perform a transfer from +peripheral to host. Successive write operations will not be coalesced. +For example, when doing a 1000 byte write to an endpoint that uses the +bulk transfer protocol this will involve 15 full-size 64-byte packets +and a terminating 40-byte packet. USB device drivers are not expected +to do any locking, and if higher-level code performs multiple +concurrent write operations on a single endpoint then the resulting +behaviour is undefined.</P> +<P> +A USB <TT +CLASS="FUNCTION"> +write</TT> + operation will never transfer less +data than specified. It is the responsibility of higher-level code to +ensure that the amount of data being transferred is acceptable to the +host-side code. Usually this will be defined by a higher-level +protocol. If an attempt is made to transfer more data than the host +expects then the resulting behaviour is undefined.</P> +<P> +There are two likely error conditions. <TT +CLASS="LITERAL"> +EPIPE</TT> + +indicates that the connection between host and target has been broken. +<TT +CLASS="LITERAL"> +EAGAIN</TT> + indicates that the endpoint has been +stalled, either at the request of the host or by other activity +inside the peripheral.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN231"> +</A> +<H3> +<TT +CLASS="FUNCTION"> +read</TT> + operations</H3> +<P> +<TT +CLASS="FUNCTION"> +cyg_io_read</TT> + and similar functions in higher-level +packages can be used to perform a transfer from host to peripheral. +This should be a complete transfer: higher-level protocols should +define an upper bound on the amount of data being transferred, and the +<TT +CLASS="FUNCTION"> +read</TT> + operation should involve at least this +amount of data. The return value will indicate the actual transfer +size, which may be less than requested.</P> +<P> +Some device drivers may support partial reads, but USB device drivers +are not expected to perform any buffering because that involves both +memory and code overheads. One technique that may work for bulk +transfers is to exploit the fact that such transfers happen in 64-byte +packets. It is possible to <TT +CLASS="FUNCTION"> +read</TT> + an initial 64 +bytes, corresponding to the first packet in the transfer. These 64 +bytes can then be examined to determine the total transfer size, and +the remaining data can be transferred in another +<TT +CLASS="FUNCTION"> +read</TT> + operation. This technique is not guaranteed +to work with all USB hardware. Also, if the delay between accepting +the first packet and the remainder of the transfer is excessive then +this could cause timeout problems for the host-side software. For +these reasons the use of partial reads should be avoided.</P> +<P> +There are two likely error conditions. <TT +CLASS="LITERAL"> +EPIPE</TT> + +indicates that the connection between host and target has been broken. +<TT +CLASS="LITERAL"> +EAGAIN</TT> + indicates that the endpoint has been +stalled, either at the request of the host or by other activity +inside the peripheral.</P> +<P> +USB device drivers are not expected to do any locking. If higher-level +code performs multiple concurrent read operations on a single endpoint +then the resulting behaviour is undefined.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN244"> +</A> +<H3> +<TT +CLASS="FUNCTION"> +select</TT> + operations</H3> +<P> +Typical USB device drivers will not provide any support for +<TT +CLASS="FUNCTION"> +select</TT> +. Consider bulk transfers from the host to +the peripheral. At the USB device driver level there is no way of +knowing in advance how large a transfer will be, so it is not feasible +for the device driver to buffer the entire transfer. It may be +possible to buffer part of the transfer, for example the first 64-byte +packet, and copy this into application space at the start of a +<TT +CLASS="FUNCTION"> +read</TT> +, but this adds code and memory overheads. +Worse, it means that there is an unknown but potentially long delay +between a peripheral accepting the first packet of a transfer and the +remaining packets, which could confuse or upset the host-side +software.</P> +<P> +With some USB hardware it may be possible for the device driver to +detect OUT tokens from the host without actually accepting the data, +and this would indicate that a <TT +CLASS="FUNCTION"> +read</TT> + is likely to +succeed. However, it would not be reliable since the host-side I/O +operation could time out. A similar mechanism could be used to +implement <TT +CLASS="FUNCTION"> +select</TT> + for outgoing data, but again +this would not be reliable.</P> +<P> +Some device drivers may provide partial support for +<TT +CLASS="FUNCTION"> +select</TT> + anyway, possibly under the control of a +configuration option. The device driver's documentation should be +consulted for further information. It is also worth noting that the +USB-specific non-blocking API can often be used as an alternative to +<TT +CLASS="FUNCTION"> +select</TT> +.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN256"> +</A> +<H3> +<TT +CLASS="FUNCTION"> +get_config</TT> + and +<TT +CLASS="FUNCTION"> +set_config</TT> + operations</H3> +<P> +There are no <TT +CLASS="FUNCTION"> +set_config</TT> + or +<TT +CLASS="FUNCTION"> +get_config</TT> + (also known as +<TT +CLASS="FUNCTION"> +ioctl</TT> +) operations defined for USB devices. +Some device drivers may provide hardware-specific facilities this way. </P> +<DIV +CLASS="NOTE"> +<BLOCKQUOTE +CLASS="NOTE"> +<P> +<B> +Note: </B> +Currently the USB-specific functions related to <A +HREF="usbs-halt.html"> +halted endpoints</A> + cannot be accessed readily +via devtab entries. This functionality should probably be made +available via <TT +CLASS="FUNCTION"> +set_config</TT> + and +<TT +CLASS="FUNCTION"> +get_config</TT> +. It may also prove useful to provide +a <TT +CLASS="FUNCTION"> +get_config</TT> + operation that maps from the +devtab entries to the underlying endpoint data structures.</P> +</BLOCKQUOTE> +</DIV> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN270"> +</A> +<H3> +Presence</H3> +<P> +The devtab entries are optional. If the USB device is accessed +primarily by class-specific code such as the USB-ethernet package and +that package uses the USB-specific API directly, the devtab entries +are redundant. Even if application code does need to access the USB +device, the non-blocking API may be more convenient than the blocking +I/O provided via the devtab entries. In these cases the devtab entries +serve no useful purpose, but they still impose a memory overhead. It +is possible to suppress the presence of these entries by disabling the +configuration option +<TT +CLASS="LITERAL"> +CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES</TT> +.</P> +</DIV> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-start.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-start-rx.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Starting up a USB Device</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Receiving Data from the Host</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-enum.html @@ -0,0 +1,831 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +USB Enumeration Data</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Introduction" +HREF="usbs-intro.html"><LINK +REL="NEXT" +TITLE="Starting up a USB Device" +HREF="usbs-start.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-intro.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-start.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-ENUM"> +USB Enumeration Data</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN68"> +</A> +<H2> +Name</H2> +Enumeration Data -- The USB enumeration data structures</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN71"> +</A> +<H2> +Synopsis</H2> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="SYNOPSIS"> +#include <cyg/io/usb/usb.h> +#include <cyg/io/usb/usbs.h> + +typedef struct usb_device_descriptor { + … +} usb_device_descriptor __attribute__((packed)); + +typedef struct usb_configuration_descriptor { + … +} usb_configuration_descriptor __attribute__((packed)); + +typedef struct usb_interface_descriptor { + … +} usb_interface_descriptor __attribute__((packed)); + +typedef struct usb_endpoint_descriptor { + … +} usb_endpoint_descriptor; + +typedef struct usbs_enumeration_data { + usb_device_descriptor device; + int total_number_interfaces; + int total_number_endpoints; + int total_number_strings; + const usb_configuration_descriptor* configurations; + const usb_interface_descriptor* interfaces; + const usb_endpoint_descriptor* endpoints; + const unsigned char** strings; +} usbs_enumeration_data;</PRE> +</TD> +</TR> +</TABLE> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN73"> +</A> +<H2> +USB Enumeration Data</H2> +<P> +When a USB host detects that a peripheral has been plugged in or +powered up, one of the first steps is to ask the peripheral to +describe itself by supplying enumeration data. Some of this data +depends on the class of peripheral. Other fields are vendor-specific. +There is also a dependency on the hardware, specifically which +endpoints are available should be used. In general it is not possible +for generic code to provide this information, so it is the +responsibility of application code to provide a suitable +<SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> + data structure and +install it in the endpoint 0 data structure during initialization. +This must happen before the USB device is enabled by a call to +<TT +CLASS="FUNCTION"> +usbs_start</TT> +, for example:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usbs_enumeration_data usb_enum_data = { + … +}; + +int +main(int argc, char** argv) +{ + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_start(&usbs_sa11x0_ep0); + … +}</PRE> +</TD> +</TR> +</TABLE> +<P> +For most applications the enumeration data will be static, although +the <SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> + structure can be +filled in at run-time if necessary. Full details of the enumeration +data can be found in the Universal Serial Bus specification obtainable +from the <A +HREF="http://www.usb.org/" +TARGET="_top"> +USB Implementers Forum web +site</A> +, although the meaning of most fields is fairly obvious. +The various data structures and utility macros are defined in the +header files <TT +CLASS="FILENAME"> +cyg/io/usb/usb.h</TT> + +and <TT +CLASS="FILENAME"> +cyg/io/usb/usbs.h</TT> +. Note +that the example code below makes use of the gcc labelled element +extension.</P> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN84"> +</A> +<H3> +<SPAN +CLASS="STRUCTNAME"> +usb_device_descriptor</SPAN> +</H3> +<P> +The main information about a USB peripheral comes from a single +<SPAN +CLASS="STRUCTNAME"> +usb_device_descriptor</SPAN> + structure, which is +embedded in the <SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> + +structure. A typical example might look like this:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usbs_enumeration_data usb_enum_data = { + { + length: USB_DEVICE_DESCRIPTOR_LENGTH, + type: USB_DEVICE_DESCRIPTOR_TYPE, + usb_spec_lo: USB_DEVICE_DESCRIPTOR_USB11_LO, + usb_spec_hi: USB_DEVICE_DESCRIPTOR_USB11_HI, + device_class: USB_DEVICE_DESCRIPTOR_CLASS_VENDOR, + device_subclass: USB_DEVICE_DESCRIPTOR_SUBCLASS_VENDOR, + device_protocol: USB_DEVICE_DESCRIPTOR_PROTOCOL_VENDOR, + max_packet_size: 8, + vendor_lo: 0x42, + vendor_hi: 0x42, + product_lo: 0x42, + product_hi: 0x42, + device_lo: 0x00, + device_hi: 0x01, + manufacturer_str: 1, + product_str: 2, + serial_number_str: 0, + number_configurations: 1 + }, + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +The length and type fields are specified by the USB standard. The +<TT +CLASS="STRUCTFIELD"> +<I> +usb_spec_lo</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +usb_spec_hi</I> +</TT> + fields identify the particular +revision of the standard that the peripheral implements, for example +revision 1.1.</P> +<P> +The device class, subclass, and protocol fields are used by generic +host-side USB software to determine which host-side device driver +should be loaded to interact with the peripheral. A number of standard +classes are defined, for example mass-storage devices and +human-interface devices. If a peripheral implements one of the +standard classes then a standard existing host-side device driver may +exist, eliminating the need to write a custom driver. The value +<TT +CLASS="LITERAL"> +0xFF</TT> + (<TT +CLASS="LITERAL"> +VENDOR</TT> +) is reserved for +peripherals that implement a vendor-specific protocol rather than a +standard one. Such peripherals will require a custom host-side device +driver. The value <TT +CLASS="LITERAL"> +0x00</TT> + +(<TT +CLASS="LITERAL"> +INTERFACE</TT> +) is reserved and indicates that the +protocol used by the peripheral is defined at the interface level +rather than for the peripheral as a whole.</P> +<P> +The <TT +CLASS="STRUCTFIELD"> +<I> +max_package_size</I> +</TT> + field specifies the +maximum length of a control message. There is a lower bound of eight +bytes, and typical hardware will not support anything larger because +control messages are usually small and not performance-critical.</P> +<P> +The <TT +CLASS="STRUCTFIELD"> +<I> +vendor_lo</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +vendor_hi</I> +</TT> + fields specify a vendor id, which +must be obtained from the USB Implementor's Forum. The numbers used in +the code fragment above are examples only and must not be used in real +USB peripherals. The product identifier is determined by the vendor, +and different USB peripherals should use different identifiers. The +device identifier field should indicate a release number in +binary-coded decimal.</P> +<P> +The above fields are all numerical in nature. A USB peripheral can +also provide a number of strings as described <A +HREF="usbs-enum.html#AEN159"> +below</A> +, for example the name of the +vendor can be provided. The various <TT +CLASS="STRUCTFIELD"> +<I> +_str</I> +</TT> + +fields act as indices into an array of strings, with index 0 +indicating that no string is available. </P> +<P> +A typical USB peripheral involves just a single configuration. However +more complicated peripherals can support multiple configurations. Only +one configuration will be active at any one time, and the host will +switch between them as appropriate. If a peripheral does involve +multiple configurations then typically it will be the responsibility +of application code to <A +HREF="usbs-control.html#AEN545"> +handle</A> + the standard +set-configuration control message.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN109"> +</A> +<H3> +<SPAN +CLASS="STRUCTNAME"> +usb_configuration_descriptor</SPAN> +</H3> +<P> +A USB peripheral involves at least one and possible several different +configurations. The <SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> + +structure requires a pointer to an array, possibly of length 1, of +<SPAN +CLASS="STRUCTNAME"> +usb_configuration_descriptor</SPAN> + structures. +Usually a single structure suffices:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usb_configuration_descriptor usb_configuration = { + length: USB_CONFIGURATION_DESCRIPTOR_LENGTH, + type: USB_CONFIGURATION_DESCRIPTOR_TYPE, + total_length_lo: USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_LO(1, 2), + total_length_hi: USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_HI(1, 2), + number_interfaces: 1, + configuration_id: 1, + configuration_str: 0, + attributes: USB_CONFIGURATION_DESCRIPTOR_ATTR_REQUIRED | + USB_CONFIGURATION_DESCRIPTOR_ATTR_SELF_POWERED, + max_power: 50 +}; + +const usbs_enumeration_data usb_enum_data = { + … + configurations: &usb_configuration, + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +The values for the <TT +CLASS="STRUCTFIELD"> +<I> +length</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +type</I> +</TT> + fields are determined by the standard. +The <TT +CLASS="STRUCTFIELD"> +<I> +total_length</I> +</TT> + field depends on the +number of interfaces and endpoints used by this configuration, and +convenience macros are provided to calculate this: the first argument +to the macros specify the number of interfaces, the second the number +of endpoints. The <TT +CLASS="STRUCTFIELD"> +<I> +number_interfaces</I> +</TT> + field +is self-explanatory. If the peripheral involves multiple +configurations then each one must have a unique id, and this will be +used in the set-configuration control message. The id +<TT +CLASS="LITERAL"> +0</TT> + is reserved, and a set-configuration control +message that uses this id indicates that the peripheral should be +inactive. Configurations can have a string description if required. +The <TT +CLASS="STRUCTFIELD"> +<I> +attributes</I> +</TT> + field must have the +<TT +CLASS="LITERAL"> +REQUIRED</TT> + bit set; the +<TT +CLASS="LITERAL"> +SELF_POWERED</TT> + bit informs the host that the +peripheral has its own power supply and will not draw any power over +the bus, leaving more bus power available to other peripherals; the +<TT +CLASS="LITERAL"> +REMOTE_WAKEUP</TT> + bit is used if the peripheral can +interrupt the host when the latter is in power-saving mode. For +peripherals that are not self-powered, the +<TT +CLASS="STRUCTFIELD"> +<I> +max_power</I> +</TT> + field specifies the power +requirements in units of 2mA.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN127"> +</A> +<H3> +<SPAN +CLASS="STRUCTNAME"> +usb_interface_descriptor</SPAN> +</H3> +<P> +A USB configuration involves one or more interfaces, typically +corresponding to different streams of data. For example, one interface +might involve video data while another interface is for audio. +Multiple interfaces in a single configuration will be active at the +same time.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usb_interface_descriptor usb_interface = { + length: USB_INTERFACE_DESCRIPTOR_LENGTH, + type: USB_INTERFACE_DESCRIPTOR_TYPE, + interface_id: 0, + alternate_setting: 0, + number_endpoints: 2, + interface_class: USB_INTERFACE_DESCRIPTOR_CLASS_VENDOR, + interface_subclass: USB_INTERFACE_DESCRIPTOR_SUBCLASS_VENDOR, + interface_protocol: USB_INTERFACE_DESCRIPTOR_PROTOCOL_VENDOR, + interface_str: 0 +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_interfaces: 1, + interfaces: &usb_interface, + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +Again, the <TT +CLASS="STRUCTFIELD"> +<I> +length</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +type</I> +</TT> + fields are specified by the standard. +Each interface within a configuration requires its own id. However, a +given interface may have several alternate settings, in other words +entries in the interfaces array with the same id but different +<TT +CLASS="STRUCTFIELD"> +<I> +alternate_setting</I> +</TT> + fields. For example, +there might be one setting which requires a bandwidth of 100K/s and +another setting that only needs 50K/s. The host can use the standard +set-interface control message to choose the most appropriate setting. +The handling of this request is the responsibility of higher-level +code, so the application may have to <A +HREF="usbs-control.html#AEN545"> +install</A> + its own handler.</P> +<P> +The number of endpoints used by an interface is specified in the +<TT +CLASS="STRUCTFIELD"> +<I> +number_endpoints</I> +</TT> + field. Exact details of +which endpoints are used is held in a separate array of endpoint +descriptors. The class, subclass and protocol fields are used by +host-side code to determine which host-side device driver should +handle this specific interface. Usually this is determined on a +per-peripheral basis in the +<SPAN +CLASS="STRUCTNAME"> +usb_device_descriptor</SPAN> + structure, but that can +defer the details to individual interfaces. A per-interface string +is allowed as well.</P> +<P> +For USB peripherals involving multiple configurations, the array of +<SPAN +CLASS="STRUCTNAME"> +usb_interface_descriptor</SPAN> + structures should +first contain all the interfaces for the first configuration, then all +the interfaces for the second configuration, and so on.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN142"> +</A> +<H3> +<SPAN +CLASS="STRUCTNAME"> +usb_endpoint_descriptor</SPAN> +</H3> +<P> +The host also needs information about which endpoint should be used +for what. This involves an array of endpoint descriptors:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usb_endpoint_descriptor usb_endpoints[] = { + { + length: USB_ENDPOINT_DESCRIPTOR_LENGTH, + type: USB_ENDPOINT_DESCRIPTOR_TYPE, + endpoint: USB_ENDPOINT_DESCRIPTOR_ENDPOINT_OUT | 1, + attributes: USB_ENDPOINT_DESCRIPTOR_ATTR_BULK, + max_packet_lo: 64, + max_packet_hi: 0, + interval: 0 + }, + { + length: USB_ENDPOINT_DESCRIPTOR_LENGTH, + type: USB_ENDPOINT_DESCRIPTOR_TYPE, + endpoint: USB_ENDPOINT_DESCRIPTOR_ENDPOINT_IN | 2, + attributes: USB_ENDPOINT_DESCRIPTOR_ATTR_BULK, + max_packet_lo: 64, + max_packet_hi: 0, + interval: 0 + } +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_endpoints: 2, + endpoints: usb_endpoints, + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +As usual the values for the <TT +CLASS="STRUCTFIELD"> +<I> +length</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +type</I> +</TT> + fields are specified by the standard. +The <TT +CLASS="STRUCTFIELD"> +<I> +endpoint</I> +</TT> + field gives both the endpoint +number and the direction, so in the above example endpoint 1 is used +for OUT (host to peripheral) transfers and endpoint 2 is used for IN +(peripheral to host) transfers. The +<TT +CLASS="STRUCTFIELD"> +<I> +attributes</I> +</TT> + field indicates the USB protocol +that should be used on this endpoint: <TT +CLASS="LITERAL"> +CONTROL</TT> +, +<TT +CLASS="LITERAL"> +ISOCHRONOUS</TT> +, <TT +CLASS="LITERAL"> +BULK</TT> + or +<TT +CLASS="LITERAL"> +INTERRUPT</TT> +. The +<TT +CLASS="STRUCTFIELD"> +<I> +max_packet</I> +</TT> + field specifies the maximum size +of a single USB packet. For bulk transfers this will typically be 64 +bytes. For isochronous transfers this can be up to 1023 bytes. For +interrupt transfers it can be up to 64 bytes, although usually a +smaller value will be used. The <TT +CLASS="STRUCTFIELD"> +<I> +interval</I> +</TT> + +field is ignored for control and bulk transfers. For isochronous +transfers it should be set to 1. For interrupt transfers it can be a +value between 1 and 255, and indicates the number of milliseconds +between successive polling operations.</P> +<P> +For USB peripherals involving multiple configurations or interfaces +the array of endpoint descriptors should be organized sequentially: +first the endpoints corresponding to the first interface of the first +configuration, then the second interface in that configuration, and so +on; then all the endpoints for all the interfaces in the second +configuration; etc.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN159"> +</A> +<H3> +Strings</H3> +<P> +The enumeration data can contain a number of strings with additional +information. Unicode encoding is used for the strings, and it is +possible for a peripheral to supply a given string in multiple +languages using the appropriate characters. The first two bytes of +each string give a length and type field. The first string is special; +after the two bytes header it consists of an array of 2-byte language +id codes, indicating the supported languages. The language code +0x0409 corresponds to English (United States). </P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const unsigned char* usb_strings[] = { + "\x04\x03\x09\x04", + "\x10\x03R\0e\0d\0 \0H\0a\0t\0" +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_strings: 2, + strings: usb_strings, + … +};</PRE> +</TD> +</TR> +</TABLE> +<P> +The default handler for standard control messages assumes that the +peripheral only uses a single language. If this is not the case then +higher-level code will have to handle the standard get-descriptor +control messages when a string descriptor is requested.</P> +</DIV> +<DIV +CLASS="REFSECT2"> +<A +NAME="AEN164"> +</A> +<H3> +<SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> +</H3> +<P> +The <SPAN +CLASS="STRUCTNAME"> +usbs_enumeration_data</SPAN> + data structure +collects together all the various descriptors that make up the +enumeration data. It is the responsibility of application code to +supply a suitable data structure and install it in the control +endpoints's <TT +CLASS="STRUCTFIELD"> +<I> +enumeration_data</I> +</TT> + field before +the USB device is started.</P> +</DIV> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-intro.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-start.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Introduction</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Starting up a USB Device</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-halt.html @@ -0,0 +1,306 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Halted Endpoints</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Sending Data to the Host" +HREF="usbs-start-tx.html"><LINK +REL="NEXT" +TITLE="Control Endpoints" +HREF="usbs-control.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-start-tx.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-control.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-HALT"> +Halted Endpoints</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN420"> +</A> +<H2> +Name</H2> +Halted Endpoints -- Support for Halting and Halted Endpoints</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN423"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +cyg_bool usbs_rx_endpoint_halted</CODE> +(usbs_rx_endpoint* ep);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_set_rx_endpoint_halted</CODE> +(usbs_rx_endpoint* ep, cyg_bool new_state);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_rx_endpoint_wait</CODE> +(usbs_rx_endpoint* ep, void (*)(void*, int) complete_fn, void * complete_data);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +cyg_bool +usbs_tx_endpoint_halted</CODE> +(usbs_tx_endpoint* ep);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_set_tx_endpoint_halted</CODE> +(usbs_tx_endpoint* ep, cyg_bool new_state);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_tx_endpoint_wait</CODE> +(usbs_tx_endpoint* ep, void (*)(void*, int) complete_fn, void * complete_data);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN468"> +</A> +<H2> +<TT +CLASS="FUNCTION"> +Description</TT> +</H2> +<P> +Normal USB traffic involves straightforward handshakes, with either an +<TT +CLASS="LITERAL"> +ACK</TT> + to indicate that a packet was transferred +without errors, or a <TT +CLASS="LITERAL"> +NAK</TT> + if an error occurred, or +if a peripheral is currently unable to process another packet from the +host, or has no packet to send to the host. There is a third form of +handshake, a <TT +CLASS="LITERAL"> +STALL</TT> +, which indicates that the +endpoint is currently <I +CLASS="EMPHASIS"> +halted</I> +.</P> +<P> +When an endpoint is halted it means that the host-side code needs to +take some sort of recovery action before communication over that +endpoint can resume. The exact circumstances under which this can +happen are not defined by the USB specification, but one example would +be a protocol violation if say the peripheral attempted to transmit +more data to the host than was permitted by the protocol in use. The +host can use the standard control messages get-status, set-feature and +clear-feature to examine and manipulate the halted status of a given +endpoint. There are USB-specific functions which can be used inside +the peripheral to achieve the same effect. Once an endpoint has been +halted the host can then interact with the peripheral using class or +vendor control messages to perform appropriate recovery, and then the +halted condition can be cleared.</P> +<P> +Halting an endpoint does not constitute a device state change, and +there is no mechanism by which higher-level code can be informed +immediately. However, any ongoing receive or transmit operations will +be aborted with an <TT +CLASS="LITERAL"> +-EAGAIN</TT> + error, and any new +receives or transmits will fail immediately with the same error.</P> +<P> +There are six functions to support halted endpoints, one set for +receive endpoints and another for transmit endpoints, with both sets +behaving in essentially the same way. The first, +<TT +CLASS="FUNCTION"> +usbs_rx_endpoint_halted</TT> +, can be used to determine +whether or not an endpoint is currently halted: it takes a single +argument that identifies the endpoint of interest. The second +function, <TT +CLASS="FUNCTION"> +usbs_set_rx_endpoint_halted</TT> +, can be +used to change the halted condition of an endpoint: it takes two +arguments; one to identify the endpoint and another to specify the new +state. The last function +<TT +CLASS="FUNCTION"> +usbs_start_rx_endpoint_wait</TT> + operates in much the +same way as <TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +: when the +endpoint is no longer halted the device driver will invoke the +supplied completion function with a status of 0. The completion +function has the same signature as that for a transfer operation. +Often it will be possible to use a single completion function and have +the foreground code invoke either +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + or +<TT +CLASS="FUNCTION"> +usbs_start_rx_endpoint_wait</TT> + depending on the +current state of the endpoint.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-start-tx.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-control.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Sending Data to the Host</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Control Endpoints</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-intro.html @@ -0,0 +1,470 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Introduction</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="NEXT" +TITLE="USB Enumeration Data" +HREF="usbs-enum.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="io-usb-slave.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-enum.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-INTRO"> +Introduction</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN6"> +</A> +<H2> +Name</H2> +Introduction -- eCos support for USB slave devices</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN9"> +</A> +<H2> +Introduction</H2> +<P> +The eCos USB slave support allows developers to produce USB +peripherals. It consists of a number of different eCos packages:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +Device drivers for specific implementations of USB slave hardware, for +example the on-chip USB Device Controller provided by the Intel SA1110 +processor. A typical USB peripheral will only provide one USB slave +port and therefore only one such device driver package will be needed. +Usually the device driver package will be loaded automatically when +you create an eCos configuration for target hardware that has a USB +slave device. If you select a target which does have a USB slave +device but no USB device driver is loaded, this implies that no such +device driver is currently available.</P> +</LI> +<LI> +<P> +The common USB slave package. This serves two purposes. It defines the +API that specific device drivers should implement. It also provides +various utilities that will be needed by most USB device drivers and +applications, such as handlers for standard control messages. +Usually this package will be loaded automatically at the same time as +the USB device driver.</P> +</LI> +<LI> +<P> +The common USB package. This merely provides some information common +to both the host and slave sides of USB, such as details of the +control protocol. It is also used to place the other USB-related +packages appropriately in the overall configuration hierarchy. Usually +this package will be loaded at the same time as the USB device driver.</P> +</LI> +<LI> +<P> +Class-specific USB support packages. These make it easier to develop +specific classes of USB peripheral, such as a USB-ethernet device. If +no suitable package is available for a given class of peripheral then +the USB device driver can instead be accessed directly from +application code. Such packages will never be loaded automatically +since the configuration system has no way of knowing what class of USB +peripheral is being developed. Instead developers have to add the +appropriate package or packages explicitly.</P> +</LI> +</OL> +<P> +These packages only provide support for developing USB peripherals, +not USB hosts.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN22"> +</A> +<H2> +USB Concepts</H2> +<P> +Information about USB can be obtained from a number of sources +including the <A +HREF="http://www.usb.org/" +TARGET="_top"> +USB Implementers Forum +web site</A> +. Only a brief summary is provided here.</P> +<P> +A USB network is asymmetrical: it consists of a single host, one or +more slave devices, and possibly some number of intermediate hubs. The +host side is significantly more complicated than the slave side. +Essentially, all operations are initiated by the host. For example, if +the host needs to receive some data from a particular USB peripheral +then it will send an IN token to that peripheral; the latter should +respond with either a NAK or with appropriate data. Similarly, when +the host wants to transmit data to a peripheral it will send an OUT +token followed by the data; the peripheral will return a NAK if it is +currently unable to receive more data or if there was corruption, +otherwise it will return an ACK. All transfers are check-summed and +there is a clearly-defined error recovery process. USB peripherals can +only interact with the host, not with each other.</P> +<P> +USB supports four different types of communication: control messages, +interrupt transfers, isochronous transfers, and bulk transfers. +Control messages are further subdivided into four categories: +standard, class, vendor and a reserved category. All USB peripherals +must respond to certain standard control messages, and usually this +will be handled by the common USB slave package (for complicated +peripherals, application support will be needed). Class and vendor +control messages may be handled by an class-specific USB support +package, for example the USB-ethernet package will handle control +messages such as getting the MAC address or enabling/disabling +promiscuous mode. Alternatively, some or all of these messages will +have to be handled by application code.</P> +<P> +Interrupt transfers are used for devices which need to be polled +regularly. For example, a USB keyboard might be polled once every +millisecond. The host will not poll the device more frequently than +this, so interrupt transfers are best suited to peripherals that +involve a relatively small amount of data. Isochronous transfers are +intended for multimedia-related peripherals where typically a large +amount of video or audio data needs to be exchanged continuously. +Given appropriate host support a USB peripheral can reserve some of +the available bandwidth. Isochronous transfers are not reliable; if a +particular packet is corrupted then it will just be discarded and +software is expected to recover from this. Bulk transfers are used for +everything else: after taking care of any pending control, isochronous +and interrupt transfers the host will use whatever bandwidth remains +for bulk transfers. Bulk transfers are reliable.</P> +<P> +Transfers are organized into USB packets, with the details depending +on the transfer type. Control messages always involve an initial +8-byte packet from host to peripheral, optionally followed by some +additional packets; in theory these additional packets can be up to 64 +bytes, but hardware may limit it to 8 bytes. Interrupt transfers +involve a single packet of up to 64 bytes. Isochronous transfers +involve a single packet of up to 1024 bytes. Bulk transfers involve +multiple packets. There will be some number, possibly zero, of 64-byte +packets. The transfer is terminated by a single packet of less than 64 +bytes. If the transfer involves an exact multiple of 64 bytes than the +final packet will be 0 bytes, consisting of just a header and checksum +which typically will be generated by the hardware. There is no +pre-defined limit on the size of a bulk transfer. Instead higher-level +protocols are expected to handle this, so for a USB-ethernet +peripheral the protocol could impose a limit of 1514 bytes of data +plus maybe some additional protocol overhead.</P> +<P> +Transfers from the host to a peripheral are addressed not just to that +peripheral but to a specific endpoint within that peripheral. +Similarly, the host requests incoming data from a specific endpoint +rather than from the peripheral as a whole. For example, a combined +keyboard/touchpad device could provide the keyboard events on endpoint +1 and the mouse events on endpoint 2. A given USB peripheral can have +up to 16 endpoints for incoming data and another 16 for outgoing data. +However, given the comparatively high speed of USB I/O this endpoint +addressing is typically implemented in hardware rather than software, +and the hardware will only implement a small number of endpoints. +Endpoint 0 is generally used only for control messages.</P> +<P> +In practice, many of these details are irrelevant to application code +or to class packages. Instead, such higher-level code usually just +performs blocking <TT +CLASS="FUNCTION"> +read</TT> + and +<TT +CLASS="FUNCTION"> +write</TT> +, or non-blocking USB-specific calls, to +transfer data between host and target via a specific endpoint. Control +messages are more complicated but are usually handled by existing +code.</P> +<P> +When a USB peripheral is plugged into the host there is an initial +enumeration and configuration process. The peripheral provides +information such as its class of device (audio, video, etc.), a +vendor id, which endpoints should be used for what kind of data, and +so on. The host OS uses this information to identify a suitable host +device driver. This could be a generic driver for a class of +peripherals, or it could be a vendor-specific driver. Assuming a +suitable driver is installed the host will then activate the USB +peripheral and perform additional application-specific initialisation. +For example for a USB-ethernet device this would involve obtaining an +ethernet MAC address. Most USB peripherals will be fairly simple, but +it is possible to build multifunction peripherals with multiple +configurations, interfaces, and alternate interface settings.</P> +<P> +It is not possible for any of the eCos packages to generate all the +enumeration data automatically. Some of the required information such +as the vendor id cannot be supplied by generic packages; only by the +application developer. Class support code such as the USB-ethernet +package could in theory supply some of the information automatically, +but there are also hardware dependencies such as which endpoints get +used for incoming and outgoing ethernet frames. Instead it is the +responsibility of the application developer to provide all the +enumeration data and perform some additional initialisation. In +addition, the common USB slave package can handle all the standard +control messages for a simple USB peripheral, but for something like a +multifunction peripheral additional application support is needed.</P> +<DIV +CLASS="NOTE"> +<BLOCKQUOTE +CLASS="NOTE"> +<P> +<B> +Note: </B> +The initial implementation of the eCos USB slave packages involved +hardware that only supported control and bulk transfers, not +isochronous or interrupt. There may be future changes to the USB +code and API to allow for isochronous and interrupt transfers, +especially the former. Other changes may be required to support +different USB devices. At present there is no support for USB remote +wakeups, since again it is not supported by the hardware.</P> +</BLOCKQUOTE> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN38"> +</A> +<H2> +eCos USB I/O Facilities</H2> +<P> +For protocols other than control messages, eCos provides two ways of +performing USB I/O. The first involves device table or devtab entries such +as <A +HREF="usbs-devtab.html"> +<TT +CLASS="LITERAL"> +/dev/usb1r</TT> +</A> +, +with one entry per endpoint per USB device. It is possible to +<TT +CLASS="FUNCTION"> +open</TT> + these devices and use conventional blocking +I/O functions such as <TT +CLASS="FUNCTION"> +read</TT> + and +<TT +CLASS="FUNCTION"> +write</TT> + to exchange data between host and +peripheral.</P> +<P> +There is also a lower-level USB-specific API, consisting of functions +such as <A +HREF="usbs-start-rx.html"> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +</A> +. +A USB device driver will supply a data structure for each endpoint, +for example a <A +HREF="usbs-data.html"> +<SPAN +CLASS="STRUCTNAME"> +usbs_rx_endpoint</SPAN> +</A> + +structure for every receive endpoint. The first argument to +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + should be a pointer to such +a data structure. The USB-specific API is non-blocking: the initial +call merely starts the transfer; some time later, once the transfer +has completed or has been aborted, the device driver will invoke a +completion function.</P> +<P> +Control messages are different. With four different categories of +control messages including application and vendor specific ones, the +conventional +<TT +CLASS="FUNCTION"> +open</TT> +/<TT +CLASS="FUNCTION"> +read</TT> +/<TT +CLASS="FUNCTION"> +write</TT> + +model of I/O cannot easily be applied. Instead, a USB device driver +will supply a <A +HREF="usbs-control.html"> +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> +</A> + +data structure which can be manipulated appropriately. In practice the +standard control messages will usually be handled by the common USB +slave package, and other control messages will be handled by +class-specific code such as the USB-ethernet package. Typically, +application code remains responsible for supplying the <A +HREF="usbs-enum.html"> +enumeration data</A> + and for actually <A +HREF="usbs-start.html"> +starting</A> + up the USB device.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN60"> +</A> +<H2> +Enabling the USB code</H2> +<P> +If the target hardware contains a USB slave device then the +appropriate USB device driver and the common packages will typically +be loaded into the configuration automatically when that target is +selected (assuming a suitable device driver exists). However, the +driver will not necessarily be active. For example a processor might +have an on-chip USB device, but not all applications using that +processor will want to use USB functionality. Hence by default the USB +device is disabled, ensuring that applications do not suffer any +memory or other penalties for functionality that is not required.</P> +<P> +If the application developer explicitly adds a class support package +such as the USB-ethernet one then this implies that the USB device is +actually needed, and the device will be enabled automatically. +However, if no suitable class package is available and the USB device +will instead be accessed by application code, it is necessary to +enable the USB device manually. Usually the easiest way to do this is +to enable the configuration option +<TT +CLASS="LITERAL"> +CYGGLO_IO_USB_SLAVE_APPLICATION</TT> +, and the USB device +driver and related packages will adjust accordingly. Alternatively, +the device driver may provide some configuration options to provide +more fine-grained control.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-enum.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +eCos USB Slave Support</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +USB Enumeration Data</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-start-rx.html @@ -0,0 +1,438 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Receiving Data from the Host</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Devtab Entries" +HREF="usbs-devtab.html"><LINK +REL="NEXT" +TITLE="Sending Data to the Host" +HREF="usbs-start-tx.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-devtab.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-start-tx.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-START-RX"> +Receiving Data from the Host</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN277"> +</A> +<H2> +Name</H2> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + -- Receiving Data from the Host</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN281"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_rx_buffer</CODE> +(usbs_rx_endpoint* ep, unsigned char* buffer, int length, void (*)(void*,int) complete_fn, void * complete_data);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_rx</CODE> +(usbs_rx_endpoint* ep);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN302"> +</A> +<H2> +<TT +CLASS="FUNCTION"> +Description</TT> +</H2> +<P> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + is a USB-specific function +to accept a transfer from host to peripheral. It can be used for bulk, +interrupt or isochronous transfers, but not for control messages. +Instead those involve manipulating the <A +HREF="usbs-control.html"> +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> +</A> + +data structure directly. The function takes five arguments:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +The first argument identifies the specific endpoint that should be +used. Different USB devices will support different sets of endpoints +and the device driver will provide appropriate data structures. The +device driver's documentation should be consulted for details of which +endpoints are available.</P> +</LI> +<LI> +<P> +The <TT +CLASS="PARAMETER"> +<I> +buffer</I> +</TT> + and <TT +CLASS="PARAMETER"> +<I> +length</I> +</TT> + +arguments control the actual transfer. USB device drivers are not +expected to perform any buffering or to support partial transfers, so +the length specified should correspond to the maximum transfer that is +currently possible and the buffer should be at least this large. For +isochronous transfers the USB specification imposes an upper bound of +1023 bytes, and a smaller limit may be set in the <A +HREF="usbs-enum.html#AEN142"> +enumeration data</A> +. Interrupt +transfers are similarly straightforward with an upper bound of 64 +bytes, or less as per the enumeration data. Bulk transfers are more +complicated because they can involve multiple 64-byte packets plus a +terminating packet of less than 64 bytes, so there is no predefined +limit on the transfer size. Instead it is left to higher-level +protocols to specify an appropriate upper bound.</P> +<P> +One technique that may work for bulk transfers is to exploit the fact +that such transfers happen in 64-byte packets: it may be possible to +receive an initial 64 bytes, corresponding to the first packet in the +transfer; these 64 bytes can then be examined to determine the total +transfer size, and the remaining data can be transferred in another +receive operation. This technique is not guaranteed to work with all +USB hardware. Also, if the delay between accepting the first packet and +the remainder of the transfer is excessive then this could cause +timeout problems for the host-side software. For these reasons this +technique should be avoided.</P> +</LI> +<LI> +<P> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + is non-blocking. It merely +starts the receive operation, and does not wait for completion. At +some later point the USB device driver will invoke the completion +function parameter with two arguments: the completion data defined by +the last parameter and a result field. A result >= +<TT +CLASS="LITERAL"> +0</TT> + indicates a successful transfer of that many +bytes, which may be less than the upper bound imposed by the +<TT +CLASS="PARAMETER"> +<I> +length</I> +</TT> + argument. A result < +<TT +CLASS="LITERAL"> +0</TT> + indicates an error. The most likely errors are +<TT +CLASS="LITERAL"> +-EPIPE</TT> + to indicate that the connection between the +host and the target has been broken, and <TT +CLASS="LITERAL"> +-EAGAIN</TT> + +for when the endpoint has been <A +HREF="usbs-halt.html"> +halted</A> +. Specific USB device drivers may +specify additional error conditions.</P> +</LI> +</OL> +<P> +The normal sequence of events is that the USB device driver will +update the appropriate hardware registers. At some point after that +the host will attempt to send data by transmitting an OUT token +followed by a data packet, and since a receive operation is now in +progress the data will be accepted and ACK'd. If there were no receive +operation then the peripheral would instead generate a NAK. The USB +hardware will generate an interrupt once the whole packet has been +received, and the USB device driver will service this interrupt and +arrange for a DSR to be called. Isochronous and interrupt transfers +involve just a single packet. However, bulk transfers may involve +multiple packets so the device driver has to check whether the packet +was a full 64 bytes or whether it was a terminating packet of less +than this. When the device driver DSR detects a complete transfer it +will inform higher-level code by invoking the supplied completion +function.</P> +<P> +This means that the completion function will normally be invoked by a +DSR and not in thread context - although some USB device drivers may +have a different implementation. Therefore the completion function is +restricted in what it can do. In particular it must not make any +calls that will or may block such as locking a mutex or allocating +memory. The kernel documentation should be consulted for more details +of DSR's and interrupt handling generally.</P> +<P> +It is possible that the completion function will be invoked before +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + returns. Such an event would +be unusual because the transfer cannot happen until the next time the +host tries to send data to this peripheral, but it may happen if for +example another interrupt happens and a higher priority thread is +scheduled to run. Also, if the endpoint is currently halted then the +completion function will be invoked immediately with +<TT +CLASS="LITERAL"> +-EAGAIN</TT> +: typically this will happen in the current +thread rather than in a separate DSR. The completion function is +allowed to start another transfer immediately by calling +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + again.</P> +<P> +USB device drivers are not expected to perform any locking. It is the +responsibility of higher-level code to ensure that there is only one +receive operation for a given endpoint in progress at any one time. If +there are concurrent calls to +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + then the resulting behaviour +is undefined. For typical USB applications this does not present any +problems, because only one piece of code will access a given endpoint +at any particular time.</P> +<P> +The following code fragment illustrates a very simple use of +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> + to implement a blocking +receive, using a semaphore to synchronise between the foreground +thread and the DSR. For a simple example like this no completion data +is needed.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +static int error_code = 0; +static cyg_sem_t completion_wait; + +static void +completion_fn(void* data, int result) +{ + error_code = result; + cyg_semaphore_post(&completion_wait); +} + +int +blocking_receive(usbs_rx_endpoint* ep, unsigned char* buf, int len) +{ + error_code = 0; + usbs_start_rx_buffer(ep, buf, len, &completion_fn, NULL); + cyg_semaphore_wait(&completion_wait); + return error_code; +}</PRE> +</TD> +</TR> +</TABLE> +<P> +There is also a utility function <TT +CLASS="FUNCTION"> +usbs_start_rx</TT> +. This +can be used by code that wants to manipulate <A +HREF="usbs-data.html"> +data endpoints</A> + directly, specifically the +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +complete_data</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + fields. +<TT +CLASS="FUNCTION"> +usbs_start_tx</TT> + just invokes a function +supplied by the device driver.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-devtab.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-start-tx.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Devtab Entries</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Sending Data to the Host</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-start-tx.html @@ -0,0 +1,430 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Sending Data to the Host</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Receiving Data from the Host" +HREF="usbs-start-rx.html"><LINK +REL="NEXT" +TITLE="Halted Endpoints" +HREF="usbs-halt.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-start-rx.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-halt.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-START-TX"> +Sending Data to the Host</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN349"> +</A> +<H2> +Name</H2> +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + -- Sending Data to the Host</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN353"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_tx_buffer</CODE> +(usbs_tx_endpoint* ep, const unsigned char* buffer, int length, void (*)(void*,int) complete_fn, void * complete_data);</CODE> +</P> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start_tx</CODE> +(usbs_tx_endpoint* ep);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN374"> +</A> +<H2> +<TT +CLASS="FUNCTION"> +Description</TT> +</H2> +<P> +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + is a USB-specific function +to transfer data from peripheral to host. It can be used for bulk, +interrupt or isochronous transfers, but not for control messages; +instead those involve manipulating the <A +HREF="usbs-control.html"> +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> +</A> + +data structure directly. The function takes five arguments:</P> +<P> +</P> +<OL +TYPE="1"> +<LI> +<P> +The first argument identifies the specific endpoint that should be +used. Different USB devices will support different sets of endpoints +and the device driver will provide appropriate data structures. The +device driver's documentation should be consulted for details of which +endpoints are available.</P> +</LI> +<LI> +<P> +The <TT +CLASS="PARAMETER"> +<I> +buffer</I> +</TT> + and <TT +CLASS="PARAMETER"> +<I> +length</I> +</TT> + +arguments control the actual transfer. USB device drivers are not +allowed to modify the buffer during the transfer, so the data can +reside in read-only memory. The transfer will be for all the data +specified, and it is the responsibility of higher-level code to make +sure that the host is expecting this amount of data. For isochronous +transfers the USB specification imposes an upper bound of 1023 bytes, +but a smaller limit may be set in the <A +HREF="usbs-enum.html#AEN142"> +enumeration data</A> +. Interrupt +transfers have an upper bound of 64 bytes or less, as per the +enumeration data. Bulk transfers are more complicated because they can +involve multiple 64-byte packets plus a terminating packet of less +than 64 bytes, so the basic USB specification does not impose an upper +limit on the total transfer size. Instead it is left to higher-level +protocols to specify an appropriate upper bound. If the peripheral +attempts to send more data than the host is willing to accept then the +resulting behaviour is undefined and may well depend on the specific +host operating system being used.</P> +<P> +For bulk transfers, the USB device driver or the underlying hardware +will automatically split the transfer up into the appropriate number +of full-size 64-byte packets plus a single terminating packet, which +may be 0 bytes.</P> +</LI> +<LI> +<P> +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + is non-blocking. It merely +starts the transmit operation, and does not wait for completion. At +some later point the USB device driver will invoke the completion +function parameter with two arguments: the completion data defined by +the last parameter, and a result field. This result will be either an +error code < <TT +CLASS="LITERAL"> +0</TT> +, or the amount of data +transferred which should correspond to the +<TT +CLASS="PARAMETER"> +<I> +length</I> +</TT> + argument. The most likely errors are +<TT +CLASS="LITERAL"> +-EPIPE</TT> + to indicate that the connection between the +host and the target has been broken, and <TT +CLASS="LITERAL"> +-EAGAIN</TT> + +for when the endpoint has been <A +HREF="usbs-halt.html"> +halted</A> +. Specific USB device drivers may +define additional error conditions.</P> +</LI> +</OL> +<P> +The normal sequence of events is that the USB device driver will +update the appropriate hardware registers. At some point after that +the host will attempt to fetch data by transmitting an IN token. Since +a transmit operation is now in progress the peripheral can send a +packet of data, and the host will generate an ACK. At this point the +USB hardware will generate an interrupt, and the device driver will +service this interrupt and arrange for a DSR to be called. Isochronous +and interrupt transfers involve just a single packet. However, bulk +transfers may involve multiple packets so the device driver has to +check whether there is more data to send and set things up for the +next packet. When the device driver DSR detects a complete transfer it +will inform higher-level code by invoking the supplied completion +function.</P> +<P> +This means that the completion function will normally be invoked by a +DSR and not in thread context - although some USB device drivers may +have a different implementation. Therefore the completion function is +restricted in what it can do, in particular it must not make any +calls that will or may block such as locking a mutex or allocating +memory. The kernel documentation should be consulted for more details +of DSR's and interrupt handling generally.</P> +<P> +It is possible that the completion function will be invoked before +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + returns. Such an event would +be unusual because the transfer cannot happen until the next time the +host tries to fetch data from this peripheral, but it may happen if, +for example, another interrupt happens and a higher priority thread is +scheduled to run. Also, if the endpoint is currently halted then the +completion function will be invoked immediately with +<TT +CLASS="LITERAL"> +-EAGAIN</TT> +: typically this will happen in the current +thread rather than in a separate DSR. The completion function is +allowed to start another transfer immediately by calling +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + again.</P> +<P> +USB device drivers are not expected to perform any locking. It is the +responsibility of higher-level code to ensure that there is only one +transmit operation for a given endpoint in progress at any one time. +If there are concurrent calls to +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + then the resulting behaviour +is undefined. For typical USB applications this does not present any +problems because only piece of code will access a given endpoint at +any particular time.</P> +<P> +The following code fragment illustrates a very simple use of +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> + to implement a blocking +transmit, using a semaphore to synchronise between the foreground +thread and the DSR. For a simple example like this no completion data +is needed.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +static int error_code = 0; +static cyg_sem_t completion_wait; + +static void +completion_fn(void* data, int result) +{ + error_code = result; + cyg_semaphore_post(&completion_wait); +} + +int +blocking_transmit(usbs_tx_endpoint* ep, const unsigned char* buf, int len) +{ + error_code = 0; + usbs_start_tx_buffer(ep, buf, len, &completion_fn, NULL); + cyg_semaphore_wait(&completion_wait); + return error_code; +}</PRE> +</TD> +</TR> +</TABLE> +<P> +There is also a utility function <TT +CLASS="FUNCTION"> +usbs_start</TT> +. This +can be used by code that wants to manipulate <A +HREF="usbs-data.html"> +data endpoints</A> + directly, specifically the +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +complete_data</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> + fields. +<TT +CLASS="FUNCTION"> +usbs_start_tx</TT> + just calls a function supplied by +the device driver.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-start-rx.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-halt.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Receiving Data from the Host</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Halted Endpoints</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-start.html @@ -0,0 +1,258 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Starting up a USB Device</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="USB Enumeration Data" +HREF="usbs-enum.html"><LINK +REL="NEXT" +TITLE="Devtab Entries" +HREF="usbs-devtab.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-enum.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> +<A +HREF="usbs-devtab.html"> +Next</A> +</TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-START"> +Starting up a USB Device</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN173"> +</A> +<H2> +Name</H2> +<TT +CLASS="FUNCTION"> +usbs_start</TT> + -- Starting up a USB Device</DIV> +<DIV +CLASS="REFSYNOPSISDIV"> +<A +NAME="AEN177"> +</A> +<H2> +Synopsis</H2> +<DIV +CLASS="FUNCSYNOPSIS"> +<P> +</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="FUNCSYNOPSISINFO"> +#include <cyg/io/usb/usbs.h></PRE> +</TD> +</TR> +</TABLE> +<P> +<CODE> +<CODE +CLASS="FUNCDEF"> +void usbs_start</CODE> +(usbs_control_endpoint* ep0);</CODE> +</P> +<P> +</P> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN185"> +</A> +<H2> +Description</H2> +<P> +Initializing a USB device requires some support from higher-level +code, typically the application, in the form of enumeration data. +Hence it is not possible for the low-level USB driver to activate a +USB device itself. Instead the higher-level code has to take care of +this by invoking <TT +CLASS="FUNCTION"> +usbs_start</TT> +. This function takes +a pointer to a USB control endpoint data structure. USB device drivers +should provide exactly one such data structure for every USB device, +so the pointer uniquely identifies the device.</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +const usbs_enumeration_data usb_enum_data = { + … +}; + +int +main(int argc, char** argv) +{ + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_start(&usbs_sa11x0_ep0); + … +}</PRE> +</TD> +</TR> +</TABLE> +<P> +The exact behaviour of <TT +CLASS="FUNCTION"> +usbs_start</TT> + depends on the +USB hardware and the device driver. A typical implementation would +change the USB data pins from tristated to active. If the peripheral +is already plugged into a host then the latter should detect this +change and start interacting with the peripheral, including requesting +the enumeration data. Some of this may happen before +<TT +CLASS="FUNCTION"> +usbs_start</TT> + returns, but given that multiple +interactions between USB host and peripheral are required it is likely +that the function will return before the peripheral is fully +configured. Control endpoints provide a <A +HREF="usbs-control.html#AEN515"> +mechanism</A> + for informing +higher-level code of USB state changes. +<TT +CLASS="FUNCTION"> +usbs_start</TT> + will return even if the peripheral is +not currently connected to a host: it will not block until the +connection is established.</P> +<P> +<TT +CLASS="FUNCTION"> +usbs_start</TT> + should only be called once for a given +USB device. There are no defined error conditions. Note that the +function affects the entire USB device and not just the control +endpoint: there is no need to start any data endpoints as well.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-enum.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +<A +HREF="usbs-devtab.html"> +Next</A> +</TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +USB Enumeration Data</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> +Devtab Entries</TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs-writing.html @@ -0,0 +1,578 @@ +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<HTML> +<HEAD> +<TITLE> +Writing a USB Device Driver</TITLE> +<META +NAME="GENERATOR" +CONTENT="Modular DocBook HTML Stylesheet Version 1.54"><LINK +REL="HOME" +TITLE="eCos USB Slave Support" +HREF="io-usb-slave.html"><LINK +REL="PREVIOUS" +TITLE="Data Endpoints" +HREF="usbs-data.html"></HEAD> +<BODY +CLASS="REFENTRY" +BGCOLOR="#FFFFFF" +TEXT="#000000" +LINK="#0000FF" +VLINK="#840084" +ALINK="#0000FF"> +<DIV +CLASS="NAVHEADER"> +<TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TH +COLSPAN="3" +ALIGN="center"> +eCos USB Slave Support</TH> +</TR> +<TR> +<TD +WIDTH="10%" +ALIGN="left" +VALIGN="bottom"> +<A +HREF="usbs-data.html"> +Prev</A> +</TD> +<TD +WIDTH="80%" +ALIGN="center" +VALIGN="bottom"> +</TD> +<TD +WIDTH="10%" +ALIGN="right" +VALIGN="bottom"> + </TD> +</TR> +</TABLE> +<HR +ALIGN="LEFT" +WIDTH="100%"></DIV> +<H1> +<A +NAME="USBS-WRITING"> +Writing a USB Device Driver</A> +</H1> +<DIV +CLASS="REFNAMEDIV"> +<A +NAME="AEN668"> +</A> +<H2> +Name</H2> +Writing a USB Device Driver -- USB Device Driver Porting Guide</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN671"> +</A> +<H2> +Introduction</H2> +<P> +Often the best way to write a USB device driver will be to start with +an existing one and modify it as necessary. The information given here +is intended primarily as an outline rather than as a complete guide.</P> +<DIV +CLASS="NOTE"> +<BLOCKQUOTE +CLASS="NOTE"> +<P> +<B> +Note: </B> +At the time of writing only one USB device driver has been +implemented. Hence it is possible, perhaps probable, that some +portability issues have not yet been addressed. One issue +involves the different types of transfer, for example the initial +target hardware had no support for isochronous or interrupt transfers, +so additional functionality may be needed to switch between transfer +types. Another issue would be hardware where a given endpoint number, +say endpoint 1, could be used for either receiving or transmitting +data, but not both because a single fifo is used. Issues like these +will have to be resolved as and when additional USB device drivers are +written.</P> +</BLOCKQUOTE> +</DIV> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN676"> +</A> +<H2> +The Control Endpoint</H2> +<P> +A USB device driver should provide a single <A +HREF="usbs-control.html"> +<SPAN +CLASS="STRUCTNAME"> +usbs_control_endpoint</SPAN> +</A> + +data structure for every USB device. Typical peripherals will have +only one USB port so there will be just one such data structure in the +entire system, but theoretically it is possible to have multiple USB +devices. These may all involve the same chip, in which case a single +device driver should support multiple device instances, or they may +involve different chips. The name or names of these data structures +are determined by the device driver, but appropriate care should be +taken to avoid name clashes. </P> +<P> +A USB device cannot be used unless the control endpoint data structure +exists. However, the presence of USB hardware in the target processor +or board does not guarantee that the application will necessarily want +to use that hardware. To avoid unwanted code or data overheads, the +device driver can provide a configuration option to determine whether +or not the endpoint 0 data structure is actually provided. A default +value of <TT +CLASS="LITERAL"> +CYGINT_IO_USB_SLAVE_CLIENTS</TT> + ensures that +the USB driver will be enabled automatically if higher-level code does +require USB support, while leaving ultimate control to the user.</P> +<P> +The USB device driver is responsible for filling in the +<TT +CLASS="STRUCTFIELD"> +<I> +start_fn</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +poll_fn</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +interrupt_vector</I> +</TT> + fields. Usually this can +be achieved by static initialization. The driver is also largely +responsible for maintaining the <TT +CLASS="STRUCTFIELD"> +<I> +state</I> +</TT> + +field. The <TT +CLASS="STRUCTFIELD"> +<I> +control_buffer</I> +</TT> + array should be +used to hold the first packet of a control message. The +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> + and other fields related to data +transfers will be managed <A +HREF="usbs-control.html#AEN578"> +jointly</A> + by higher-level code and +the device driver. The remaining fields are generally filled in by +higher-level code, although the driver should initialize them to NULL +values.</P> +<P> +Hardware permitting, the USB device should be inactive until the +<TT +CLASS="STRUCTFIELD"> +<I> +start_fn</I> +</TT> + is invoked, for example by +tristating the appropriate pins. This prevents the host from +interacting with the peripheral before all other parts of the system +have initialized. It is expected that the +<TT +CLASS="STRUCTFIELD"> +<I> +start_fn</I> +</TT> + will only be invoked once, shortly +after power-up.</P> +<P> +Where possible the device driver should detect state changes, such as +when the connection between host and peripheral is established, and +<A +HREF="usbs-control.html#AEN515"> +report</A> + these to higher-level +code via the <TT +CLASS="STRUCTFIELD"> +<I> +state_change_fn</I> +</TT> + callback, if +any. The state change to and from configured state cannot easily be +handled by the device driver itself, instead higher-level code such as +the common USB slave package will take care of this.</P> +<P> +Once the connection between host and peripheral has been established, +the peripheral must be ready to accept control messages at all times, +and must respond to these within certain time constraints. For +example, the standard set-address control message must be handled +within 50ms. The USB specification provides more information on these +constraints. The device driver is responsible for receiving the +initial packet of a control message. This packet will always be eight +bytes and should be stored in the +<TT +CLASS="STRUCTFIELD"> +<I> +control_buffer</I> +</TT> + field. Certain standard +control messages should be detected and handled by the device driver +itself. The most important is set-address, but usually the get-status, +set-feature and clear-feature requests when applied to halted +endpoints should also be handled by the driver. Other standard control +messages should first be passed on to the +<TT +CLASS="STRUCTFIELD"> +<I> +standard_control_fn</I> +</TT> + callback (if any), and +finally to the default handler +<TT +CLASS="FUNCTION"> +usbs_handle_standard_control</TT> + provided by the +common USB slave package. Class, vendor and reserved control messages +should always be dispatched to the appropriate callback and there is +no default handler for these.</P> +<P> +Some control messages will involve further data transfer, not just the +initial packet. The device driver must handle this in accordance with +the USB specification and the <A +HREF="usbs-control.html#AEN578"> +buffer management strategy</A> +. The +driver is also responsible for keeping track of whether or not the +control operation has succeeded and generating an ACK or STALL +handshake. </P> +<P> +The polling support is optional and may not be feasible on all +hardware. It is only used in certain specialised environments such as +RedBoot. A typical implementation of the polling function would just +check whether or not an interrupt would have occurred and, if so, call +the same code that the interrupt handler would.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN704"> +</A> +<H2> +Data Endpoints</H2> +<P> +In addition to the control endpoint data structure, a USB device +driver should also provide appropriate <A +HREF="usbs-data.html"> +data +endpoint</A> + data structures. Obviously this is only relevant if +the USB support generally is desired, that is if the control endpoint is +provided. In addition, higher-level code may not require all the +endpoints, so it may be useful to provide configuration options that +control the presence of each endpoint. For example, the intended +application might only involve a single transmit endpoint and of +course control messages, so supporting receive endpoints might waste +memory.</P> +<P> +Conceptually, data endpoints are much simpler than the control +endpoint. The device driver has to supply two functions, one for +data transfers and another to control the halted condition. These +implement the functionality for +<A +HREF="usbs-start-rx.html"> +<TT +CLASS="FUNCTION"> +usbs_start_rx_buffer</TT> +</A> +, +<A +HREF="usbs-start-tx.html"> +<TT +CLASS="FUNCTION"> +usbs_start_tx_buffer</TT> +</A> +, +<A +HREF="usbs-halt.html"> +<TT +CLASS="FUNCTION"> +usbs_set_rx_endpoint_halted</TT> +</A> + and +<A +HREF="usbs-halt.html"> +<TT +CLASS="FUNCTION"> +usbs_set_tx_endpoint_halted</TT> +</A> +. +The device driver is also responsible for maintaining the +<TT +CLASS="STRUCTFIELD"> +<I> +halted</I> +</TT> + status.</P> +<P> +For data transfers, higher-level code will have filled in the +<TT +CLASS="STRUCTFIELD"> +<I> +buffer</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +buffer_size</I> +</TT> +, +<TT +CLASS="STRUCTFIELD"> +<I> +complete_fn</I> +</TT> + and +<TT +CLASS="STRUCTFIELD"> +<I> +complete_data</I> +</TT> + fields. The transfer function +should arrange for the transfer to start, allowing the host to send or +receive packets. Typically this will result in an interrupt at the end +of the transfer or after each packet. Once the entire transfer has +been completed, the driver's interrupt handling code should invoke the +completion function. This can happen either in DSR context or thread +context, depending on the driver's implementation. There are a number +of special cases to consider. If the endpoint is halted when the +transfer is started then the completion function can be invoked +immediately with <TT +CLASS="LITERAL"> +-EAGAIN</TT> +. If the transfer cannot be +completed because the connection is broken then the completion +function should be invoked with <TT +CLASS="LITERAL"> +-EPIPE</TT> +. If the +endpoint is stalled during the transfer, either because of a standard +control message or because higher-level code calls the appropriate +<TT +CLASS="STRUCTFIELD"> +<I> +set_halted_fn</I> +</TT> +, then again the completion +function should be invoked with <TT +CLASS="LITERAL"> +-EAGAIN</TT> +. Finally, +the <<TT +CLASS="FUNCTION"> +usbs_start_rx_endpoint_wait</TT> + and +<TT +CLASS="FUNCTION"> +usbs_start_tx_endpoint_wait</TT> + functions involve +calling the device driver's data transfer function with a buffer size +of 0 bytes.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN729"> +</A> +<H2> +Devtab Entries</H2> +<P> +For some applications or higher-level packages it may be more +convenient to use traditional open/read/write I/O calls rather than +the non-blocking USB I/O calls. To support this the device driver can +provide a devtab entry for each endpoint, for example:</P> +<TABLE +BORDER="0" +BGCOLOR="#E0E0E0" +WIDTH="100%"> +<TR> +<TD> +<PRE +CLASS="PROGRAMLISTING"> +#ifdef CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY + +static CHAR_DEVIO_TABLE(usbs_sa11x0_ep1_devtab_functions, + &cyg_devio_cwrite, + &usbs_devtab_cread, + &cyg_devio_bwrite, + &cyg_devio_bread, + &cyg_devio_select, + &cyg_devio_get_config, + &cyg_devio_set_config); + +static CHAR_DEVTAB_ENTRY(usbs_sa11x0_ep1_devtab_entry, + CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME "1r", + 0, + &usbs_sa11x0_ep1_devtab_functions, + &usbs_sa11x0_devtab_dummy_init, + 0, + (void*) &usbs_sa11x0_ep1); +#endif</PRE> +</TD> +</TR> +</TABLE> +<P> +Again care must be taken to avoid name clashes. This can be achieved +by having a configuration option to control the base name, with a +default value of e.g. <TT +CLASS="LITERAL"> +/dev/usbs</TT> +, and appending an +endpoint-specific string. This gives the application developer +sufficient control to eliminate any name clashes. The common USB slave +package provides functions <TT +CLASS="FUNCTION"> +usbs_devtab_cwrite</TT> + and +<TT +CLASS="FUNCTION"> +usbs_devtab_cread</TT> +, which can be used in the +function tables for transmit and receive endpoints respectively. The +private field <TT +CLASS="STRUCTFIELD"> +<I> +priv</I> +</TT> + of the devtab entry +should be a pointer to the underlying endpoint data structure.</P> +<P> +Because devtab entries are never accessed directly, only indirectly, +they would usually be eliminated by the linker. To avoid this the +devtab entries should normally be defined in a separate source file +which ends up the special library <TT +CLASS="FILENAME"> +libextras.a</TT> + +rather than in the default library <TT +CLASS="FILENAME"> +libtarget.a</TT> +.</P> +<P> +Not all applications or higher-level packages will want to use the +devtab entries and the blocking I/O facilities. It may be appropriate +for the device driver to provide additional configuration options that +control whether or not any or all of the devtab entries should be +provided, to avoid unnecessary memory overheads.</P> +</DIV> +<DIV +CLASS="REFSECT1"> +<A +NAME="AEN742"> +</A> +<H2> +Interrupt Handling</H2> +<P> +A typical USB device driver will need to service interrupts for all of +the endpoints and possibly for additional USB events such as entering +or leaving suspended mode. Usually these interrupts need not be +serviced directly by the ISR. Instead, they can be left to a DSR. If +the peripheral is not able to accept or send another packet just yet, +the hardware will generate a NAK and the host will just retry a little +bit later. If high throughput is required then it may be desirable to +handle the bulk transfer protocol largely at ISR level, that is take +care of each packet in the ISR and only activate the DSR once the +whole transfer has completed.</P> +<P> +Control messages may involve invoking arbitrary callback functions in +higher-level code. This should normally happen at DSR level. Doing it +at ISR level could seriously affect the system's interrupt latency and +impose unacceptable constraints on what operations can be performed by +those callbacks. If the device driver requires a thread anyway then it +may be appropriate to use this thread for invoking the callbacks, but +usually it is not worthwhile to add a new thread to the system just +for this; higher-level code is expected to write callbacks that +function sensibly at DSR level. Much the same applies to the +completion functions associated with data transfers. These should also +be invoked at DSR or thread level.</P> +</DIV> +<DIV +CLASS="NAVFOOTER"> +<HR +ALIGN="LEFT" +WIDTH="100%"><TABLE +WIDTH="100%" +BORDER="0" +CELLPADDING="0" +CELLSPACING="0"> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +<A +HREF="usbs-data.html"> +Prev</A> +</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> +<A +HREF="io-usb-slave.html"> +Home</A> +</TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> + </TD> +</TR> +<TR> +<TD +WIDTH="33%" +ALIGN="left" +VALIGN="top"> +Data Endpoints</TD> +<TD +WIDTH="34%" +ALIGN="center" +VALIGN="top"> + </TD> +<TD +WIDTH="33%" +ALIGN="right" +VALIGN="top"> + </TD> +</TR> +</TABLE> +</DIV> +</BODY> +</HTML>
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/doc/usbs.sgml @@ -0,0 +1,2358 @@ +<!DOCTYPE reference PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> + +<!-- {{{ Banner --> + +<!-- =============================================================== --> +<!-- --> +<!-- usbs.sgml --> +<!-- --> +<!-- Generic USB-slave documentation. --> +<!-- --> +<!-- =============================================================== --> +<!-- ####COPYRIGHTBEGIN#### --> +<!-- --> +<!-- =============================================================== --> +<!-- Copyright (C) 2001 Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder --> +<!-- =============================================================== --> +<!-- --> +<!-- ####COPYRIGHTEND#### --> +<!-- =============================================================== --> +<!-- #####DESCRIPTIONBEGIN#### --> +<!-- --> +<!-- Author(s): bartv --> +<!-- Contact(s): bartv --> +<!-- Date: 2001/01/03 --> +<!-- Version: 0.01 --> +<!-- --> +<!-- ####DESCRIPTIONEND#### --> +<!-- =============================================================== --> + +<!-- }}} --> + +<reference id="io-usb-slave"> + <title>eCos USB Slave Support</title> + +<!-- {{{ Intro --> + +<refentry id="usbs-intro"> +<refmeta> +<refentrytitle>Introduction</refentrytitle> +</refmeta> +<refnamediv> +<refname>Introduction</refname> +<refpurpose>eCos support for USB slave devices</refpurpose> +</refnamediv> + +<refsect1><title>Introduction</title> +<para> +The eCos USB slave support allows developers to produce USB +peripherals. It consists of a number of different eCos packages: +</para> +<orderedlist> + +<listitem> +<para> +Device drivers for specific implementations of USB slave hardware, for +example the on-chip USB Device Controller provided by the Intel SA1110 +processor. A typical USB peripheral will only provide one USB slave +port and therefore only one such device driver package will be needed. +Usually the device driver package will be loaded automatically when +you create an eCos configuration for target hardware that has a USB +slave device. If you select a target which does have a USB slave +device but no USB device driver is loaded, this implies that no such +device driver is currently available. +</para> +</listitem> + +<listitem> +<para> +The common USB slave package. This serves two purposes. It defines the +API that specific device drivers should implement. It also provides +various utilities that will be needed by most USB device drivers and +applications, such as handlers for standard control messages. +Usually this package will be loaded automatically at the same time as +the USB device driver. +</para> +</listitem> + +<listitem> +<para> +The common USB package. This merely provides some information common +to both the host and slave sides of USB, such as details of the +control protocol. It is also used to place the other USB-related +packages appropriately in the overall configuration hierarchy. Usually +this package will be loaded at the same time as the USB device driver. +</para> +</listitem> + +<listitem> +<para> +Class-specific USB support packages. These make it easier to develop +specific classes of USB peripheral, such as a USB-ethernet device. If +no suitable package is available for a given class of peripheral then +the USB device driver can instead be accessed directly from +application code. Such packages will never be loaded automatically +since the configuration system has no way of knowing what class of USB +peripheral is being developed. Instead developers have to add the +appropriate package or packages explicitly. +</para> +</listitem> + +</orderedlist> + +<para> +These packages only provide support for developing USB peripherals, +not USB hosts. +</para> +</refsect1> + +<refsect1><title>USB Concepts</title> +<para> +Information about USB can be obtained from a number of sources +including the <ulink url="http://www.usb.org/">USB Implementers Forum +web site</ulink>. Only a brief summary is provided here. +</para> +<para> +A USB network is asymmetrical: it consists of a single host, one or +more slave devices, and possibly some number of intermediate hubs. The +host side is significantly more complicated than the slave side. +Essentially, all operations are initiated by the host. For example, if +the host needs to receive some data from a particular USB peripheral +then it will send an IN token to that peripheral; the latter should +respond with either a NAK or with appropriate data. Similarly, when +the host wants to transmit data to a peripheral it will send an OUT +token followed by the data; the peripheral will return a NAK if it is +currently unable to receive more data or if there was corruption, +otherwise it will return an ACK. All transfers are check-summed and +there is a clearly-defined error recovery process. USB peripherals can +only interact with the host, not with each other. +</para> +<para> +USB supports four different types of communication: control messages, +interrupt transfers, isochronous transfers, and bulk transfers. +Control messages are further subdivided into four categories: +standard, class, vendor and a reserved category. All USB peripherals +must respond to certain standard control messages, and usually this +will be handled by the common USB slave package (for complicated +peripherals, application support will be needed). Class and vendor +control messages may be handled by an class-specific USB support +package, for example the USB-ethernet package will handle control +messages such as getting the MAC address or enabling/disabling +promiscuous mode. Alternatively, some or all of these messages will +have to be handled by application code. +</para> +<para> +Interrupt transfers are used for devices which need to be polled +regularly. For example, a USB keyboard might be polled once every +millisecond. The host will not poll the device more frequently than +this, so interrupt transfers are best suited to peripherals that +involve a relatively small amount of data. Isochronous transfers are +intended for multimedia-related peripherals where typically a large +amount of video or audio data needs to be exchanged continuously. +Given appropriate host support a USB peripheral can reserve some of +the available bandwidth. Isochronous transfers are not reliable; if a +particular packet is corrupted then it will just be discarded and +software is expected to recover from this. Bulk transfers are used for +everything else: after taking care of any pending control, isochronous +and interrupt transfers the host will use whatever bandwidth remains +for bulk transfers. Bulk transfers are reliable. +</para> +<para> +Transfers are organized into USB packets, with the details depending +on the transfer type. Control messages always involve an initial +8-byte packet from host to peripheral, optionally followed by some +additional packets; in theory these additional packets can be up to 64 +bytes, but hardware may limit it to 8 bytes. Interrupt transfers +involve a single packet of up to 64 bytes. Isochronous transfers +involve a single packet of up to 1024 bytes. Bulk transfers involve +multiple packets. There will be some number, possibly zero, of 64-byte +packets. The transfer is terminated by a single packet of less than 64 +bytes. If the transfer involves an exact multiple of 64 bytes than the +final packet will be 0 bytes, consisting of just a header and checksum +which typically will be generated by the hardware. There is no +pre-defined limit on the size of a bulk transfer. Instead higher-level +protocols are expected to handle this, so for a USB-ethernet +peripheral the protocol could impose a limit of 1514 bytes of data +plus maybe some additional protocol overhead. +</para> +<para> +Transfers from the host to a peripheral are addressed not just to that +peripheral but to a specific endpoint within that peripheral. +Similarly, the host requests incoming data from a specific endpoint +rather than from the peripheral as a whole. For example, a combined +keyboard/touchpad device could provide the keyboard events on endpoint +1 and the mouse events on endpoint 2. A given USB peripheral can have +up to 16 endpoints for incoming data and another 16 for outgoing data. +However, given the comparatively high speed of USB I/O this endpoint +addressing is typically implemented in hardware rather than software, +and the hardware will only implement a small number of endpoints. +Endpoint 0 is generally used only for control messages. +</para> +<para> +In practice, many of these details are irrelevant to application code +or to class packages. Instead, such higher-level code usually just +performs blocking <function>read</function> and +<function>write</function>, or non-blocking USB-specific calls, to +transfer data between host and target via a specific endpoint. Control +messages are more complicated but are usually handled by existing +code. +</para> +<para> +When a USB peripheral is plugged into the host there is an initial +enumeration and configuration process. The peripheral provides +information such as its class of device (audio, video, etc.), a +vendor id, which endpoints should be used for what kind of data, and +so on. The host OS uses this information to identify a suitable host +device driver. This could be a generic driver for a class of +peripherals, or it could be a vendor-specific driver. Assuming a +suitable driver is installed the host will then activate the USB +peripheral and perform additional application-specific initialisation. +For example for a USB-ethernet device this would involve obtaining an +ethernet MAC address. Most USB peripherals will be fairly simple, but +it is possible to build multifunction peripherals with multiple +configurations, interfaces, and alternate interface settings. +</para> +<para> +It is not possible for any of the eCos packages to generate all the +enumeration data automatically. Some of the required information such +as the vendor id cannot be supplied by generic packages; only by the +application developer. Class support code such as the USB-ethernet +package could in theory supply some of the information automatically, +but there are also hardware dependencies such as which endpoints get +used for incoming and outgoing ethernet frames. Instead it is the +responsibility of the application developer to provide all the +enumeration data and perform some additional initialisation. In +addition, the common USB slave package can handle all the standard +control messages for a simple USB peripheral, but for something like a +multifunction peripheral additional application support is needed. +</para> + +<note><para> +The initial implementation of the eCos USB slave packages involved +hardware that only supported control and bulk transfers, not +isochronous or interrupt. There may be future changes to the USB +code and API to allow for isochronous and interrupt transfers, +especially the former. Other changes may be required to support +different USB devices. At present there is no support for USB remote +wakeups, since again it is not supported by the hardware. +</para></note> + +</refsect1> + +<refsect1><title>eCos USB I/O Facilities</title> +<para> +For protocols other than control messages, eCos provides two ways of +performing USB I/O. The first involves device table or devtab entries such +as <link linkend="usbs-devtab"><literal>/dev/usb1r</literal></link>, +with one entry per endpoint per USB device. It is possible to +<function>open</function> these devices and use conventional blocking +I/O functions such as <function>read</function> and +<function>write</function> to exchange data between host and +peripheral. +</para> +<para> +There is also a lower-level USB-specific API, consisting of functions +such as <link +linkend="usbs-start-rx"><function>usbs_start_rx_buffer</function></link>. +A USB device driver will supply a data structure for each endpoint, +for example a <link +linkend="usbs-data"><structname>usbs_rx_endpoint</structname></link> +structure for every receive endpoint. The first argument to +<function>usbs_start_rx_buffer</function> should be a pointer to such +a data structure. The USB-specific API is non-blocking: the initial +call merely starts the transfer; some time later, once the transfer +has completed or has been aborted, the device driver will invoke a +completion function. +</para> +<para> +Control messages are different. With four different categories of +control messages including application and vendor specific ones, the +conventional +<function>open</function>/<function>read</function>/<function>write</function> +model of I/O cannot easily be applied. Instead, a USB device driver +will supply a <link +linkend="usbs-control"><structname>usbs_control_endpoint</structname></link> +data structure which can be manipulated appropriately. In practice the +standard control messages will usually be handled by the common USB +slave package, and other control messages will be handled by +class-specific code such as the USB-ethernet package. Typically, +application code remains responsible for supplying the <link +linkend="usbs-enum">enumeration data</link> and for actually <link +linkend="usbs-start">starting</link> up the USB device. +</para> +</refsect1> + +<refsect1><title>Enabling the USB code</title> +<para> +If the target hardware contains a USB slave device then the +appropriate USB device driver and the common packages will typically +be loaded into the configuration automatically when that target is +selected (assuming a suitable device driver exists). However, the +driver will not necessarily be active. For example a processor might +have an on-chip USB device, but not all applications using that +processor will want to use USB functionality. Hence by default the USB +device is disabled, ensuring that applications do not suffer any +memory or other penalties for functionality that is not required. +</para> +<para> +If the application developer explicitly adds a class support package +such as the USB-ethernet one then this implies that the USB device is +actually needed, and the device will be enabled automatically. +However, if no suitable class package is available and the USB device +will instead be accessed by application code, it is necessary to +enable the USB device manually. Usually the easiest way to do this is +to enable the configuration option +<literal>CYGGLO_IO_USB_SLAVE_APPLICATION</literal>, and the USB device +driver and related packages will adjust accordingly. Alternatively, +the device driver may provide some configuration options to provide +more fine-grained control. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ Enumeration Data --> + +<refentry id="usbs-enum"> +<refmeta> +<refentrytitle>USB Enumeration Data</refentrytitle> +</refmeta> +<refnamediv> +<refname>Enumeration Data</refname> +<refpurpose>The USB enumeration data structures</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<synopsis> +#include <cyg/io/usb/usb.h> +#include <cyg/io/usb/usbs.h> + +typedef struct usb_device_descriptor { + … +} usb_device_descriptor __attribute__((packed)); + +typedef struct usb_configuration_descriptor { + … +} usb_configuration_descriptor __attribute__((packed)); + +typedef struct usb_interface_descriptor { + … +} usb_interface_descriptor __attribute__((packed)); + +typedef struct usb_endpoint_descriptor { + … +} usb_endpoint_descriptor; + +typedef struct usbs_enumeration_data { + usb_device_descriptor device; + int total_number_interfaces; + int total_number_endpoints; + int total_number_strings; + const usb_configuration_descriptor* configurations; + const usb_interface_descriptor* interfaces; + const usb_endpoint_descriptor* endpoints; + const unsigned char** strings; +} usbs_enumeration_data; +</synopsis> +</refsynopsisdiv> + +<refsect1><title>USB Enumeration Data</title> +<para> +When a USB host detects that a peripheral has been plugged in or +powered up, one of the first steps is to ask the peripheral to +describe itself by supplying enumeration data. Some of this data +depends on the class of peripheral. Other fields are vendor-specific. +There is also a dependency on the hardware, specifically which +endpoints are available should be used. In general it is not possible +for generic code to provide this information, so it is the +responsibility of application code to provide a suitable +<structname>usbs_enumeration_data</structname> data structure and +install it in the endpoint 0 data structure during initialization. +This must happen before the USB device is enabled by a call to +<function>usbs_start</function>, for example: +</para> +<programlisting width=72> +const usbs_enumeration_data usb_enum_data = { + … +}; + +int +main(int argc, char** argv) +{ + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_start(&usbs_sa11x0_ep0); + … +} +</programlisting> +<para> +For most applications the enumeration data will be static, although +the <structname>usbs_enumeration_data</structname> structure can be +filled in at run-time if necessary. Full details of the enumeration +data can be found in the Universal Serial Bus specification obtainable +from the <ulink url="http://www.usb.org/">USB Implementers Forum web +site</ulink>, although the meaning of most fields is fairly obvious. +The various data structures and utility macros are defined in the +header files <filename class="headerfile">cyg/io/usb/usb.h</filename> +and <filename class="headerfile">cyg/io/usb/usbs.h</filename>. Note +that the example code below makes use of the gcc labelled element +extension. +</para> + +<refsect2><title><structname>usb_device_descriptor</structname></title> +<para> +The main information about a USB peripheral comes from a single +<structname>usb_device_descriptor</structname> structure, which is +embedded in the <structname>usbs_enumeration_data</structname> +structure. A typical example might look like this: +</para> +<programlisting width=72> +const usbs_enumeration_data usb_enum_data = { + { + length: USB_DEVICE_DESCRIPTOR_LENGTH, + type: USB_DEVICE_DESCRIPTOR_TYPE, + usb_spec_lo: USB_DEVICE_DESCRIPTOR_USB11_LO, + usb_spec_hi: USB_DEVICE_DESCRIPTOR_USB11_HI, + device_class: USB_DEVICE_DESCRIPTOR_CLASS_VENDOR, + device_subclass: USB_DEVICE_DESCRIPTOR_SUBCLASS_VENDOR, + device_protocol: USB_DEVICE_DESCRIPTOR_PROTOCOL_VENDOR, + max_packet_size: 8, + vendor_lo: 0x42, + vendor_hi: 0x42, + product_lo: 0x42, + product_hi: 0x42, + device_lo: 0x00, + device_hi: 0x01, + manufacturer_str: 1, + product_str: 2, + serial_number_str: 0, + number_configurations: 1 + }, + … +}; +</programlisting> +<para> +The length and type fields are specified by the USB standard. The +<structfield>usb_spec_lo</structfield> and +<structfield>usb_spec_hi</structfield> fields identify the particular +revision of the standard that the peripheral implements, for example +revision 1.1. +</para> +<para> +The device class, subclass, and protocol fields are used by generic +host-side USB software to determine which host-side device driver +should be loaded to interact with the peripheral. A number of standard +classes are defined, for example mass-storage devices and +human-interface devices. If a peripheral implements one of the +standard classes then a standard existing host-side device driver may +exist, eliminating the need to write a custom driver. The value +<literal>0xFF</literal> (<literal>VENDOR</literal>) is reserved for +peripherals that implement a vendor-specific protocol rather than a +standard one. Such peripherals will require a custom host-side device +driver. The value <literal>0x00</literal> +(<literal>INTERFACE</literal>) is reserved and indicates that the +protocol used by the peripheral is defined at the interface level +rather than for the peripheral as a whole. +</para> +<para> +The <structfield>max_package_size</structfield> field specifies the +maximum length of a control message. There is a lower bound of eight +bytes, and typical hardware will not support anything larger because +control messages are usually small and not performance-critical. +</para> +<para> +The <structfield>vendor_lo</structfield> and +<structfield>vendor_hi</structfield> fields specify a vendor id, which +must be obtained from the USB Implementor's Forum. The numbers used in +the code fragment above are examples only and must not be used in real +USB peripherals. The product identifier is determined by the vendor, +and different USB peripherals should use different identifiers. The +device identifier field should indicate a release number in +binary-coded decimal. +</para> +<para> +The above fields are all numerical in nature. A USB peripheral can +also provide a number of strings as described <link +linkend="usbs-enum-strings">below</link>, for example the name of the +vendor can be provided. The various <structfield>_str</structfield> +fields act as indices into an array of strings, with index 0 +indicating that no string is available. +</para> +<para> +A typical USB peripheral involves just a single configuration. However +more complicated peripherals can support multiple configurations. Only +one configuration will be active at any one time, and the host will +switch between them as appropriate. If a peripheral does involve +multiple configurations then typically it will be the responsibility +of application code to <link +linkend="usbs-control-standard">handle</link> the standard +set-configuration control message. +</para> +</refsect2> + +<refsect2><title><structname>usb_configuration_descriptor</structname></title> +<para> +A USB peripheral involves at least one and possible several different +configurations. The <structname>usbs_enumeration_data</structname> +structure requires a pointer to an array, possibly of length 1, of +<structname>usb_configuration_descriptor</structname> structures. +Usually a single structure suffices: +</para> +<programlisting width=72> +const usb_configuration_descriptor usb_configuration = { + length: USB_CONFIGURATION_DESCRIPTOR_LENGTH, + type: USB_CONFIGURATION_DESCRIPTOR_TYPE, + total_length_lo: USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_LO(1, 2), + total_length_hi: USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_HI(1, 2), + number_interfaces: 1, + configuration_id: 1, + configuration_str: 0, + attributes: USB_CONFIGURATION_DESCRIPTOR_ATTR_REQUIRED | + USB_CONFIGURATION_DESCRIPTOR_ATTR_SELF_POWERED, + max_power: 50 +}; + +const usbs_enumeration_data usb_enum_data = { + … + configurations: &usb_configuration, + … +}; +</programlisting> +<para> +The values for the <structfield>length</structfield> and +<structfield>type</structfield> fields are determined by the standard. +The <structfield>total_length</structfield> field depends on the +number of interfaces and endpoints used by this configuration, and +convenience macros are provided to calculate this: the first argument +to the macros specify the number of interfaces, the second the number +of endpoints. The <structfield>number_interfaces</structfield> field +is self-explanatory. If the peripheral involves multiple +configurations then each one must have a unique id, and this will be +used in the set-configuration control message. The id +<literal>0</literal> is reserved, and a set-configuration control +message that uses this id indicates that the peripheral should be +inactive. Configurations can have a string description if required. +The <structfield>attributes</structfield> field must have the +<literal>REQUIRED</literal> bit set; the +<literal>SELF_POWERED</literal> bit informs the host that the +peripheral has its own power supply and will not draw any power over +the bus, leaving more bus power available to other peripherals; the +<literal>REMOTE_WAKEUP</literal> bit is used if the peripheral can +interrupt the host when the latter is in power-saving mode. For +peripherals that are not self-powered, the +<structfield>max_power</structfield> field specifies the power +requirements in units of 2mA. +</para> +</refsect2> + +<refsect2><title><structname>usb_interface_descriptor</structname></title> +<para> +A USB configuration involves one or more interfaces, typically +corresponding to different streams of data. For example, one interface +might involve video data while another interface is for audio. +Multiple interfaces in a single configuration will be active at the +same time. +</para> +<programlisting width=72> +const usb_interface_descriptor usb_interface = { + length: USB_INTERFACE_DESCRIPTOR_LENGTH, + type: USB_INTERFACE_DESCRIPTOR_TYPE, + interface_id: 0, + alternate_setting: 0, + number_endpoints: 2, + interface_class: USB_INTERFACE_DESCRIPTOR_CLASS_VENDOR, + interface_subclass: USB_INTERFACE_DESCRIPTOR_SUBCLASS_VENDOR, + interface_protocol: USB_INTERFACE_DESCRIPTOR_PROTOCOL_VENDOR, + interface_str: 0 +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_interfaces: 1, + interfaces: &usb_interface, + … +}; +</programlisting> +<para> +Again, the <structfield>length</structfield> and +<structfield>type</structfield> fields are specified by the standard. +Each interface within a configuration requires its own id. However, a +given interface may have several alternate settings, in other words +entries in the interfaces array with the same id but different +<structfield>alternate_setting</structfield> fields. For example, +there might be one setting which requires a bandwidth of 100K/s and +another setting that only needs 50K/s. The host can use the standard +set-interface control message to choose the most appropriate setting. +The handling of this request is the responsibility of higher-level +code, so the application may have to <link +linkend="usbs-control-standard">install</link> its own handler. +</para> +<para> +The number of endpoints used by an interface is specified in the +<structfield>number_endpoints</structfield> field. Exact details of +which endpoints are used is held in a separate array of endpoint +descriptors. The class, subclass and protocol fields are used by +host-side code to determine which host-side device driver should +handle this specific interface. Usually this is determined on a +per-peripheral basis in the +<structname>usb_device_descriptor</structname> structure, but that can +defer the details to individual interfaces. A per-interface string +is allowed as well. +</para> +<para> +For USB peripherals involving multiple configurations, the array of +<structname>usb_interface_descriptor</structname> structures should +first contain all the interfaces for the first configuration, then all +the interfaces for the second configuration, and so on. +</para> +</refsect2> + +<refsect2><title id="usbs-enum-endpoint"><structname>usb_endpoint_descriptor</structname></title> +<para> +The host also needs information about which endpoint should be used +for what. This involves an array of endpoint descriptors: +</para> +<programlisting width=72> +const usb_endpoint_descriptor usb_endpoints[] = { + { + length: USB_ENDPOINT_DESCRIPTOR_LENGTH, + type: USB_ENDPOINT_DESCRIPTOR_TYPE, + endpoint: USB_ENDPOINT_DESCRIPTOR_ENDPOINT_OUT | 1, + attributes: USB_ENDPOINT_DESCRIPTOR_ATTR_BULK, + max_packet_lo: 64, + max_packet_hi: 0, + interval: 0 + }, + { + length: USB_ENDPOINT_DESCRIPTOR_LENGTH, + type: USB_ENDPOINT_DESCRIPTOR_TYPE, + endpoint: USB_ENDPOINT_DESCRIPTOR_ENDPOINT_IN | 2, + attributes: USB_ENDPOINT_DESCRIPTOR_ATTR_BULK, + max_packet_lo: 64, + max_packet_hi: 0, + interval: 0 + } +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_endpoints: 2, + endpoints: usb_endpoints, + … +}; +</programlisting> +<para> +As usual the values for the <structfield>length</structfield> and +<structfield>type</structfield> fields are specified by the standard. +The <structfield>endpoint</structfield> field gives both the endpoint +number and the direction, so in the above example endpoint 1 is used +for OUT (host to peripheral) transfers and endpoint 2 is used for IN +(peripheral to host) transfers. The +<structfield>attributes</structfield> field indicates the USB protocol +that should be used on this endpoint: <literal>CONTROL</literal>, +<literal>ISOCHRONOUS</literal>, <literal>BULK</literal> or +<literal>INTERRUPT</literal>. The +<structfield>max_packet</structfield> field specifies the maximum size +of a single USB packet. For bulk transfers this will typically be 64 +bytes. For isochronous transfers this can be up to 1023 bytes. For +interrupt transfers it can be up to 64 bytes, although usually a +smaller value will be used. The <structfield>interval</structfield> +field is ignored for control and bulk transfers. For isochronous +transfers it should be set to 1. For interrupt transfers it can be a +value between 1 and 255, and indicates the number of milliseconds +between successive polling operations. +</para> +<para> +For USB peripherals involving multiple configurations or interfaces +the array of endpoint descriptors should be organized sequentially: +first the endpoints corresponding to the first interface of the first +configuration, then the second interface in that configuration, and so +on; then all the endpoints for all the interfaces in the second +configuration; etc. +</para> +</refsect2> + +<refsect2><title id="usbs-enum-strings">Strings</title> +<para> +The enumeration data can contain a number of strings with additional +information. Unicode encoding is used for the strings, and it is +possible for a peripheral to supply a given string in multiple +languages using the appropriate characters. The first two bytes of +each string give a length and type field. The first string is special; +after the two bytes header it consists of an array of 2-byte language +id codes, indicating the supported languages. The language code +0x0409 corresponds to English (United States). +</para> +<programlisting width=72> +const unsigned char* usb_strings[] = { + "\x04\x03\x09\x04", + "\x10\x03R\0e\0d\0 \0H\0a\0t\0" +}; + +const usbs_enumeration_data usb_enum_data = { + … + total_number_strings: 2, + strings: usb_strings, + … +}; +</programlisting> +<para> +The default handler for standard control messages assumes that the +peripheral only uses a single language. If this is not the case then +higher-level code will have to handle the standard get-descriptor +control messages when a string descriptor is requested. +</para> +</refsect2> + +<refsect2><title><structname>usbs_enumeration_data</structname></title> +<para> +The <structname>usbs_enumeration_data</structname> data structure +collects together all the various descriptors that make up the +enumeration data. It is the responsibility of application code to +supply a suitable data structure and install it in the control +endpoints's <structfield>enumeration_data</structfield> field before +the USB device is started. +</para> +</refsect2> + +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ usbs_start() --> + +<refentry id="usbs-start"> +<refmeta> +<refentrytitle>Starting up a USB Device</refentrytitle> +</refmeta> +<refnamediv> +<refname><function>usbs_start</function></refname> +<refpurpose>Starting up a USB Device</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs.h> +</funcsynopsisinfo> +<funcprototype> +<funcdef>void <function>usbs_start</function></funcdef> +<paramdef>usbs_control_endpoint* <parameter>ep0</parameter></paramdef> +</funcprototype> +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title>Description</title> +<para> +Initializing a USB device requires some support from higher-level +code, typically the application, in the form of enumeration data. +Hence it is not possible for the low-level USB driver to activate a +USB device itself. Instead the higher-level code has to take care of +this by invoking <function>usbs_start</function>. This function takes +a pointer to a USB control endpoint data structure. USB device drivers +should provide exactly one such data structure for every USB device, +so the pointer uniquely identifies the device. +</para> +<programlisting width=72> +const usbs_enumeration_data usb_enum_data = { + … +}; + +int +main(int argc, char** argv) +{ + usbs_sa11x0_ep0.enumeration_data = &usb_enum_data; + … + usbs_start(&usbs_sa11x0_ep0); + … +} +</programlisting> +<para> +The exact behaviour of <function>usbs_start</function> depends on the +USB hardware and the device driver. A typical implementation would +change the USB data pins from tristated to active. If the peripheral +is already plugged into a host then the latter should detect this +change and start interacting with the peripheral, including requesting +the enumeration data. Some of this may happen before +<function>usbs_start</function> returns, but given that multiple +interactions between USB host and peripheral are required it is likely +that the function will return before the peripheral is fully +configured. Control endpoints provide a <link +linkend="usbs-control-state">mechanism</link> for informing +higher-level code of USB state changes. +<function>usbs_start</function> will return even if the peripheral is +not currently connected to a host: it will not block until the +connection is established. +</para> +<para> +<function>usbs_start</function> should only be called once for a given +USB device. There are no defined error conditions. Note that the +function affects the entire USB device and not just the control +endpoint: there is no need to start any data endpoints as well. +</para> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ Devtab Entries --> + +<refentry id="usbs-devtab"> +<refmeta> +<refentrytitle>Devtab Entries</refentrytitle> +</refmeta> +<refnamediv> +<refname>Devtab Entries</refname> +<refpurpose>Data endpoint data structure</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<synopsis> +/dev/usb0c +/dev/usb1r +/dev/usb2w +</synopsis> +</refsynopsisdiv> + +<refsect1><title>Devtab Entries</title> +<para> +USB device drivers provide two ways of transferring data between host +and peripheral. The first involves USB-specific functionality such as +<link +linkend="usbs-start-rx"><function>usbs_start_rx_buffer</function></link>. +This provides non-blocking I/O: a transfer is started, and some time +later the device driver will call a supplied completion function. The +second uses the conventional I/O model: there are entries in the +device table corresponding to the various endpoints. Standard calls +such as <function>open</function> can then be used to get a suitable +handle. Actual I/O happens via blocking <function>read</function> and +<function>write</function> calls. In practice the blocking operations +are simply implemented using the underlying non-blocking +functionality. +</para> +<para> +Each endpoint will have its own devtab entry. The exact names are +controlled by the device driver package, but typically the root will +be <literal>/dev/usb</literal>. This is followed by one or more +decimal digits giving the endpoint number, followed by +<literal>c</literal> for a control endpoint, <literal>r</literal> for +a receive endpoint (host to peripheral), and <literal>w</literal> for +a transmit endpoint (peripheral to host). If the target hardware +involves more than one USB device then different roots should be used, +for example <literal>/dev/usb0c</literal> and +<literal>/dev/usb1_0c</literal>. This may require explicit +manipulation of device driver configuration options by the application +developer. +</para> +<para> +At present the devtab entry for a control endpoint does not support +any I/O operations. +</para> + +<refsect2><title><function>write</function> operations</title> +<para> +<function>cyg_io_write</function> and similar functions in +higher-level packages can be used to perform a transfer from +peripheral to host. Successive write operations will not be coalesced. +For example, when doing a 1000 byte write to an endpoint that uses the +bulk transfer protocol this will involve 15 full-size 64-byte packets +and a terminating 40-byte packet. USB device drivers are not expected +to do any locking, and if higher-level code performs multiple +concurrent write operations on a single endpoint then the resulting +behaviour is undefined. +</para> +<para> +A USB <function>write</function> operation will never transfer less +data than specified. It is the responsibility of higher-level code to +ensure that the amount of data being transferred is acceptable to the +host-side code. Usually this will be defined by a higher-level +protocol. If an attempt is made to transfer more data than the host +expects then the resulting behaviour is undefined. +</para> +<para> +There are two likely error conditions. <literal>EPIPE</literal> +indicates that the connection between host and target has been broken. +<literal>EAGAIN</literal> indicates that the endpoint has been +stalled, either at the request of the host or by other activity +inside the peripheral. +</para> +</refsect2> + +<refsect2><title><function>read</function> operations</title> +<para> +<function>cyg_io_read</function> and similar functions in higher-level +packages can be used to perform a transfer from host to peripheral. +This should be a complete transfer: higher-level protocols should +define an upper bound on the amount of data being transferred, and the +<function>read</function> operation should involve at least this +amount of data. The return value will indicate the actual transfer +size, which may be less than requested. +</para> +<para> +Some device drivers may support partial reads, but USB device drivers +are not expected to perform any buffering because that involves both +memory and code overheads. One technique that may work for bulk +transfers is to exploit the fact that such transfers happen in 64-byte +packets. It is possible to <function>read</function> an initial 64 +bytes, corresponding to the first packet in the transfer. These 64 +bytes can then be examined to determine the total transfer size, and +the remaining data can be transferred in another +<function>read</function> operation. This technique is not guaranteed +to work with all USB hardware. Also, if the delay between accepting +the first packet and the remainder of the transfer is excessive then +this could cause timeout problems for the host-side software. For +these reasons the use of partial reads should be avoided. +</para> +<para> +There are two likely error conditions. <literal>EPIPE</literal> +indicates that the connection between host and target has been broken. +<literal>EAGAIN</literal> indicates that the endpoint has been +stalled, either at the request of the host or by other activity +inside the peripheral. +</para> +<para> +USB device drivers are not expected to do any locking. If higher-level +code performs multiple concurrent read operations on a single endpoint +then the resulting behaviour is undefined. +</para> +</refsect2> + +<refsect2><title><function>select</function> operations</title> +<para> +Typical USB device drivers will not provide any support for +<function>select</function>. Consider bulk transfers from the host to +the peripheral. At the USB device driver level there is no way of +knowing in advance how large a transfer will be, so it is not feasible +for the device driver to buffer the entire transfer. It may be +possible to buffer part of the transfer, for example the first 64-byte +packet, and copy this into application space at the start of a +<function>read</function>, but this adds code and memory overheads. +Worse, it means that there is an unknown but potentially long delay +between a peripheral accepting the first packet of a transfer and the +remaining packets, which could confuse or upset the host-side +software. +</para> +<para> +With some USB hardware it may be possible for the device driver to +detect OUT tokens from the host without actually accepting the data, +and this would indicate that a <function>read</function> is likely to +succeed. However, it would not be reliable since the host-side I/O +operation could time out. A similar mechanism could be used to +implement <function>select</function> for outgoing data, but again +this would not be reliable. +</para> +<para> +Some device drivers may provide partial support for +<function>select</function> anyway, possibly under the control of a +configuration option. The device driver's documentation should be +consulted for further information. It is also worth noting that the +USB-specific non-blocking API can often be used as an alternative to +<function>select</function>. +</para> +</refsect2> + +<refsect2><title><function>get_config</function> and +<function>set_config</function> operations</title> +<para> +There are no <function>set_config</function> or +<function>get_config</function> (also known as +<function>ioctl</function>) operations defined for USB devices. +Some device drivers may provide hardware-specific facilities this way. +</para> +<note> +<para> +Currently the USB-specific functions related to <link +linkend="usbs-halt">halted endpoints</link> cannot be accessed readily +via devtab entries. This functionality should probably be made +available via <function>set_config</function> and +<function>get_config</function>. It may also prove useful to provide +a <function>get_config</function> operation that maps from the +devtab entries to the underlying endpoint data structures. +</para> +</note> +</refsect2> + +<refsect2><title>Presence</title> +<para> +The devtab entries are optional. If the USB device is accessed +primarily by class-specific code such as the USB-ethernet package and +that package uses the USB-specific API directly, the devtab entries +are redundant. Even if application code does need to access the USB +device, the non-blocking API may be more convenient than the blocking +I/O provided via the devtab entries. In these cases the devtab entries +serve no useful purpose, but they still impose a memory overhead. It +is possible to suppress the presence of these entries by disabling the +configuration option +<literal>CYGGLO_IO_USB_SLAVE_PROVIDE_DEVTAB_ENTRIES</literal>. +</para> +</refsect2> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ usbs_start_rx_buffer() --> + +<refentry id="usbs-start-rx"> +<refmeta> +<refentrytitle>Receiving Data from the Host</refentrytitle> +</refmeta> +<refnamediv> +<refname><function>usbs_start_rx_buffer</function></refname> +<refpurpose>Receiving Data from the Host</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs.h> +</funcsynopsisinfo> +<funcprototype> +<funcdef>void <function>usbs_start_rx_buffer</function></funcdef> +<paramdef>usbs_rx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>unsigned char* <parameter>buffer</parameter></paramdef> +<paramdef>int <parameter>length</parameter></paramdef> +<paramdef>void (*)(void*,int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void * <parameter>complete_data</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>void <function>usbs_start_rx</function></funcdef> +<paramdef>usbs_rx_endpoint* <parameter>ep</parameter></paramdef> +</funcprototype> + +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title><function>Description</function></title> +<para> +<function>usbs_start_rx_buffer</function> is a USB-specific function +to accept a transfer from host to peripheral. It can be used for bulk, +interrupt or isochronous transfers, but not for control messages. +Instead those involve manipulating the <link +linkend="usbs-control"><structname>usbs_control_endpoint</structname></link> +data structure directly. The function takes five arguments: +</para> +<orderedlist> +<listitem> +<para> +The first argument identifies the specific endpoint that should be +used. Different USB devices will support different sets of endpoints +and the device driver will provide appropriate data structures. The +device driver's documentation should be consulted for details of which +endpoints are available. +</para> +</listitem> +<listitem> +<para> +The <parameter>buffer</parameter> and <parameter>length</parameter> +arguments control the actual transfer. USB device drivers are not +expected to perform any buffering or to support partial transfers, so +the length specified should correspond to the maximum transfer that is +currently possible and the buffer should be at least this large. For +isochronous transfers the USB specification imposes an upper bound of +1023 bytes, and a smaller limit may be set in the <link +linkend="usbs-enum-endpoint">enumeration data</link>. Interrupt +transfers are similarly straightforward with an upper bound of 64 +bytes, or less as per the enumeration data. Bulk transfers are more +complicated because they can involve multiple 64-byte packets plus a +terminating packet of less than 64 bytes, so there is no predefined +limit on the transfer size. Instead it is left to higher-level +protocols to specify an appropriate upper bound. +</para> +<para> +One technique that may work for bulk transfers is to exploit the fact +that such transfers happen in 64-byte packets: it may be possible to +receive an initial 64 bytes, corresponding to the first packet in the +transfer; these 64 bytes can then be examined to determine the total +transfer size, and the remaining data can be transferred in another +receive operation. This technique is not guaranteed to work with all +USB hardware. Also, if the delay between accepting the first packet and +the remainder of the transfer is excessive then this could cause +timeout problems for the host-side software. For these reasons this +technique should be avoided. +</para> +</listitem> +<listitem> +<para> +<function>usbs_start_rx_buffer</function> is non-blocking. It merely +starts the receive operation, and does not wait for completion. At +some later point the USB device driver will invoke the completion +function parameter with two arguments: the completion data defined by +the last parameter and a result field. A result >= +<literal>0</literal> indicates a successful transfer of that many +bytes, which may be less than the upper bound imposed by the +<parameter>length</parameter> argument. A result < +<literal>0</literal> indicates an error. The most likely errors are +<literal>-EPIPE</literal> to indicate that the connection between the +host and the target has been broken, and <literal>-EAGAIN</literal> +for when the endpoint has been <link +linkend="usbs-halt">halted</link>. Specific USB device drivers may +specify additional error conditions. +</para> +</listitem> +</orderedlist> +<para> +The normal sequence of events is that the USB device driver will +update the appropriate hardware registers. At some point after that +the host will attempt to send data by transmitting an OUT token +followed by a data packet, and since a receive operation is now in +progress the data will be accepted and ACK'd. If there were no receive +operation then the peripheral would instead generate a NAK. The USB +hardware will generate an interrupt once the whole packet has been +received, and the USB device driver will service this interrupt and +arrange for a DSR to be called. Isochronous and interrupt transfers +involve just a single packet. However, bulk transfers may involve +multiple packets so the device driver has to check whether the packet +was a full 64 bytes or whether it was a terminating packet of less +than this. When the device driver DSR detects a complete transfer it +will inform higher-level code by invoking the supplied completion +function. +</para> +<para> +This means that the completion function will normally be invoked by a +DSR and not in thread context - although some USB device drivers may +have a different implementation. Therefore the completion function is +restricted in what it can do. In particular it must not make any +calls that will or may block such as locking a mutex or allocating +memory. The kernel documentation should be consulted for more details +of DSR's and interrupt handling generally. +</para> +<para> +It is possible that the completion function will be invoked before +<function>usbs_start_rx_buffer</function> returns. Such an event would +be unusual because the transfer cannot happen until the next time the +host tries to send data to this peripheral, but it may happen if for +example another interrupt happens and a higher priority thread is +scheduled to run. Also, if the endpoint is currently halted then the +completion function will be invoked immediately with +<literal>-EAGAIN</literal>: typically this will happen in the current +thread rather than in a separate DSR. The completion function is +allowed to start another transfer immediately by calling +<function>usbs_start_rx_buffer</function> again. +</para> +<para> +USB device drivers are not expected to perform any locking. It is the +responsibility of higher-level code to ensure that there is only one +receive operation for a given endpoint in progress at any one time. If +there are concurrent calls to +<function>usbs_start_rx_buffer</function> then the resulting behaviour +is undefined. For typical USB applications this does not present any +problems, because only one piece of code will access a given endpoint +at any particular time. +</para> +<para> +The following code fragment illustrates a very simple use of +<function>usbs_start_rx_buffer</function> to implement a blocking +receive, using a semaphore to synchronise between the foreground +thread and the DSR. For a simple example like this no completion data +is needed. +</para> +<programlisting width=72> +static int error_code = 0; +static cyg_sem_t completion_wait; + +static void +completion_fn(void* data, int result) +{ + error_code = result; + cyg_semaphore_post(&completion_wait); +} + +int +blocking_receive(usbs_rx_endpoint* ep, unsigned char* buf, int len) +{ + error_code = 0; + usbs_start_rx_buffer(ep, buf, len, &completion_fn, NULL); + cyg_semaphore_wait(&completion_wait); + return error_code; +} +</programlisting> +<para> +There is also a utility function <function>usbs_start_rx</function>. This +can be used by code that wants to manipulate <link +linkend="usbs-data">data endpoints</link> directly, specifically the +<structfield>complete_fn</structfield>, +<structfield>complete_data</structfield>, +<structfield>buffer</structfield> and +<structfield>buffer_size</structfield> fields. +<function>usbs_start_tx</function> just invokes a function +supplied by the device driver. +</para> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ usbs_start_tx_buffer() --> + +<refentry id="usbs-start-tx"> +<refmeta> +<refentrytitle>Sending Data to the Host</refentrytitle> +</refmeta> +<refnamediv> +<refname><function>usbs_start_tx_buffer</function></refname> +<refpurpose>Sending Data to the Host</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> +<funcsynopsisinfo> +#include <cyg/io/usb/usbs.h> +</funcsynopsisinfo> +<funcprototype> +<funcdef>void <function>usbs_start_tx_buffer</function></funcdef> +<paramdef>usbs_tx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>const unsigned char* <parameter>buffer</parameter></paramdef> +<paramdef>int <parameter>length</parameter></paramdef> +<paramdef>void (*)(void*,int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void * <parameter>complete_data</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>void <function>usbs_start_tx</function></funcdef> +<paramdef>usbs_tx_endpoint* <parameter>ep</parameter></paramdef> +</funcprototype> + +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title><function>Description</function></title> +<para> +<function>usbs_start_tx_buffer</function> is a USB-specific function +to transfer data from peripheral to host. It can be used for bulk, +interrupt or isochronous transfers, but not for control messages; +instead those involve manipulating the <link +linkend="usbs-control"><structname>usbs_control_endpoint</structname></link> +data structure directly. The function takes five arguments: +</para> +<orderedlist> +<listitem> +<para> +The first argument identifies the specific endpoint that should be +used. Different USB devices will support different sets of endpoints +and the device driver will provide appropriate data structures. The +device driver's documentation should be consulted for details of which +endpoints are available. +</para> +</listitem> +<listitem> +<para> +The <parameter>buffer</parameter> and <parameter>length</parameter> +arguments control the actual transfer. USB device drivers are not +allowed to modify the buffer during the transfer, so the data can +reside in read-only memory. The transfer will be for all the data +specified, and it is the responsibility of higher-level code to make +sure that the host is expecting this amount of data. For isochronous +transfers the USB specification imposes an upper bound of 1023 bytes, +but a smaller limit may be set in the <link +linkend="usbs-enum-endpoint">enumeration data</link>. Interrupt +transfers have an upper bound of 64 bytes or less, as per the +enumeration data. Bulk transfers are more complicated because they can +involve multiple 64-byte packets plus a terminating packet of less +than 64 bytes, so the basic USB specification does not impose an upper +limit on the total transfer size. Instead it is left to higher-level +protocols to specify an appropriate upper bound. If the peripheral +attempts to send more data than the host is willing to accept then the +resulting behaviour is undefined and may well depend on the specific +host operating system being used. +</para> +<para> +For bulk transfers, the USB device driver or the underlying hardware +will automatically split the transfer up into the appropriate number +of full-size 64-byte packets plus a single terminating packet, which +may be 0 bytes. +</para> +</listitem> +<listitem> +<para> +<function>usbs_start_tx_buffer</function> is non-blocking. It merely +starts the transmit operation, and does not wait for completion. At +some later point the USB device driver will invoke the completion +function parameter with two arguments: the completion data defined by +the last parameter, and a result field. This result will be either an +error code < <literal>0</literal>, or the amount of data +transferred which should correspond to the +<parameter>length</parameter> argument. The most likely errors are +<literal>-EPIPE</literal> to indicate that the connection between the +host and the target has been broken, and <literal>-EAGAIN</literal> +for when the endpoint has been <link +linkend="usbs-halt">halted</link>. Specific USB device drivers may +define additional error conditions. +</para> +</listitem> +</orderedlist> +<para> +The normal sequence of events is that the USB device driver will +update the appropriate hardware registers. At some point after that +the host will attempt to fetch data by transmitting an IN token. Since +a transmit operation is now in progress the peripheral can send a +packet of data, and the host will generate an ACK. At this point the +USB hardware will generate an interrupt, and the device driver will +service this interrupt and arrange for a DSR to be called. Isochronous +and interrupt transfers involve just a single packet. However, bulk +transfers may involve multiple packets so the device driver has to +check whether there is more data to send and set things up for the +next packet. When the device driver DSR detects a complete transfer it +will inform higher-level code by invoking the supplied completion +function. +</para> +<para> +This means that the completion function will normally be invoked by a +DSR and not in thread context - although some USB device drivers may +have a different implementation. Therefore the completion function is +restricted in what it can do, in particular it must not make any +calls that will or may block such as locking a mutex or allocating +memory. The kernel documentation should be consulted for more details +of DSR's and interrupt handling generally. +</para> +<para> +It is possible that the completion function will be invoked before +<function>usbs_start_tx_buffer</function> returns. Such an event would +be unusual because the transfer cannot happen until the next time the +host tries to fetch data from this peripheral, but it may happen if, +for example, another interrupt happens and a higher priority thread is +scheduled to run. Also, if the endpoint is currently halted then the +completion function will be invoked immediately with +<literal>-EAGAIN</literal>: typically this will happen in the current +thread rather than in a separate DSR. The completion function is +allowed to start another transfer immediately by calling +<function>usbs_start_tx_buffer</function> again. +</para> +<para> +USB device drivers are not expected to perform any locking. It is the +responsibility of higher-level code to ensure that there is only one +transmit operation for a given endpoint in progress at any one time. +If there are concurrent calls to +<function>usbs_start_tx_buffer</function> then the resulting behaviour +is undefined. For typical USB applications this does not present any +problems because only piece of code will access a given endpoint at +any particular time. +</para> +<para> +The following code fragment illustrates a very simple use of +<function>usbs_start_tx_buffer</function> to implement a blocking +transmit, using a semaphore to synchronise between the foreground +thread and the DSR. For a simple example like this no completion data +is needed. +</para> +<programlisting width=72> +static int error_code = 0; +static cyg_sem_t completion_wait; + +static void +completion_fn(void* data, int result) +{ + error_code = result; + cyg_semaphore_post(&completion_wait); +} + +int +blocking_transmit(usbs_tx_endpoint* ep, const unsigned char* buf, int len) +{ + error_code = 0; + usbs_start_tx_buffer(ep, buf, len, &completion_fn, NULL); + cyg_semaphore_wait(&completion_wait); + return error_code; +} +</programlisting> +<para> +There is also a utility function <function>usbs_start</function>. This +can be used by code that wants to manipulate <link +linkend="usbs-data">data endpoints</link> directly, specifically the +<structfield>complete_fn</structfield>, +<structfield>complete_data</structfield>, +<structfield>buffer</structfield> and +<structfield>buffer_size</structfield> fields. +<function>usbs_start_tx</function> just calls a function supplied by +the device driver. +</para> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ Halted endpoints --> + +<refentry id="usbs-halt"> +<refmeta> +<refentrytitle>Halted Endpoints</refentrytitle> +</refmeta> +<refnamediv> +<refname>Halted Endpoints</refname> +<refpurpose>Support for Halting and Halted Endpoints</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<funcsynopsis> + +<funcsynopsisinfo> +#include <cyg/io/usb/usbs.h> +</funcsynopsisinfo> + +<funcprototype> +<funcdef>cyg_bool <function>usbs_rx_endpoint_halted</function></funcdef> +<paramdef>usbs_rx_endpoint* <parameter>ep</parameter></paramdef> +</funcprototype> +<funcprototype> +<funcdef>void <function>usbs_set_rx_endpoint_halted</function></funcdef> +<paramdef>usbs_rx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>cyg_bool <parameter>new_state</parameter></paramdef> +</funcprototype> +<funcprototype> +<funcdef>void <function>usbs_start_rx_endpoint_wait</function></funcdef> +<paramdef>usbs_rx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>void (*)(void*, int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void * <parameter>complete_data</parameter></paramdef> +</funcprototype> + +<funcprototype> +<funcdef>cyg_bool +<function>usbs_tx_endpoint_halted</function></funcdef> +<paramdef>usbs_tx_endpoint* <parameter>ep</parameter></paramdef> +</funcprototype> +<funcprototype> +<funcdef>void <function>usbs_set_tx_endpoint_halted</function></funcdef> +<paramdef>usbs_tx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>cyg_bool <parameter>new_state</parameter></paramdef> +</funcprototype> +<funcprototype> +<funcdef>void <function>usbs_start_tx_endpoint_wait</function></funcdef> +<paramdef>usbs_tx_endpoint* <parameter>ep</parameter></paramdef> +<paramdef>void (*)(void*, int) <parameter>complete_fn</parameter></paramdef> +<paramdef>void * <parameter>complete_data</parameter></paramdef> +</funcprototype> + +</funcsynopsis> +</refsynopsisdiv> + +<refsect1><title><function>Description</function></title> +<para> +Normal USB traffic involves straightforward handshakes, with either an +<literal>ACK</literal> to indicate that a packet was transferred +without errors, or a <literal>NAK</literal> if an error occurred, or +if a peripheral is currently unable to process another packet from the +host, or has no packet to send to the host. There is a third form of +handshake, a <literal>STALL</literal>, which indicates that the +endpoint is currently <emphasis>halted</emphasis>. +</para> +<para> +When an endpoint is halted it means that the host-side code needs to +take some sort of recovery action before communication over that +endpoint can resume. The exact circumstances under which this can +happen are not defined by the USB specification, but one example would +be a protocol violation if say the peripheral attempted to transmit +more data to the host than was permitted by the protocol in use. The +host can use the standard control messages get-status, set-feature and +clear-feature to examine and manipulate the halted status of a given +endpoint. There are USB-specific functions which can be used inside +the peripheral to achieve the same effect. Once an endpoint has been +halted the host can then interact with the peripheral using class or +vendor control messages to perform appropriate recovery, and then the +halted condition can be cleared. +</para> +<para> +Halting an endpoint does not constitute a device state change, and +there is no mechanism by which higher-level code can be informed +immediately. However, any ongoing receive or transmit operations will +be aborted with an <literal>-EAGAIN</literal> error, and any new +receives or transmits will fail immediately with the same error. +</para> +<para> +There are six functions to support halted endpoints, one set for +receive endpoints and another for transmit endpoints, with both sets +behaving in essentially the same way. The first, +<function>usbs_rx_endpoint_halted</function>, can be used to determine +whether or not an endpoint is currently halted: it takes a single +argument that identifies the endpoint of interest. The second +function, <function>usbs_set_rx_endpoint_halted</function>, can be +used to change the halted condition of an endpoint: it takes two +arguments; one to identify the endpoint and another to specify the new +state. The last function +<function>usbs_start_rx_endpoint_wait</function> operates in much the +same way as <function>usbs_start_rx_buffer</function>: when the +endpoint is no longer halted the device driver will invoke the +supplied completion function with a status of 0. The completion +function has the same signature as that for a transfer operation. +Often it will be possible to use a single completion function and have +the foreground code invoke either +<function>usbs_start_rx_buffer</function> or +<function>usbs_start_rx_endpoint_wait</function> depending on the +current state of the endpoint. +</para> +</refsect1> +</refentry> + +<!-- }}} --> +<!-- {{{ Control Endpoint --> + +<refentry id="usbs-control"> +<refmeta> +<refentrytitle>Control Endpoints</refentrytitle> +</refmeta> +<refnamediv> +<refname>Control Endpoints</refname> +<refpurpose>Control endpoint data structure</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<synopsis> +#include <cyg/io/usb/usbs.h> + +typedef struct usbs_control_endpoint { + *hellip; +} usbs_control_endpoint; +</synopsis> +</refsynopsisdiv> + +<refsect1><title><literal>usbs_control_endpoint</literal> Data Structure</title> +<para> +The device driver for a USB slave device should supply one +<structname>usbs_control_endpoint</structname> data structure per USB +device. This corresponds to endpoint 0 which will be used for all +control message interaction between the host and that device. The data +structure is also used for internal management purposes, for example +to keep track of the current state. In a typical USB peripheral there +will only be one such data structure in the entire system, but if +there are multiple USB slave ports, allowing the peripheral to be +connected to multiple hosts, then there will be a separate data +structure for each one. The name or names of the data structures are +determined by the device drivers. For example, the SA11x0 USB device +driver package provides <literal>usbs_sa11x0_ep0</literal>. +</para> +<para> +The operations on a control endpoint do not fit cleanly into a +conventional open/read/write I/O model. For example, when the host +sends a control message to the USB peripheral this may be one of four +types: standard, class, vendor and reserved. Some or all of the +standard control messages will be handled automatically by the common +USB slave package or by the device driver itself. Other standard +control messages and the other types of control messages may be +handled by a class-specific package or by application code. Although +it would be possible to have devtab entries such as +<literal>/dev/usbs_ep0/standard</literal> and +<literal>/dev/usbs_ep0/class</literal>, and then support read and +write operations on these devtab entries, this would add significant +overhead and code complexity. Instead, all of the fields in the +control endpoint data structure are public and can be manipulated +directly by higher level code if and when required. +</para> +<para> +Control endpoints involve a number of callback functions, with +higher-level code installing suitable function pointers in the control +endpoint data structure. For example, if the peripheral involves +vendor-specific control messages then a suitable handler for these +messages should be installed. Although the exact details depend on the +device driver, typically these callback functions will be invoked at +DSR level rather than thread level. Therefore, only certain eCos +functions can be invoked; specifically, those functions that are +guaranteed not to block. If a potentially blocking function such as a +semaphore wait or a mutex lock operation is invoked from inside the +callback then the resulting behaviour is undefined, and the system as +a whole may fail. In addition, if one of the callback functions +involves significant processing effort then this may adversely affect +the system's real time characteristics. The eCos kernel documentation +should be consulted for more details of DSR handling. +</para> + +<refsect2><title>Initialization</title> +<para> +The <structname>usbs_control_endpoint</structname> data structure +contains the following fields related to initialization. +</para> +<programlisting width=72> +typedef struct usbs_control_endpoint { + … + const usbs_enumeration_data* enumeration_data; + void (*start_fn)(usbs_control_endpoint*); + … +}; +</programlisting> +<para> +It is the responsibility of higher-level code, usually the +application, to define the USB enumeration data. This needs to be +installed in the control endpoint data structure early on during +system startup, before the USB device is actually started and any +interaction with the host is possible. Details of the enumeration data +are supplied in the section <link linkend="usbs-enum">USB Enumeration +Data</link>. Typically, the enumeration data is constant for a given +peripheral, although it can be constructed dynamically if necessary. +However, the enumeration data cannot change while the peripheral is +connected to a host: the peripheral cannot easily claim to be a +keyboard one second and a printer the next. +</para> +<para> +The <structfield>start_fn</structfield> member is normally accessed +via the utility <link +linkend="usbs-start"><function>usbs_start</function></link> rather +than directly. It is provided by the device driver and should be +invoked once the system is fully initialized and interaction with the +host is possible. A typical implementation would change the USB data +pins from tristated to active. If the peripheral is already plugged +into a host then the latter should detect this change and start +interacting with the peripheral, including requesting the enumeration +data. +</para> +</refsect2> + +<refsect2><title id="usbs-control-state">State</title> +<para> +There are three <structname>usbs_control_endpoint</structname> fields +related to the current state of a USB slave device, plus some state +constants and an enumeration of the possible state changes: +</para> +<programlisting width=72> +typedef struct usbs_control_endpoint { + … + int state; + void (*state_change_fn)(struct usbs_control_endpoint*, void*, + usbs_state_change, int); + void* state_change_data; + … +}; + +#define USBS_STATE_DETACHED 0x01 +#define USBS_STATE_ATTACHED 0x02 +#define USBS_STATE_POWERED 0x03 +#define USBS_STATE_DEFAULT 0x04 +#define USBS_STATE_ADDRESSED 0x05 +#define USBS_STATE_CONFIGURED 0x06 +#define USBS_STATE_MASK 0x7F +#define USBS_STATE_SUSPENDED (1 << 7) + +typedef enum { + USBS_STATE_CHANGE_DETACHED = 1, + USBS_STATE_CHANGE_ATTACHED = 2, + USBS_STATE_CHANGE_POWERED = 3, + USBS_STATE_CHANGE_RESET = 4, + USBS_STATE_CHANGE_ADDRESSED = 5, + USBS_STATE_CHANGE_CONFIGURED = 6, + USBS_STATE_CHANGE_DECONFIGURED = 7, + USBS_STATE_CHANGE_SUSPENDED = 8, + USBS_STATE_CHANGE_RESUMED = 9 +} usbs_state_change; +</programlisting> +<para> +The USB standard defines a number of states for a given USB +peripheral. The initial state is <emphasis>detached</emphasis>, where +the peripheral is either not connected to a host at all or, from the +host's perspective, the peripheral has not started up yet because the +relevant pins are tristated. The peripheral then moves via +intermediate <emphasis>attached</emphasis> and +<emphasis>powered</emphasis> states to its default or +<emphasis>reset</emphasis> state, at which point the host and +peripheral can actually start exchanging data. The first message is +from host to peripheral and provides a unique 7-bit address within the +local USB network, resulting in a state change to +<emphasis>addressed</emphasis>. The host then requests enumeration +data and performs other initialization. If everything succeeds the +host sends a standard set-configuration control message, after which +the peripheral is <emphasis>configured</emphasis> and expected to be +up and running. Note that some USB device drivers may be unable to +distinguish between the <emphasis>detached</emphasis>, +<emphasis>attached</emphasis> and <emphasis>powered</emphasis> states +but generally this is not important to higher-level code. +</para> +<para> +A USB host should generate at least one token every millisecond. If a +peripheral fails to detect any USB traffic for a period of time then +typically this indicates that the host has entered a power-saving +mode, and the peripheral should do the same if possible. This +corresponds to the <emphasis>suspended</emphasis> bit. The actual +state is a combination of <emphasis>suspended</emphasis> and the +previous state, for example <emphasis>configured</emphasis> and +<emphasis>suspended</emphasis> rather than just +<emphasis>suspended</emphasis>. When the peripheral subsequently +detects USB traffic it would switch back to the +<emphasis>configured</emphasis> state. +</para> +<para> +The USB device driver and the common USB slave package will maintain +the current state in the control endpoint's +<structfield>state</structfield> field. There should be no need for +any other code to change this field, but it can be examined whenever +appropriate. In addition whenever a state change occurs the generic +code can invoke a state change callback function. By default, no such +callback function will be installed. Some class-specific packages such +as the USB-ethernet package will install a suitable function to keep +track of whether or not the host-peripheral connection is up, that is +whether or not ethernet packets can be exchanged. Application code can +also update this field. If multiple parties want to be informed of +state changes, for example both a class-specific package and +application code, then typically the application code will install its +state change handler after the class-specific package and is +responsible for chaining into the package's handler. +</para> +<para> +The state change callback function is invoked with four arguments. The +first identifies the control endpoint. The second is an arbitrary +pointer: higher-level code can fill in the +<structfield>state_change_data</structfield> field to set this. The +third argument specifies the state change that has occurred, and the +last argument supplies the previous state (the new state is readily +available from the control endpoint structure). +</para> +<para> +eCos does not provide any utility functions for updating or examining +the <structfield>state_change_fn</structfield> or +<structfield>state_change_data</structfield> fields. Instead, it is +expected that the fields in the +<structname>usbs_control_endpoint</structname> data structure will be +manipulated directly. Any utility functions would do just this, but +at the cost of increased code and cpu overheads. +</para> +</refsect2> + +<refsect2><title id="usbs-control-standard">Standard Control Messages</title> +<programlisting width=88> +typedef struct usbs_control_endpoint { + … + unsigned char control_buffer[8]; + usbs_control_return (*standard_control_fn)(struct usbs_control_endpoint*, void*); + void* standard_control_data; + … +} usbs_control_endpoint; + +typedef enum { + USBS_CONTROL_RETURN_HANDLED = 0, + USBS_CONTROL_RETURN_UNKNOWN = 1, + USBS_CONTROL_RETURN_STALL = 2 +} usbs_control_return; + +extern usbs_control_return usbs_handle_standard_control(struct usbs_control_endpoint*); +</programlisting> +<para> +When a USB peripheral is connected to the host it must always respond +to control messages sent to endpoint 0. Control messages always +consist of an initial eight-byte header, containing fields such as a +request type. This may be followed by a further data transfer, either +from host to peripheral or from peripheral to host. The way this is +handled is described in the <link +linkend="usbs-control-buffer">Buffer Management</link> section below. +</para> +<para> +The USB device driver will always accept the initial eight-byte +header, storing it in the <structfield>control_buffer</structfield> +field. Then it determines the request type: standard, class, vendor, +or reserved. The way in which the last three of these are processed is +described in the section <link linkend="usbs-control-other">Other +Control Messages</link>. Some +standard control messages will be handled by the device driver itself; +typically the <emphasis>set-address</emphasis> request and the +<emphasis>get-status</emphasis>, <emphasis>set-feature</emphasis> and +<emphasis>clear-feature</emphasis> requests when applied to endpoints. +</para> +<para> +If a standard control message cannot be handled by the device driver +itself, the driver checks the +<structfield>standard_control_fn</structfield> field in the control +endpoint data structure. If higher-level code has installed a suitable +callback function then this will be invoked with two argument, the +control endpoint data structure itself and the +<structfield>standard_control_data</structfield> field. The latter +allows the higher level code to associate arbitrary data with the +control endpoint. The callback function can return one of three +values: <emphasis>HANDLED</emphasis> to indicate that the request has +been processed; <emphasis>UNKNOWN</emphasis> if the message should be +handled by the default code; or <emphasis>STALL</emphasis> to indicate +an error condition. If higher level code has not installed a callback +function or if the callback function has returned +<emphasis>UNKNOWN</emphasis> then the device driver will invoke a +default handler, <function>usbs_handle_standard_control</function> +provided by the common USB slave package. +</para> +<para> +The default handler can cope with all of the standard control messages +for a simple USB peripheral. However, if the peripheral involves +multiple configurations, multiple interfaces in a configuration, or +alternate settings for an interface, then this cannot be handled by +generic code. For example, a multimedia peripheral may support various +alternate settings for a given data source with different bandwidth +requirements, and the host can select a setting that takes into +account the current load. Clearly higher-level code needs to be aware +when the host changes the current setting, so that it can adjust the +rate at which data is fed to or retrieved from the host. Therefore the +higher-level code needs to install its own standard control callback +and process appropriate messages, rather than leaving these to the +default handler. +</para> +<para> +The default handler will take care of the +<emphasis>get-descriptor</emphasis> request used to obtain the +enumeration data. It has support for string descriptors but ignores +language encoding issues. If language encoding is important for the +peripheral then this will have to be handled by an +application-specific standard control handler. +</para> +<para> +The header file <filename +class="headerfile"><cyg/io/usb/usb.h></filename> defines various +constants related to control messages, for example the function codes +corresponding to the standard request types. This header file is +provided by the common USB package, not by the USB slave package, +since the information is also relevant to USB hosts. +</para> +</refsect2> + +<refsect2><title id="usbs-control-other">Other Control Messages</title> +<programlisting width=88> +typedef struct usbs_control_endpoint { + … + usbs_control_return (*class_control_fn)(struct usbs_control_endpoint*, void*); + void* class_control_data; + usbs_control_return (*vendor_control_fn)(struct usbs_control_endpoint*, void*); + void* vendor_control_data; + usbs_control_return (*reserved_control_fn)(struct usbs_control_endpoint*, void*); + void* reserved_control_data; + … +} usbs_control_endpoint; +</programlisting> +<para> +Non-standard control messages always have to be processed by +higher-level code. This could be class-specific packages. For example, +the USB-ethernet package will handle requests for getting the MAC +address and for enabling or disabling promiscuous mode. In all cases +the device driver will store the initial request in the +<structfield>control_buffer</structfield> field, check for an +appropriate handler, and invoke it with details of the control +endpoint and any handler-specific data that has been installed +alongside the handler itself. The handler should return either +<literal>USBS_CONTROL_RETURN_HANDLED</literal> to report success or +<literal>USBS_CONTROL_RETURN_STALL</literal> to report failure. The +device driver will report this to the host. +</para> +<para> +If there are multiple parties interested in a particular type of +control messages, it is the responsibility of application code to +install an appropriate handler and process the requests appropriately. +</para> +</refsect2> + +<refsect2><title id="usbs-control-buffer">Buffer Management</title> +<programlisting width=76> +typedef struct usbs_control_endpoint { + … + unsigned char* buffer; + int buffer_size; + void (*fill_buffer_fn)(struct usbs_control_endpoint*); + void* fill_data; + int fill_index; + usbs_control_return (*complete_fn)(struct usbs_control_endpoint*, int); + … +} usbs_control_endpoint; +</programlisting> +<para> +Many USB control messages involve transferring more data than just the +initial eight-byte header. The header indicates the direction of the +transfer, OUT for host to peripheral or IN for peripheral to host. +It also specifies a length field, which is exact for an OUT transfer +or an upper bound for an IN transfer. Control message handlers can +manipulate six fields within the control endpoint data structure to +ensure that the transfer happens correctly. +</para> +<para> +For an OUT transfer, the handler should examine the length field in +the header and provide a single buffer for all the data. A +class-specific protocol would typically impose an upper bound on the +amount of data, allowing the buffer to be allocated statically. +The handler should update the <structfield>buffer</structfield> and +<structfield>complete_fn</structfield> fields. When all the data has +been transferred the completion callback will be invoked, and its +return value determines the response sent back to the host. The USB +standard allows for a new control message to be sent before the +current transfer has completed, effectively cancelling the current +operation. When this happens the completion function will also be +invoked. The second argument to the completion function specifies what +has happened, with a value of 0 indicating success and an error code +such as <literal>-EPIPE</literal> or <literal>-EIO</literal> +indicating that the current transfer has been cancelled. +</para> +<para> +IN transfers are a little bit more complicated. The required +information, for example the enumeration data, may not be in a single +contiguous buffer. Instead a mechanism is provided by which the buffer +can be refilled, thus allowing the transfer to move from one record to +the next. Essentially, the transfer operates as follows: +</para> +<orderedlist> +<listitem> +<para> +When the host requests another chunk of data (typically eight bytes), +the USB device driver will examine the +<structfield>buffer_size</structfield> field. If non-zero then +<structfield>buffer</structfield> contains at least one more byte of +data, and then <structfield>buffer_size</structfield> is decremented. +</para> +</listitem> +<listitem> +<para> +When <structfield>buffer_size</structfield> has dropped to 0, the +<structfield>fill_buffer_fn</structfield> field will be examined. If +non-null it will be invoked to refill the buffer. +</para> +</listitem> +<listitem> +<para> +The <structfield>fill_data</structfield> and +<structfield>fill_index</structfield> fields are not used by the +device driver. Instead these fields are available to the refill +function to keep track of the current state of the transfer. +</para> +</listitem> +<listitem> +<para> +When <structfield>buffer_size</structfield> is 0 and +<structfield>fill_buffer_fn</structfield> is NULL, no more data is +available and the transfer has completed. +</para> +</listitem> +<listitem> +<para> +Optionally a completion function can be installed. This will be +invoked with 0 if the transfer completes successfully, or with an +error code if the transfer is cancelled because of another control +messsage. +</para> +</listitem> +</orderedlist> +<para> +If the requested data is contiguous then the only fields that need +to be manipulated are <structfield>buffer</structfield> and +<structfield>buffer_size</structfield>, and optionally +<structfield>complete_fn</structfield>. If the requested data is not +contiguous then the initial control message handler should update +<structfield>fill_buffer_fn</structfield> and some or all of the other +fields, as required. An example of this is the handling of the +standard <emphasis>get-descriptor</emphasis> control message by +<function>usbs_handle_standard_control</function>. +</para> +</refsect2> + +<refsect2><title>Polling Support</title> +<programlisting width=72> +typedef struct usbs_control_endpoint { + void (*poll_fn)(struct usbs_control_endpoint*); + int interrupt_vector; + … +} usbs_control_endpoint; +</programlisting> +<para> +In nearly all circumstances USB I/O should be interrupt-driven. +However, there are special environments such as RedBoot where polled +operation may be appropriate. If the device driver can operate in +polled mode then it will provide a suitable function via the +<structfield>poll_fn</structfield> field, and higher-level code can +invoke this regularly. This polling function will take care of all +endpoints associated with the device, not just the control endpoint. +If the USB hardware involves a single interrupt vector then this will +be identified in the data structure as well. +</para> +</refsect2> + +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ Data Endpoints --> + +<refentry id="usbs-data"> +<refmeta> +<refentrytitle>Data Endpoints</refentrytitle> +</refmeta> +<refnamediv> +<refname>Data Endpoints</refname> +<refpurpose>Data endpoint data structures</refpurpose> +</refnamediv> + +<refsynopsisdiv> +<synopsis> +#include <cyg/io/usb/usbs.h> + +typedef struct usbs_rx_endpoint { + void (*start_rx_fn)(struct usbs_rx_endpoint*); + void (*set_halted_fn)(struct usbs_rx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + unsigned char* buffer; + int buffer_size; + cyg_bool halted; +} usbs_rx_endpoint; + +typedef struct usbs_tx_endpoint { + void (*start_tx_fn)(struct usbs_tx_endpoint*); + void (*set_halted_fn)(struct usbs_tx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + const unsigned char* buffer; + int buffer_size; + cyg_bool halted; +} usbs_tx_endpoint; +</synopsis> +</refsynopsisdiv> + +<refsect1><title>Receive and Transmit Data Structures</title> +<para> +In addition to a single <structname>usbs_control_endpoint</structname> +data structure per USB slave device, the USB device driver should also +provide receive and transmit data structures corresponding to the +other endpoints. The names of these are determined by the device +driver. For example, the SA1110 USB device driver package provides +<literal>usbs_sa11x0_ep1</literal> for receives and +<literal>usbs_sa11x0_ep2</literal> for transmits. +</para> +<para> +Unlike control endpoints, the common USB slave package does provide a +number of utility routines to manipulate data endpoints. For example +<link +linkend="usbs-start-rx"><function>usbs_start_rx_buffer</function></link> +can be used to receive data from the host into a buffer. In addition +the USB device driver can provide devtab entries such as +<literal>/dev/usbs1r</literal> and <literal>/dev/usbs2w</literal>, so +higher-level code can <function>open</function> these devices and then +perform blocking <function>read</function> and +<function>write</function> operations. +</para> +<para> +However, the operation of data endpoints and the various +endpoint-related functions is relatively straightforward. First +consider a <structname>usbs_rx_endpoint</structname> structure. The +device driver will provide the members +<structfield>start_rx_fn</structfield> and +<structfield>set_halted_fn</structfield>, and it will maintain the +<structfield>halted</structfield> field. To receive data, higher-level +code sets the <structfield>buffer</structfield>, +<structfield>buffer_size</structfield>, +<structfield>complete_fn</structfield> and optionally the +<structfield>complete_data</structfield> fields. Next the +<structfield>start_rx_fn</structfield> member should be called. When +the transfer has finished the device driver will invoke the completion +function, using <structfield>complete_data</structfield> as the first +argument and a size field for the second argument. A negative size +indicates an error of some sort: <literal>-EGAIN</literal> indicates +that the endpoint has been halted, usually at the request of the host; +<literal>-EPIPE</literal> indicates that the connection between the +host and the peripheral has been broken. Certain device drivers may +generate other error codes. +</para> +<para> +If higher-level code needs to halt or unhalt an endpoint then it can +invoke the <structfield>set_halted_fn</structfield> member. When an +endpoint is halted, invoking <structfield>start_rx_fn</structfield> +wit <structfield>buffer_size</structfield> set to 0 indicates that +higher-level code wants to block until the endpoint is no longer +halted; at that point the completion function will be invoked. +</para> +<para> +USB device drivers are allowed to assume that higher-level protocols +ensure that host and peripheral agree on the amount of data that will +be transferred, or at least on an upper bound. Therefore there is no +need for the device driver to maintain its own buffers, and copy +operations are avoided. If the host sends more data than expected then +the resulting behaviour is undefined. +</para> +<para> +Transmit endpoints work in essentially the same way as receive +endpoints. Higher-level code should set the +<structfield>buffer</structfield> and +<structfield>buffer_size</structfield> fields to point at the data to +be transferred, then call <structfield>start_tx_fn</structfield>, and +the device driver will invoked the completion function when the +transfer has completed. +</para> +<para> +USB device drivers are not expected to perform any locking. If at any +time there are two concurrent receive operations for a given endpoint, +or two concurrent transmit operations, then the resulting behaviour is +undefined. It is the responsibility of higher-level code to perform +any synchronisation that may be necessary. In practice, conflicts are +unlikely because typically a given endpoint will only be accessed +sequentially by just one part of the overall system. +</para> + +</refsect1> + +</refentry> + +<!-- }}} --> +<!-- {{{ Writing a USB Device Driver --> + +<refentry id="usbs-writing"> +<refmeta> +<refentrytitle>Writing a USB Device Driver</refentrytitle> +</refmeta> +<refnamediv> +<refname>Writing a USB Device Driver</refname> +<refpurpose>USB Device Driver Porting Guide</refpurpose> +</refnamediv> + +<refsect1><title>Introduction</title> +<para> +Often the best way to write a USB device driver will be to start with +an existing one and modify it as necessary. The information given here +is intended primarily as an outline rather than as a complete guide. +</para> +<note> +<para> +At the time of writing only one USB device driver has been +implemented. Hence it is possible, perhaps probable, that some +portability issues have not yet been addressed. One issue +involves the different types of transfer, for example the initial +target hardware had no support for isochronous or interrupt transfers, +so additional functionality may be needed to switch between transfer +types. Another issue would be hardware where a given endpoint number, +say endpoint 1, could be used for either receiving or transmitting +data, but not both because a single fifo is used. Issues like these +will have to be resolved as and when additional USB device drivers are +written. +</para> +</note> +</refsect1> + +<refsect1><title>The Control Endpoint</title> +<para> +A USB device driver should provide a single <link +linkend="usbs-control"><structname>usbs_control_endpoint</structname></link> +data structure for every USB device. Typical peripherals will have +only one USB port so there will be just one such data structure in the +entire system, but theoretically it is possible to have multiple USB +devices. These may all involve the same chip, in which case a single +device driver should support multiple device instances, or they may +involve different chips. The name or names of these data structures +are determined by the device driver, but appropriate care should be +taken to avoid name clashes. +</para> +<para> +A USB device cannot be used unless the control endpoint data structure +exists. However, the presence of USB hardware in the target processor +or board does not guarantee that the application will necessarily want +to use that hardware. To avoid unwanted code or data overheads, the +device driver can provide a configuration option to determine whether +or not the endpoint 0 data structure is actually provided. A default +value of <literal>CYGINT_IO_USB_SLAVE_CLIENTS</literal> ensures that +the USB driver will be enabled automatically if higher-level code does +require USB support, while leaving ultimate control to the user. +</para> +<para> +The USB device driver is responsible for filling in the +<structfield>start_fn</structfield>, +<structfield>poll_fn</structfield> and +<structfield>interrupt_vector</structfield> fields. Usually this can +be achieved by static initialization. The driver is also largely +responsible for maintaining the <structfield>state</structfield> +field. The <structfield>control_buffer</structfield> array should be +used to hold the first packet of a control message. The +<structfield>buffer</structfield> and other fields related to data +transfers will be managed <link +linkend="usbs-control-buffer">jointly</link> by higher-level code and +the device driver. The remaining fields are generally filled in by +higher-level code, although the driver should initialize them to NULL +values. +</para> +<para> +Hardware permitting, the USB device should be inactive until the +<structfield>start_fn</structfield> is invoked, for example by +tristating the appropriate pins. This prevents the host from +interacting with the peripheral before all other parts of the system +have initialized. It is expected that the +<structfield>start_fn</structfield> will only be invoked once, shortly +after power-up. +</para> +<para> +Where possible the device driver should detect state changes, such as +when the connection between host and peripheral is established, and +<link linkend="usbs-control-state">report</link> these to higher-level +code via the <structfield>state_change_fn</structfield> callback, if +any. The state change to and from configured state cannot easily be +handled by the device driver itself, instead higher-level code such as +the common USB slave package will take care of this. +</para> +<para> +Once the connection between host and peripheral has been established, +the peripheral must be ready to accept control messages at all times, +and must respond to these within certain time constraints. For +example, the standard set-address control message must be handled +within 50ms. The USB specification provides more information on these +constraints. The device driver is responsible for receiving the +initial packet of a control message. This packet will always be eight +bytes and should be stored in the +<structfield>control_buffer</structfield> field. Certain standard +control messages should be detected and handled by the device driver +itself. The most important is set-address, but usually the get-status, +set-feature and clear-feature requests when applied to halted +endpoints should also be handled by the driver. Other standard control +messages should first be passed on to the +<structfield>standard_control_fn</structfield> callback (if any), and +finally to the default handler +<function>usbs_handle_standard_control</function> provided by the +common USB slave package. Class, vendor and reserved control messages +should always be dispatched to the appropriate callback and there is +no default handler for these. +</para> +<para> +Some control messages will involve further data transfer, not just the +initial packet. The device driver must handle this in accordance with +the USB specification and the <link +linkend="usbs-control-buffer">buffer management strategy</link>. The +driver is also responsible for keeping track of whether or not the +control operation has succeeded and generating an ACK or STALL +handshake. +</para> +<para> +The polling support is optional and may not be feasible on all +hardware. It is only used in certain specialised environments such as +RedBoot. A typical implementation of the polling function would just +check whether or not an interrupt would have occurred and, if so, call +the same code that the interrupt handler would. +</para> +</refsect1> + +<refsect1><title>Data Endpoints</title> +<para> +In addition to the control endpoint data structure, a USB device +driver should also provide appropriate <link linkend="usbs-data">data +endpoint</link> data structures. Obviously this is only relevant if +the USB support generally is desired, that is if the control endpoint is +provided. In addition, higher-level code may not require all the +endpoints, so it may be useful to provide configuration options that +control the presence of each endpoint. For example, the intended +application might only involve a single transmit endpoint and of +course control messages, so supporting receive endpoints might waste +memory. +</para> +<para> +Conceptually, data endpoints are much simpler than the control +endpoint. The device driver has to supply two functions, one for +data transfers and another to control the halted condition. These +implement the functionality for +<link linkend="usbs-start-rx"><function>usbs_start_rx_buffer</function></link>, +<link linkend="usbs-start-tx"><function>usbs_start_tx_buffer</function></link>, +<link linkend="usbs-halt"><function>usbs_set_rx_endpoint_halted</function></link> and +<link linkend="usbs-halt"><function>usbs_set_tx_endpoint_halted</function></link>. +The device driver is also responsible for maintaining the +<structfield>halted</structfield> status. +</para> +<para> +For data transfers, higher-level code will have filled in the +<structfield>buffer</structfield>, +<structfield>buffer_size</structfield>, +<structfield>complete_fn</structfield> and +<structfield>complete_data</structfield> fields. The transfer function +should arrange for the transfer to start, allowing the host to send or +receive packets. Typically this will result in an interrupt at the end +of the transfer or after each packet. Once the entire transfer has +been completed, the driver's interrupt handling code should invoke the +completion function. This can happen either in DSR context or thread +context, depending on the driver's implementation. There are a number +of special cases to consider. If the endpoint is halted when the +transfer is started then the completion function can be invoked +immediately with <literal>-EAGAIN</literal>. If the transfer cannot be +completed because the connection is broken then the completion +function should be invoked with <literal>-EPIPE</literal>. If the +endpoint is stalled during the transfer, either because of a standard +control message or because higher-level code calls the appropriate +<structfield>set_halted_fn</structfield>, then again the completion +function should be invoked with <literal>-EAGAIN</literal>. Finally, +the <<function>usbs_start_rx_endpoint_wait</function> and +<function>usbs_start_tx_endpoint_wait</function> functions involve +calling the device driver's data transfer function with a buffer size +of 0 bytes. +</para> +</refsect1> + +<refsect1><title>Devtab Entries</title> +<para> +For some applications or higher-level packages it may be more +convenient to use traditional open/read/write I/O calls rather than +the non-blocking USB I/O calls. To support this the device driver can +provide a devtab entry for each endpoint, for example: +</para> +<programlisting width=72> +#ifdef CYGVAR_DEVS_USB_SA11X0_EP1_DEVTAB_ENTRY + +static CHAR_DEVIO_TABLE(usbs_sa11x0_ep1_devtab_functions, + &cyg_devio_cwrite, + &usbs_devtab_cread, + &cyg_devio_bwrite, + &cyg_devio_bread, + &cyg_devio_select, + &cyg_devio_get_config, + &cyg_devio_set_config); + +static CHAR_DEVTAB_ENTRY(usbs_sa11x0_ep1_devtab_entry, + CYGDAT_DEVS_USB_SA11X0_DEVTAB_BASENAME "1r", + 0, + &usbs_sa11x0_ep1_devtab_functions, + &usbs_sa11x0_devtab_dummy_init, + 0, + (void*) &usbs_sa11x0_ep1); +#endif +</programlisting> +<para> +Again care must be taken to avoid name clashes. This can be achieved +by having a configuration option to control the base name, with a +default value of e.g. <literal>/dev/usbs</literal>, and appending an +endpoint-specific string. This gives the application developer +sufficient control to eliminate any name clashes. The common USB slave +package provides functions <function>usbs_devtab_cwrite</function> and +<function>usbs_devtab_cread</function>, which can be used in the +function tables for transmit and receive endpoints respectively. The +private field <structfield>priv</structfield> of the devtab entry +should be a pointer to the underlying endpoint data structure. +</para> +<para> +Because devtab entries are never accessed directly, only indirectly, +they would usually be eliminated by the linker. To avoid this the +devtab entries should normally be defined in a separate source file +which ends up the special library <filename>libextras.a</filename> +rather than in the default library <filename>libtarget.a</filename>. +</para> +<para> +Not all applications or higher-level packages will want to use the +devtab entries and the blocking I/O facilities. It may be appropriate +for the device driver to provide additional configuration options that +control whether or not any or all of the devtab entries should be +provided, to avoid unnecessary memory overheads. +</para> +</refsect1> + +<refsect1><title>Interrupt Handling</title> +<para> +A typical USB device driver will need to service interrupts for all of +the endpoints and possibly for additional USB events such as entering +or leaving suspended mode. Usually these interrupts need not be +serviced directly by the ISR. Instead, they can be left to a DSR. If +the peripheral is not able to accept or send another packet just yet, +the hardware will generate a NAK and the host will just retry a little +bit later. If high throughput is required then it may be desirable to +handle the bulk transfer protocol largely at ISR level, that is take +care of each packet in the ISR and only activate the DSR once the +whole transfer has completed. +</para> +<para> +Control messages may involve invoking arbitrary callback functions in +higher-level code. This should normally happen at DSR level. Doing it +at ISR level could seriously affect the system's interrupt latency and +impose unacceptable constraints on what operations can be performed by +those callbacks. If the device driver requires a thread anyway then it +may be appropriate to use this thread for invoking the callbacks, but +usually it is not worthwhile to add a new thread to the system just +for this; higher-level code is expected to write callbacks that +function sensibly at DSR level. Much the same applies to the +completion functions associated with data transfers. These should also +be invoked at DSR or thread level. +</para> +</refsect1> + +</refentry> + +<!-- }}} --> + +</reference> \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/include/usbs.h @@ -0,0 +1,353 @@ +#ifndef CYGONCE_USBS_H +# define CYGONCE_USBS_H +//========================================================================== +// +// include/usbs.h +// +// The generic USB slave-side support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// Purpose: +// Description: USB slave-side support +// +// +//####DESCRIPTIONEND#### +//========================================================================== + +# include <pkgconf/system.h> +# include <cyg/infra/cyg_type.h> +# include <cyg/io/usb/usb.h> + +#ifdef __cplusplus +extern "C" { +#endif + +// The USB slave-side eCos support involves a number of different +// components: +// +// 1) a hardware-specific package to drive a specific chip implementation. +// This provides access to the endpoints. All the hardware-specific +// packages implement a common interface. +// +// 2) a common package (this one). This defines the interface implemented +// by the hardware-specific packages. It also provides support for +// the various generic control messages, using information provided +// by higher-level code and invoking callbacks as appropriate. +// +// 3) some number of support packages for particular types of +// application, for example ethernet or mass-storage. +// +// Typically there will only be one USB slave device, although the design +// does allow for multiple devices. Each device should provide a +// usbs_control_endpoint structure and zero or more usbs_data_endpoint +// structures. Each usbs_data_endpoint structure supports uni-directional +// transfers on a single endpoint. If an endpoint can support multiple +// types of transfer then there will be some control operation to switch +// between bulk, interrupt and isochronous. +// +// Access to the USB endpoints can go either via usbs_ calls which +// take a usbs_endpoint structure, or via open/read/write calls. The +// latter is more likely to be used in application code since it +// involves a familiar interface. The former is more appropriate for +// eCos packages layered on top of the USB code. The difference is +// synchronous vs. asynchronous: the open/read/write model involves +// blocking operations, implying a need for extra threads; the usbs_ +// calls involve start operations and a completion callback. In +// practice the read and write calls are implemented using the +// lower-level code. + +// Enumeration data. This requires information about the hardware, +// specifically what endpoints are available and what they get used +// for. It also requires information about the application class +// packages that are in the configuration, and quite possibly about +// things in application space. Some of the enumeration info such as +// the vendor id is inherently application-specific. Hence there is no +// way of generating part or all of the the enumeration information +// automatically, instead it is up to application code to supply this. +// +// The intention is that application provides all the data via const +// static objects, allowing the data to live in ROM. Alternatively the +// data structures can go into the .data section as normal, allowing +// them to be edited at run-time. +// +// There can be only one device descriptor, so that is part of the +// main enumeration data structure. There can be an unknown number of +// configurations so application code has to initialize an array of +// these. Ditto for interfaces and endpoints. The first x interfaces +// in the array correspond to the first configuration, the next y +// interfaces to the second configuration, etc. The endpoints array +// works in the same way. +// +// In the initial implementation multiple languages are not supported +// so a simple array of strings suffices. The first entry of these +// is still special in that it should define a single supported +// LANGID. All strings should be encoded as per the USB standard: +// a length field, a type code of USB_STRING_DESCRIPTOR_TYPE, +// and data in unicode format. In future multiple language support +// may be supported via configury with the default case remaining +// a single language, thus avoiding incompatibility problems. + +typedef struct usbs_enumeration_data { + usb_device_descriptor device; + int total_number_interfaces; + int total_number_endpoints; + int total_number_strings; + const usb_configuration_descriptor* configurations; + const usb_interface_descriptor* interfaces; + const usb_endpoint_descriptor* endpoints; + const unsigned char** strings; +} usbs_enumeration_data; + +// The current state of a USB device. This involves a bit to mark +// whether or not the device has been suspended, plus a state machine. +// On some hardware it may not be possible to distinguish between the +// detached, attached and powered states. If so then the initial state +// will be POWERED. + +#define USBS_STATE_DETACHED 0x01 +#define USBS_STATE_ATTACHED 0x02 +#define USBS_STATE_POWERED 0x03 +#define USBS_STATE_DEFAULT 0x04 +#define USBS_STATE_ADDRESSED 0x05 +#define USBS_STATE_CONFIGURED 0x06 +#define USBS_STATE_MASK 0x7F +#define USBS_STATE_SUSPENDED (1 << 7) + +// State changes. Application code or higher-level packages should +// install an appropriate state change function which will get +// invoked with details of the state change. +typedef enum { + USBS_STATE_CHANGE_DETACHED = 1, + USBS_STATE_CHANGE_ATTACHED = 2, + USBS_STATE_CHANGE_POWERED = 3, + USBS_STATE_CHANGE_RESET = 4, + USBS_STATE_CHANGE_ADDRESSED = 5, + USBS_STATE_CHANGE_CONFIGURED = 6, + USBS_STATE_CHANGE_DECONFIGURED = 7, + USBS_STATE_CHANGE_SUSPENDED = 8, + USBS_STATE_CHANGE_RESUMED = 9 +} usbs_state_change; + +typedef enum { + USBS_CONTROL_RETURN_HANDLED = 0, + USBS_CONTROL_RETURN_UNKNOWN = 1, + USBS_CONTROL_RETURN_STALL = 2 +} usbs_control_return; + +typedef struct usbs_control_endpoint { + // The state is maintained by the USB code and should not be + // modified by anything higher up. + int state; + + // The enumeration data should be supplied by higher level code, + // usually the application. Often this data will be constant. + const usbs_enumeration_data* enumeration_data; + + // This function pointer is supplied by the USB device driver. + // Application code should invoke it directly or via the + // usbs_start() function when the system is ready. Typically it + // will cause the USB lines to switch from tristate to active, + // and the USB host/hub should detect this. + void (*start_fn)(struct usbs_control_endpoint*); + + // This function is used for polled operation when interrupts + // are disabled. This can happen in some debugging contexts. + // Higher-level code may also need to know about the interrupt + // number(s) used. + void (*poll_fn)(struct usbs_control_endpoint*); + int interrupt_vector; + + // When a new control message arrives it will be in this buffer + // where the appropriate callback functions can examine it. The + // USB code will not modify the buffer unless a new control + // message arrives. The control_buffer can also be re-used + // by handlers to maintain some state information, e.g. + // for coping with complicated IN requests, but this is only + // allowed if they actually handle the request. + unsigned char control_buffer[8]; + + // This callback will be invoked by the USB code following a + // change in USB state, e.g. to SUSPENDED mode. Higher-level code + // should install a suitable function. There is some callback data + // as well. This gets passed explicitly to the callback function, + // in addition to the control endpoint structure. The reason is + // that the actual state change callback may be some sort of + // multiplexer inside a multifunction peripheral, and this + // multiplexer wants to invoke device-specific state change + // functions. However in simple devices those device-specific + // state change functions could be invoked directly. + void (*state_change_fn)(struct usbs_control_endpoint*, void*, usbs_state_change, int /* old state */); + void* state_change_data; + // When a standard control message arrives, the device driver will + // detect some requests such as SET_ADDRESS and handle it + // internally. Otherwise if higher-level code has installed a + // callback then that will be invoked. If the callback returns + // UNKNOWN then the default handler usbs_handle_standard_control() + // is used to process the request. + usbs_control_return (*standard_control_fn)(struct usbs_control_endpoint*, void*); + void* standard_control_data; + + // These three callbacks are used for other types of control + // messages. The generic USB code has no way of knowing what + // such control messages are about. + usbs_control_return (*class_control_fn)(struct usbs_control_endpoint*, void*); + void* class_control_data; + usbs_control_return (*vendor_control_fn)(struct usbs_control_endpoint*, void*); + void* vendor_control_data; + usbs_control_return (*reserved_control_fn)(struct usbs_control_endpoint*, void*); + void* reserved_control_data; + + // If a control operation involves transferring more data than + // just the initial eight-byte packet, the following fields are + // used to keep track of the current operation. The original + // control request indicates the direction of the transfer (IN or + // OUT) and a length field. For OUT this length is exact, for IN + // it is an upper bound. The transfer operates mostly as per the + // bulk protocol, but if the length requested is an exact multiple + // of the control fifo size (typically eight bytes) then there + // is no need for an empty packet at the end. + // + // For an OUT operation the control message handler should supply + // a suitable buffer via the "buffer" field below. The only other + // field of interest is the complete_fn which must be provided and + // will be invoked once all the data has arrived. Alternatively + // the OUT operation may get aborted if a new control message + // arrives. The second argument is an error code -EPIPE or -EIO, + // or zero to indicate success. The return code is used by the + // device driver during the status phase. + // + // IN is more complicated and the defined interface makes it + // possible to gather data from multiple locations, eliminating + // the need for copying into large buffers in some circumstances. + // Basically when an IN request arrives the device driver will + // look at the buffer and buffer_size fields, extracting data from + // there if possible. If the current buffer has been exhausted + // then the the refill function will be invoked, and this can + // reset the buffer and size fields to point somewhere else. + // This continues until such time that there is no longer + // a refill function and the current buffer is empty. The + // refill function can use the refill_data and refill_index + // to keep track of the current state. The control_buffer + // fields are available as well. At the end of the transfer, + // if a completion function has been supplied then it will + // be invoked. The return code will be ignored. + unsigned char* buffer; + int buffer_size; + void (*fill_buffer_fn)(struct usbs_control_endpoint*); + void* fill_data; + int fill_index; + usbs_control_return (*complete_fn)(struct usbs_control_endpoint*, int); +} usbs_control_endpoint; + +// Data endpoints are a little bit simpler, but not much. From the +// perspective of a device driver things a single buffer is most +// convenient, but that is quite likely to require a max-size buffer +// at a higher level and an additional copy operation. Supplying +// a vector of buffers is a bit more general, but in a layered +// system it may be desirable to prepend to this vector... +// A combination of a current buffer and a refill/empty function +// offers flexibility, at the cost of additional function calls +// from inside the device driver. +// +// FIXME: implement support for fill/empty functions. +// +// Some USB devices may prefer buffers of particular alignment, +// e.g. for DMA purposes. This is hard to reconcile with the +// current interface. However pushing such alignment restrictions +// etc. up into the higher levels is difficult, e.g. it does +// not map at all onto a conventional read/write interface. +// The device driver will just have to do the best it can. +// +// The completion function will be invoked at the end of the transfer. +// The second argument indicates per-transfer completion data. The +// third argument indicates the total amount received, or an error +// code: typically -EPIPE to indicate a broken conenction; -EAGAIN to +// indicate a stall condition; -EMSGSIZE if the host is sending more +// data than the target is expecting; or -EIO to indicate some other +// error. Individual device drivers should avoid generating other +// errors. +typedef struct usbs_rx_endpoint { + void (*start_rx_fn)(struct usbs_rx_endpoint*); + void (*set_halted_fn)(struct usbs_rx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + unsigned char* buffer; + int buffer_size; + cyg_bool halted; +} usbs_rx_endpoint; + +typedef struct usbs_tx_endpoint { + void (*start_tx_fn)(struct usbs_tx_endpoint*); + void (*set_halted_fn)(struct usbs_tx_endpoint*, cyg_bool); + void (*complete_fn)(void*, int); + void* complete_data; + const unsigned char*buffer; + int buffer_size; + cyg_bool halted; +} usbs_tx_endpoint; + +// Functions called by device drivers. +extern usbs_control_return usbs_handle_standard_control(struct usbs_control_endpoint*); + +// Utility functions. These just invoke the corresponding function +// pointers in the endpoint structures. It is assumed that the +// necessary fields in the endpoint structures will have been +// filled in already. +extern void usbs_start(usbs_control_endpoint*); +extern void usbs_start_rx(usbs_rx_endpoint*); +extern void usbs_start_tx(usbs_tx_endpoint*); +extern void usbs_start_rx_buffer(usbs_rx_endpoint*, unsigned char*, int, void (*)(void*, int), void*); +extern void usbs_start_tx_buffer(usbs_tx_endpoint*, const unsigned char*, int, void (*)(void*, int), void*); +extern cyg_bool usbs_rx_endpoint_halted(usbs_rx_endpoint*); +extern cyg_bool usbs_tx_endpoint_halted(usbs_tx_endpoint*); +extern void usbs_set_rx_endpoint_halted(usbs_rx_endpoint*, cyg_bool); +extern void usbs_set_tx_endpoint_halted(usbs_tx_endpoint*, cyg_bool); +extern void usbs_start_rx_endpoint_wait(usbs_rx_endpoint*, void (*)(void*, int), void*); +extern void usbs_start_tx_endpoint_wait(usbs_tx_endpoint*, void (*)(void*, int), void*); + +// Functions that can go into devtab entries. These should not be +// called directly, they are intended only for use by USB device +// drivers. +#if defined(CYGPKG_IO) && defined(CYGPKG_ERROR) +#include <cyg/io/io.h> +extern Cyg_ErrNo usbs_devtab_cwrite(cyg_io_handle_t, const void*, cyg_uint32*); +extern Cyg_ErrNo usbs_devtab_cread(cyg_io_handle_t, const void*, cyg_uint32*); +extern Cyg_ErrNo usbs_devtab_get_config(cyg_io_handle_t, cyg_uint32, void*, cyg_uint32*); +extern Cyg_ErrNo usbs_devtab_set_config(cyg_io_handle_t, cyg_uint32, const void*, cyg_uint32*); +#endif + +#ifdef __cplusplus +} // extern "C" { +#endif + +#endif // CYGONCE_USBS_H +
new file mode 100644 --- /dev/null +++ b/packages/io/usb/slave/current/src/usbs.c @@ -0,0 +1,703 @@ +//========================================================================== +// +// usbs.c +// +// Generic USB slave-side support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): bartv +// Contributors: bartv +// Date: 2000-10-04 +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/system.h> +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> +#include <cyg/infra/cyg_trac.h> +#include <cyg/infra/diag.h> +#include <cyg/io/usb/usbs.h> +#include <cyg/hal/drv_api.h> + +// ---------------------------------------------------------------------------- +// Devtab entry support. This code can be compiled with no overheads as +// long as the necessary support package is in place. +#ifdef CYGPKG_IO +# include <cyg/io/io.h> +# include <cyg/io/devtab.h> +// ---------------------------------------------------------------------------- +// read()/write() functions applied to USB endpoints. These just +// indirect via the usbs_endpoint structures and wait for the +// callback to happen. + +typedef struct usbs_callback_data { + bool completed; + int result; + cyg_drv_mutex_t lock; + cyg_drv_cond_t signal; +} usbs_callback_data; + +static void +usbs_devtab_callback(void* arg, int result) +{ + usbs_callback_data* callback_data = (usbs_callback_data*) arg; + callback_data->result = result; + callback_data->completed = true; + cyg_drv_cond_signal(&(callback_data->signal)); +} + +Cyg_ErrNo +usbs_devtab_cwrite(cyg_io_handle_t handle, const void* buf, cyg_uint32* size) +{ + usbs_callback_data wait; + cyg_devtab_entry_t* devtab_entry; + usbs_tx_endpoint* endpoint; + int result = ENOERR; + + CYG_REPORT_FUNCTION(); + + wait.completed = 0; + cyg_drv_mutex_init(&wait.lock); + cyg_drv_cond_init(&wait.signal, &wait.lock); + + devtab_entry = (cyg_devtab_entry_t*) handle; + CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied"); + endpoint = (usbs_tx_endpoint*) devtab_entry->priv; + + CYG_CHECK_DATA_PTR( endpoint, "The handle must correspond to a USB endpoint"); + CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The endpoint must have a start_tx function"); + + endpoint->buffer = (unsigned char*) buf; + endpoint->buffer_size = (int) *size; + endpoint->complete_fn = &usbs_devtab_callback; + endpoint->complete_data = (void*) &wait; + (*endpoint->start_tx_fn)(endpoint); + + cyg_drv_mutex_lock(&wait.lock); + while (!wait.completed) { + cyg_drv_cond_wait(&wait.signal); + } + cyg_drv_mutex_unlock(&wait.lock); + if (wait.result < 0) { + result = wait.result; + } else { + *size = wait.result; + } + + cyg_drv_cond_destroy(&wait.signal); + cyg_drv_mutex_destroy(&wait.lock); + + CYG_REPORT_RETURN(); + return result; +} + +Cyg_ErrNo +usbs_devtab_cread(cyg_io_handle_t handle, const void* buf, cyg_uint32* size) +{ + usbs_callback_data wait; + cyg_devtab_entry_t* devtab_entry; + usbs_rx_endpoint* endpoint; + int result = ENOERR; + + CYG_REPORT_FUNCTION(); + + wait.completed = 0; + cyg_drv_mutex_init(&wait.lock); + cyg_drv_cond_init(&wait.signal, &wait.lock); + + devtab_entry = (cyg_devtab_entry_t*) handle; + CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied"); + endpoint = (usbs_rx_endpoint*) devtab_entry->priv; + + CYG_CHECK_DATA_PTR( endpoint, "The handle must correspond to a USB endpoint"); + CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The endpoint must have a start_rx function"); + + endpoint->buffer = (unsigned char*) buf; + endpoint->buffer_size = (int) *size; + endpoint->complete_fn = &usbs_devtab_callback; + endpoint->complete_data = (void*) &wait; + (*endpoint->start_rx_fn)(endpoint); + cyg_drv_mutex_lock(&wait.lock); + while (!wait.completed) { + cyg_drv_cond_wait(&wait.signal); + } + cyg_drv_mutex_unlock(&wait.lock); + if (wait.result < 0) { + result = wait.result; + } else { + *size = wait.result; + } + + cyg_drv_cond_destroy(&wait.signal); + cyg_drv_mutex_destroy(&wait.lock); + + CYG_REPORT_RETURN(); + return result; +} + +// ---------------------------------------------------------------------------- +// More devtab functions, this time related to ioctl() style operations. +Cyg_ErrNo +usbs_devtab_get_config(cyg_io_handle_t handle, cyg_uint32 code, void* buf, cyg_uint32* size) +{ + return -EINVAL; +} + +Cyg_ErrNo +usbs_devtab_set_config(cyg_io_handle_t handle, cyg_uint32 code, const void* buf, cyg_uint32* size) +{ + return -EINVAL; +} + +#endif // CYGPKG_IO + +// ---------------------------------------------------------------------------- +// USB-specific functions that are useful for applications/packages which +// do not want to use the devtab interface. These may get called in DSR +// context. + +void +usbs_start_rx(usbs_rx_endpoint* endpoint) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The USB endpoint must support receive operations"); + (*endpoint->start_rx_fn)(endpoint); +} + +void +usbs_start_rx_buffer(usbs_rx_endpoint* endpoint, + unsigned char* buf, int size, + void (*callback_fn)(void *, int), void* callback_arg) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The USB endpoint must support receive operations"); + + endpoint->buffer = buf; + endpoint->buffer_size = size; + endpoint->complete_fn = callback_fn; + endpoint->complete_data = callback_arg; + (*endpoint->start_rx_fn)(endpoint); +} + +void +usbs_start_tx(usbs_tx_endpoint* endpoint) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The USB endpoint must support receive operations"); + (*endpoint->start_tx_fn)(endpoint); +} + +void +usbs_start_tx_buffer(usbs_tx_endpoint* endpoint, + const unsigned char* buf, int size, + void (*callback_fn)(void*, int), void *callback_arg) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The USB endpoint must support receive operations"); + + endpoint->buffer = buf; + endpoint->buffer_size = size; + endpoint->complete_fn = callback_fn; + endpoint->complete_data = callback_arg; + (*endpoint->start_tx_fn)(endpoint); +} + +void +usbs_start(usbs_control_endpoint* endpoint) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->start_fn, "The USB endpoint should have a start function"); + + (*endpoint->start_fn)(endpoint); +} + +cyg_bool +usbs_rx_endpoint_halted(usbs_rx_endpoint* endpoint) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + return endpoint->halted; +} + +cyg_bool +usbs_tx_endpoint_halted(usbs_tx_endpoint* endpoint) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + return endpoint->halted; +} + +void +usbs_set_rx_endpoint_halted(usbs_rx_endpoint* endpoint, cyg_bool halted) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->set_halted_fn, "The USB endpoint should have a set-halted function"); + (*endpoint->set_halted_fn)(endpoint, halted); +} + +void +usbs_set_tx_endpoint_halted(usbs_tx_endpoint* endpoint, cyg_bool halted) +{ + CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied"); + CYG_CHECK_FUNC_PTR( endpoint->set_halted_fn, "The USB endpoint should have a set-halted function"); + (*endpoint->set_halted_fn)(endpoint, halted); +} + +void +usbs_start_rx_endpoint_wait(usbs_rx_endpoint* endpoint, void (*callback_fn)(void*, int), void* callback_data) +{ + endpoint->buffer = (unsigned char*) 0; + endpoint->buffer_size = 0; + endpoint->complete_fn = callback_fn; + endpoint->complete_data = callback_data; + (*endpoint->start_rx_fn)(endpoint); +} + +void +usbs_start_tx_endpoint_wait(usbs_tx_endpoint* endpoint, void (*callback_fn)(void*, int), void* callback_data) +{ + endpoint->buffer = (unsigned char*) 0; + endpoint->buffer_size = 0; + endpoint->complete_fn = callback_fn; + endpoint->complete_data = callback_data; + (*endpoint->start_tx_fn)(endpoint); +} + + +// ---------------------------------------------------------------------------- +// Handling of standard control messages. This will be invoked by +// a USB device driver, usually at DSR level, to process any control +// messages that cannot be handled by the hardware itself and that +// have also not been handled by the application-specific handler +// (if any). +// +// Because this function can run at DSR level performance is important. +// +// The various standard control messages are affected as follows: +// +// clear-feature: nothing can be done here about device requests to +// disable remote-wakeup or about endpoint halt requests. It appears +// to be legal to clear no features on an interface. +// +// get-configuration: if the device is not configured a single byte 0 +// should be returned. Otherwise this code assumes only one configuration +// is supported and its id can be extracted from the enumeration data. +// For more complicated devices get-configuration has to be handled +// at a higher-level. +// +// get-descriptor: this is the big one. It is used to obtain +// the enumeration data. An auxiliary refill function is needed. +// +// get-interface: this can be used to identify the current variant +// for a given interface within a configuration. For simple devices +// there will be only interface, 0. For anything more complicated +// higher level code will have to take care of the request. +// +// get-status. Much the same as clear-feature. +// +// set-address. Must be handled at the device driver level. +// +// set-configuration: a value of 0 is used to deconfigure the device, +// which can be handled here. Otherwise this code assumes that only +// a single configuration is supported and enables that. For anything +// more complicated higher-level code has to handle this request. +// +// set-descriptor: used to update the enumeration data. This is not +// supported here, although higher-level code can choose to do so. +// +// set-feature. See clear-feature and get-status. +// +// set-interface. Variant interfaces are not supported by the +// base code so this request has to be handled at a higher level. +// +// synch-frame. This is only relevant for isochronous transfers +// which are not yet supported, and anyway it is not clear what +// could be done about these requests here. + +// This refill function handles GET_DESCRIPTOR requests for a +// configuration. For details of the control_buffer usage see +// the relevant code in the main callback. +static void +usbs_configuration_descriptor_refill(usbs_control_endpoint* endpoint) +{ + usb_devreq* req = (usb_devreq*) endpoint->control_buffer; + int length = (req->length_hi << 8) | req->length_lo; + int sent = (req->index_hi << 8) | req->index_lo; + int current_interface = req->type; + int last_interface = req->request; + int current_endpoint = req->value_lo; + int last_endpoint = req->value_hi; + cyg_bool done = false; + + if (current_endpoint == last_endpoint) { + // The next transfer should be a single interface - unless we have already finished. + if (current_interface == last_interface) { + done = true; + } else { + endpoint->buffer = (unsigned char*) &(endpoint->enumeration_data->interfaces[current_interface]); + if (USB_INTERFACE_DESCRIPTOR_LENGTH >= (length - sent)) { + endpoint->buffer_size = length - sent; + done = true; + } else { + endpoint->buffer_size = USB_INTERFACE_DESCRIPTOR_LENGTH; + sent += USB_INTERFACE_DESCRIPTOR_LENGTH; + // Note that an interface with zero endpoints is ok. We'll just move + // to the next interface in the next call. + last_endpoint = current_endpoint + + endpoint->enumeration_data->interfaces[current_interface].number_endpoints; + current_interface++; + } + } + } else { + // The next transfer should be a single endpoint. The + // endpoints are actually contiguous array elements + // but may not be packed, so they have to be transferred + // one at a time. + endpoint->buffer = (unsigned char*) &(endpoint->enumeration_data->endpoints[current_endpoint]); + if ((sent + USB_ENDPOINT_DESCRIPTOR_LENGTH) >= length) { + endpoint->buffer_size = length - sent; + done = true; + } else { + endpoint->buffer_size = USB_ENDPOINT_DESCRIPTOR_LENGTH; + current_endpoint ++; + } + } + + if (done) { + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + } else { + req->type = (unsigned char) current_interface; + req->value_lo = (unsigned char) current_endpoint; + req->value_hi = (unsigned char) last_endpoint; + req->index_hi = (unsigned char) (sent >> 8); + req->index_lo = (unsigned char) (sent & 0x00FF); + } +} + +usbs_control_return +usbs_handle_standard_control(usbs_control_endpoint* endpoint) +{ + usbs_control_return result = USBS_CONTROL_RETURN_UNKNOWN; + usb_devreq* req = (usb_devreq*) endpoint->control_buffer; + int length; + int direction; + int recipient; + + length = (req->length_hi << 8) | req->length_lo; + direction = req->type & USB_DEVREQ_DIRECTION_MASK; + recipient = req->type & USB_DEVREQ_RECIPIENT_MASK; + + if (USB_DEVREQ_CLEAR_FEATURE == req->request) { + + if (USB_DEVREQ_RECIPIENT_INTERFACE == recipient) { + // The host should expect no data back, the device must + // be configured, and there are no defined features to clear. + if ((0 == length) && + (USBS_STATE_CONFIGURED == (endpoint->state & USBS_STATE_MASK)) && + (0 == req->value_lo)) { + + int interface_id = req->index_lo; + CYG_ASSERT( 1 == endpoint->enumeration_data->total_number_interfaces, \ + "Higher level code should have handled this request"); + + if (interface_id == endpoint->enumeration_data->interfaces[0].interface_id) { + result = USBS_CONTROL_RETURN_HANDLED; + } else { + result = USBS_CONTROL_RETURN_STALL; + } + + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } + + } else if (USB_DEVREQ_GET_CONFIGURATION == req->request) { + + // Return a single byte 0 if the device is not currently + // configured. Otherwise assume a single configuration + // in the enumeration data and return its id. + if ((1 == length) && (USB_DEVREQ_DIRECTION_IN == direction)) { + + if (USBS_STATE_CONFIGURED == (endpoint->state & USBS_STATE_MASK)) { + CYG_ASSERT( 1 == endpoint->enumeration_data->device.number_configurations, \ + "Higher level code should have handled this request"); + endpoint->control_buffer[0] = endpoint->enumeration_data->configurations[0].configuration_id; + } else { + endpoint->control_buffer[0] = 0; + } + endpoint->buffer = endpoint->control_buffer; + endpoint->buffer_size = 1; + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + result = USBS_CONTROL_RETURN_HANDLED; + + } else { + result = USBS_CONTROL_RETURN_STALL; + } + + } else if (USB_DEVREQ_GET_DESCRIPTOR == req->request) { + + // The descriptor type is in value_hi. The descriptor index + // is in value_lo. + // The hsot must expect at least one byte of data. + if ((0 == length) || (USB_DEVREQ_DIRECTION_IN != direction)) { + + result = USBS_CONTROL_RETURN_STALL; + + } else if (USB_DEVREQ_DESCRIPTOR_TYPE_DEVICE == req->value_hi) { + + // The device descriptor is easy, it is a single field in the + // enumeration data. + endpoint->buffer = (unsigned char*) &(endpoint->enumeration_data->device); + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + if (length < USB_DEVICE_DESCRIPTOR_LENGTH) { + endpoint->buffer_size = length; + } else { + endpoint->buffer_size = USB_DEVICE_DESCRIPTOR_LENGTH; + } + result = USBS_CONTROL_RETURN_HANDLED; + + } else if (USB_DEVREQ_DESCRIPTOR_TYPE_CONFIGURATION == req->value_hi) { + + // This is where things get messy. We need to supply the + // specified configuration data, followed by some number of + // interfaces and endpoints. Plus there are length limits + // to consider. First check that the specified index is valid. + if (req->value_lo >= endpoint->enumeration_data->device.number_configurations) { + result = USBS_CONTROL_RETURN_STALL; + } else { + // No such luck. OK, supplying the initial block is easy. + endpoint->buffer = (unsigned char*) &(endpoint->enumeration_data->configurations[req->value_lo]); + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + + // How much data was actually requested. If only the + // configuration itself is of interest then there is + // no need to worry about the rest. + if (length <= USB_CONFIGURATION_DESCRIPTOR_LENGTH) { + endpoint->buffer_size = length; + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + } else { + int i, j; + int start_interface; + int start_endpoint; + endpoint->buffer_size = USB_CONFIGURATION_DESCRIPTOR_LENGTH; + endpoint->fill_buffer_fn = &usbs_configuration_descriptor_refill; + + // The descriptor refill_fn needs to know what next to transfer. + // The desired interfaces and endpoints will be contiguous so + // we need to keep track of the following: + // 1) the current interface index being transferred. + // 2) the last interface that should be transferred. + // 3) the current endpoint index that should be transferred. + // 4) the last endpoint index. This marks interface/endpoint transitions. + // 5) how much has been transferred to date. + // This information can be held in the control_buffer, + // with the length field being preserved. + start_interface = 0; + start_endpoint = 0; + // For all configurations up to the desired one. + for (i = 0; i < req->value_lo; i++) { + int config_interfaces = endpoint->enumeration_data->configurations[i].number_interfaces; + + // For all interfaces in this configuration. + for (j = 0; j < config_interfaces; j++) { + // Add the number of endpoints in this interface to the current count. + CYG_ASSERT( (j + start_interface) < endpoint->enumeration_data->total_number_interfaces, \ + "Valid interface count in enumeration data"); + start_endpoint += endpoint->enumeration_data->interfaces[j + start_interface].number_endpoints; + } + // And update the index for the starting interface. + start_interface += config_interfaces; + } + CYG_ASSERT( start_interface < endpoint->enumeration_data->total_number_interfaces, \ + "Valid interface count in enumeration data"); + CYG_ASSERT( start_endpoint < endpoint->enumeration_data->total_number_endpoints, \ + "Valid endpoint count in enumeration data"); + + req->type = (unsigned char) start_interface; + req->request = (unsigned char) (start_interface + + endpoint->enumeration_data->configurations[req->value_lo].number_interfaces + ); + req->value_lo = (unsigned char) start_endpoint; + req->value_hi = (unsigned char) start_endpoint; + req->index_lo = USB_CONFIGURATION_DESCRIPTOR_LENGTH; + req->index_hi = 0; + } + result = USBS_CONTROL_RETURN_HANDLED; + } + + + } else if (USB_DEVREQ_DESCRIPTOR_TYPE_STRING == req->value_hi) { + + // As long as the index is valid, the rest is easy since + // the strings are just held in a simple array. + // NOTE: if multiple languages have to be supported + // then things get more difficult. + if (req->value_lo >= endpoint->enumeration_data->total_number_strings) { + result = USBS_CONTROL_RETURN_STALL; + } else { + endpoint->buffer = (unsigned char*) endpoint->enumeration_data->strings[req->value_lo]; + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + + if (length < endpoint->buffer[0]) { + endpoint->buffer_size = length; + } else { + endpoint->buffer_size = endpoint->buffer[0]; + } + result = USBS_CONTROL_RETURN_HANDLED; + } + + } else { + result = USBS_CONTROL_RETURN_STALL; + } + + } else if (USB_DEVREQ_GET_INTERFACE == req->request) { + + if ((1 != length) || + (USB_DEVREQ_DIRECTION_IN != direction) || + (USBS_STATE_CONFIGURED != (endpoint->state & USBS_STATE_MASK))) { + + result = USBS_CONTROL_RETURN_STALL; + + } else { + int interface_id; + + CYG_ASSERT( (1 == endpoint->enumeration_data->device.number_configurations) && \ + (1 == endpoint->enumeration_data->total_number_interfaces), \ + "Higher level code should have handled this request"); + + interface_id = (req->index_hi << 8) | req->index_lo; + if (interface_id != endpoint->enumeration_data->interfaces[0].interface_id) { + result = USBS_CONTROL_RETURN_STALL; + } else { + endpoint->control_buffer[0] = endpoint->enumeration_data->interfaces[0].alternate_setting; + endpoint->buffer = endpoint->control_buffer; + endpoint->buffer_size = 1; + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + result = USBS_CONTROL_RETURN_HANDLED; + } + } + + } else if (USB_DEVREQ_GET_STATUS == req->request) { + + if (USB_DEVREQ_RECIPIENT_INTERFACE == recipient) { + // The host should expect two bytes back, the device must + // be configured, the interface number must be valid. + // The host should expect no data back, the device must + // be configured, and there are no defined features to clear. + if ((2 == length) && + (USB_DEVREQ_DIRECTION_IN == direction) && + (USBS_STATE_CONFIGURED == (endpoint->state & USBS_STATE_MASK))) { + + int interface_id = req->index_lo; + CYG_ASSERT( 1 == endpoint->enumeration_data->total_number_interfaces, \ + "Higher level code should have handled this request"); + + if (interface_id == endpoint->enumeration_data->interfaces[0].interface_id) { + + // The request is legit, but there are no defined features for an interface... + endpoint->control_buffer[0] = 0; + endpoint->control_buffer[1] = 0; + endpoint->buffer = endpoint->control_buffer; + endpoint->buffer_size = 2; + endpoint->fill_buffer_fn = (void (*)(usbs_control_endpoint*)) 0; + endpoint->complete_fn = (usbs_control_return (*)(usbs_control_endpoint*, cyg_bool)) 0; + result = USBS_CONTROL_RETURN_HANDLED; + + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } + + } else if (USB_DEVREQ_SET_CONFIGURATION == req->request) { + + // Changing to configuration 0 means a state change from + // configured to addressed. Changing to anything else means a + // state change to configured. Both involve invoking the + // state change callback. If there are multiple configurations + // to choose from then this request has to be handled at + // a higher level. + int old_state = endpoint->state; + if (0 == req->value_lo) { + endpoint->state = USBS_STATE_ADDRESSED; + if ((void (*)(usbs_control_endpoint*, void*, usbs_state_change, int))0 != endpoint->state_change_fn) { + (*endpoint->state_change_fn)(endpoint, endpoint->state_change_data, + USBS_STATE_CHANGE_DECONFIGURED, old_state); + } + result = USBS_CONTROL_RETURN_HANDLED; + + } else { + CYG_ASSERT(1 == endpoint->enumeration_data->device.number_configurations, \ + "Higher level code should have handled this request"); + if (req->value_lo == endpoint->enumeration_data->configurations[0].configuration_id) { + endpoint->state = USBS_STATE_CONFIGURED; + if ((void (*)(usbs_control_endpoint*, void*, usbs_state_change, int))0 != endpoint->state_change_fn) { + (*endpoint->state_change_fn)(endpoint, endpoint->state_change_data, + USBS_STATE_CHANGE_CONFIGURED, old_state); + } + result = USBS_CONTROL_RETURN_HANDLED; + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } + + } else if (USB_DEVREQ_SET_FEATURE == req->request) { + + if (USB_DEVREQ_RECIPIENT_INTERFACE == recipient) { + // The host should expect no data back, the device must + // be configured, and there are no defined features to clear. + if ((0 == length) && + (USBS_STATE_CONFIGURED == (endpoint->state & USBS_STATE_MASK)) && + (0 == req->value_lo)) { + + int interface_id = req->index_lo; + CYG_ASSERT( 1 == endpoint->enumeration_data->total_number_interfaces, \ + "Higher level code should have handled this request"); + + if (interface_id == endpoint->enumeration_data->interfaces[0].interface_id) { + result = USBS_CONTROL_RETURN_HANDLED; + } else { + result = USBS_CONTROL_RETURN_STALL; + } + + } else { + result = USBS_CONTROL_RETURN_STALL; + } + } + + } + + return result; +}
--- a/packages/isoinfra/current/ChangeLog +++ b/packages/isoinfra/current/ChangeLog @@ -1,3 +1,19 @@ +2001-02-11 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/isoinfra.cdl: Add CYGPKG_ISO_UNISTD to deal with unistd.h + Include POSIX timer operations underneath it. + + * include/unistd.h: Add support for conditional inclusion of + POSIX timer operations. + +2001-02-01 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/isoinfra.cdl: Add CYGINT_ISO_STDIO_POSIX_FDFUNCS and + CYGBLD_ISO_STDIO_POSIX_FDFUNCS_HEADER primarily for fileno() + and fdopen() + * include/stdio.h: Use above to provide default protos for fileno + and fdopen. + 2000-12-15 Nick Garnett <nickg@cygnus.co.uk> * include/dlfcn.h:
--- a/packages/isoinfra/current/cdl/isoinfra.cdl +++ b/packages/isoinfra/current/cdl/isoinfra.cdl @@ -266,6 +266,18 @@ cdl_package CYGPKG_ISOINFRA { default_value 0 } + cdl_interface CYGINT_ISO_STDIO_POSIX_FDFUNCS { + display "POSIX fd-related function implementations" + flavor booldata + requires { 1 >= CYGINT_ISO_STDIO_POSIX_FDFUNCS } + } + + cdl_option CYGBLD_ISO_STDIO_POSIX_FDFUNCS_HEADER { + display "POSIX fd-related function implementation header" + flavor booldata + default_value 0 + } + } # ==================================================================== @@ -1018,6 +1030,26 @@ cdl_package CYGPKG_ISOINFRA { } # ==================================================================== + + cdl_component CYGPKG_ISO_UNISTD { + display "UNIX standard functions" + flavor none + no_define + + cdl_interface CYGINT_ISO_POSIX_TIMER_OPS { + display "POSIX timer operations implementations" + flavor booldata + requires { 1 >= CYGINT_ISO_POSIX_TIMER_OPS } + } + + cdl_option CYGBLD_ISO_POSIX_TIMER_OPS_HEADER { + display "POSIX timer operations implementation header" + flavor booldata + default_value 0 + } + } + +# ==================================================================== cdl_component CYGPKG_ISOINFRA_OPTIONS { display "Build options"
--- a/packages/isoinfra/current/include/stdio.h +++ b/packages/isoinfra/current/include/stdio.h @@ -114,6 +114,27 @@ # endif #endif +#ifdef CYGINT_ISO_STDIO_POSIX_FDFUNCS +# ifdef CYGBLD_ISO_STDIO_POSIX_FDFUNCS_HEADER +# include CYGBLD_ISO_STDIO_POSIX_FDFUNCS_HEADER +# else + +# ifdef __cplusplus +extern "C" { +# endif + +extern int +fileno( FILE *__stream ); + +extern FILE * +fdopen( int __fildes, const char *__type ); + +# ifdef __cplusplus +} // extern "C" +# endif +# endif +#endif + #endif /* CYGONCE_ISO_STDIO_H multiple inclusion protection */ /* EOF stdio.h */
--- a/packages/isoinfra/current/include/unistd.h +++ b/packages/isoinfra/current/include/unistd.h @@ -51,6 +51,7 @@ #include <pkgconf/isoinfra.h> /* Configuration header */ + /* INCLUDES */ #include <sys/types.h> @@ -62,6 +63,39 @@ #define __need_size_t #include <stddef.h> + +#ifdef CYGINT_ISO_POSIX_TIMER_OPS +# ifdef CYGBLD_ISO_POSIX_TIMER_OPS_HEADER +# include CYGBLD_ISO_POSIX_TIMER_OPS_HEADER +# else + +# ifdef __cplusplus +extern "C" { +# endif + +extern unsigned int +alarm( unsigned int __seconds ); + +extern int +pause( void ); + +unsigned int +sleep( unsigned int __seconds ); + +# ifdef __cplusplus +} /* extern "C" */ +# endif + +# endif +#endif + + +/* ------------------------------------------------------------------- */ + +/* FIXME: The below was copied in verbatim by Nick, but needs to be grouped + by functionality and linked with interfaces as with everything else +*/ + /* CONSTANTS */ /* Configuration constants */
--- a/packages/kernel/current/ChangeLog +++ b/packages/kernel/current/ChangeLog @@ -1,3 +1,39 @@ +2001-02-11 Jonathan Larmour <jlarmour@redhat.com> + + * tests/stress_threads.c: CYGINT_ISO_STDIO_FORMATTED_IO needs a + #ifdef not an #if. + * tests/dhrystone.c: Ditto. + +2001-02-04 Jonathan Larmour <jlarmour@redhat.com> + + * tests/kill.cxx: Increase delay for all targets, just in case some + are slow. + +2001-01-30 Hugo Tyson <hmt@redhat.com> + + * src/common/clock.cxx (rem_alarm): Must clear the enabled flag; + this disappeared in the changes to using clists of 2001-01-09. + Symptom was that an alarm, once disabled, could never be + re-attached to its counter because it claimed it already was. + Plus asserts with multiple disables - "bad counter object". + +2001-01-30 Hugo Tyson <hmt@redhat.com> + + * src/common/thread.cxx (reinitialize): Following change of + 2000-12-05, if CYGFUN_KERNEL_THREADS_STACK_CHECKING, this was + using the stack_base/stack_size variables directly to reinitialize + the stack area. This was wrong, and leaked store off the top and + bottom of the stacks because the "buffer zone" was carved off + repeatedly. Fix is to use the published APIs which compensate. + +2001-01-26 Nick Garnett <nickg@cygnus.co.uk> + + * include/mlqueue.hxx: + * src/sched/mlqueue.cxx: + Restored Cyg_ThreadQueue_Implementation::remove() since it must + clear the thread's queue pointer, which the base clist class + remove() does not. + 2001-01-24 Jesper Skov <jskov@redhat.com> * src/sched/mlqueue.cxx (highpri): Fix trace call.
--- a/packages/kernel/current/include/mlqueue.hxx +++ b/packages/kernel/current/include/mlqueue.hxx @@ -121,6 +121,9 @@ protected: // remove first thread on queue Cyg_Thread *dequeue(); + // Remove thread from queue + void remove(Cyg_Thread *thread); + }; // thread queue used exclusively by the scheduler, with simpler enqueueing
--- a/packages/kernel/current/src/common/clock.cxx +++ b/packages/kernel/current/src/common/clock.cxx @@ -407,6 +407,8 @@ void Cyg_Counter::rem_alarm( Cyg_Alarm * alarm_list_ptr->remove( alarm ); + alarm->enabled = false; + Cyg_Scheduler::unlock(); }
--- a/packages/kernel/current/src/common/thread.cxx +++ b/packages/kernel/current/src/common/thread.cxx @@ -256,7 +256,7 @@ Cyg_Thread::reinitialize() new(this) Cyg_Thread( pri, entry_point, entry_data, name_arg, - stack_base, stack_size ); + get_stack_base(), get_stack_size() ); // the constructor re-registers the thread with the scheduler. CYG_ASSERTCLASS( this, "Thread corrupted by reinitialize");
--- a/packages/kernel/current/src/sched/mlqueue.cxx +++ b/packages/kernel/current/src/sched/mlqueue.cxx @@ -548,6 +548,21 @@ Cyg_ThreadQueue_Implementation::dequeue( // ------------------------------------------------------------------------- +void +Cyg_ThreadQueue_Implementation::remove( Cyg_Thread *thread ) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARG1("thread=%08x", thread); + + thread->queue = NULL; + + Cyg_CList_T<Cyg_Thread>::remove( thread ); + + CYG_REPORT_RETURN(); +} + +// ------------------------------------------------------------------------- + Cyg_Thread * Cyg_ThreadQueue_Implementation::highpri(void) {
--- a/packages/kernel/current/tests/dhrystone.c +++ b/packages/kernel/current/tests/dhrystone.c @@ -40,7 +40,7 @@ # include <pkgconf/isoinfra.h> # if !defined(CYGFUN_KERNEL_API_C) \ - || CYGINT_ISO_STDIO_FORMATTED_IO == 0 \ + || defined(CYGINT_ISO_STDIO_FORMATTED_IO) \ || CYGINT_ISO_MALLOC == 0 \ || CYGINT_ISO_STRING_STRFUNCS == 0
--- a/packages/kernel/current/tests/kcache1.c +++ b/packages/kernel/current/tests/kcache1.c @@ -332,6 +332,7 @@ static void entry0( cyg_addrword_t data cyg_test_is_simulator = 1; #endif + #ifdef HAL_ICACHE_INVALIDATE_ALL HAL_DISABLE_INTERRUPTS(oldints); HAL_DCACHE_PURGE_ALL();
--- a/packages/kernel/current/tests/kill.cxx +++ b/packages/kernel/current/tests/kill.cxx @@ -56,18 +56,11 @@ #include "testaux.hxx" -#ifdef CYGPKG_HAL_I386_LINUX -// On the synthetic target the delay needs to be a bit bigger to avoid +// In general, this delay has to be long enough to account for slow targets +// and potential problems on e.g. the linux synthetic target to avoid // potential problems due to timing inaccuracy and scheduling of Linux -// tasks. +// tasks. It is decreased further below for simulators. int delay_ticks = 5; -#else -// if we delayed for just one tick, there's a good chance the clock may -// roll over immediately, giving a negligible practical delay. So always use -// a value greater than 1 -int delay_ticks = 2; -#endif - static Cyg_Binary_Semaphore s0, s1; @@ -158,6 +151,9 @@ void release_main(void) { CYG_TEST_INIT(); + if (cyg_test_is_simulator) + delay_ticks = 2; + new_thread( entry0, 0); new_thread( entry1, 1); new_thread( entry2, 2);
--- a/packages/kernel/current/tests/stress_threads.c +++ b/packages/kernel/current/tests/stress_threads.c @@ -62,7 +62,7 @@ #include <cyg/kernel/kapi.h> -#if CYGINT_ISO_STDIO_FORMATTED_IO +#ifdef CYGINT_ISO_STDIO_FORMATTED_IO #include <stdio.h> #include <stdlib.h>
--- a/packages/language/c/libc/stdio/current/ChangeLog +++ b/packages/language/c/libc/stdio/current/ChangeLog @@ -1,3 +1,8 @@ +2001-02-01 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/stdio.cdl (CYGPKG_LIBC_STDIO_OPEN): Implements + CYGINT_ISO_STDIO_POSIX_FDFUNCS ( fileno() and fdopen() ). + 2000-11-01 Jonathan Larmour <jlarmour@redhat.com> * include/stdio.h: Make FILE array type larger to be more resistant
--- a/packages/language/c/libc/stdio/current/cdl/stdio.cdl +++ b/packages/language/c/libc/stdio/current/cdl/stdio.cdl @@ -251,6 +251,7 @@ cdl_package CYGPKG_LIBC_STDIO { cdl_option CYGPKG_LIBC_STDIO_OPEN { display "Dynamic opening/closing of files" requires CYGINT_ISO_MALLOC + implements CYGINT_ISO_STDIO_POSIX_FDFUNCS default_value { 0 != CYGINT_ISO_MALLOC } description " fopen() and fclose() use dynamic memory
--- a/packages/pkgconf/fixhtml.tcl +++ b/packages/pkgconf/fixhtml.tcl @@ -55,6 +55,19 @@ set year [clock format [clock seconds] -format "%Y"] +set copyright_banner \ +"<!-- Copyright (C) $year Red Hat, Inc. --> +<!-- This material may be distributed only subject to the terms --> +<!-- and conditions set forth in the Open Publication License, v1.0 --> +<!-- or later (the latest version is presently available at --> +<!-- http://www.opencontent.org/openpub/) --> +<!-- Distribution of substantively modified versions of this --> +<!-- document is prohibited without the explicit permission of the --> +<!-- copyright holder. --> +<!-- Distribution of the work or derivative of the work in any --> +<!-- standard (paper) book form is prohibited unless prior --> +<!-- permission obtained from the copyright holder -->" + # The generated files all have a .htm suffix rather than a .html # suffix. For now this is preserved, to avoid having to change all the # anchors. It might be better to rename all the files to .html in @@ -77,7 +90,7 @@ foreach file $files { regsub -all "\n>" $data ">\n" data # Add a copyright banner - set data [concat "<!-- Copyright (C) $year Red Hat, Inc. -->\n" $data] + set data "[set copyright_banner]\n[set data]" # Take care of some character entities that Netscape does not understand regsub -all "&mgr;" $data "\\BC;" data
--- a/packages/redboot/current/ChangeLog +++ b/packages/redboot/current/ChangeLog @@ -1,3 +1,83 @@ +2001-02-12 Jesper Skov <jskov@redhat.com> + + * src/main.c: Use CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL instead + of CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL. + +2001-02-11 Gary Thomas <gthomas@redhat.com> + + * src/net/ping.c (do_ping): Accomodate new MS_TICKS scheme. + +2001-02-09 Grant Edwards <grante@visi.com> + + * include/net/net.h (MS_TICKS_DELAY): New macro, different from + MS_TICKS() so that MS_TICKS() gets the current tick count, and + MS_TICKS_DELAY is used in a delay loop to actually do a delay. + + * src/ticks.c (get_ms_ticks): New function imlementing rework of + MS_TICKS + + * src/net/net_io.c (net_io_getc): Use MS_TICKS_DELAY() instead of + CYGACC_CALL_IF_DELAY_US() directly + (net_io_getc_timeout): Likewise + + * src/net/udp.c (__udp_recvfrom): MS_TICKS -> MS_TICKS_DELAY + * src/net/bootp.c (__bootp_find_local_ip): Likewise + +2001-02-09 Jonathan Larmour <jlarmour@redhat.com> +2001-02-09 Grant Edwards <grante@visi.com> + + * src/net/net_io.c (net_io_getc_nonblock): Silence compiler warning + +2001-01-31 Gary Thomas <gthomas@redhat.com> + + * include/redboot.h: + * cdl/redboot.cdl: + * src/flash.c: Use new CRC functions. + + * src/crc.c: New file - supports 16 and 32 bit CRC functions. + +2001-01-31 Grant Edwards <grante@visi.com> + + * src/net/net_io.c (net_io_test): Use new idle function to + poll for incoming network connections. Removes #if requirements + from the main CLI loop. + + * src/main.c (cyg_start): + * include/redboot.h (RedBoot_idle): Add new tables to support + user defined functions to be called when idle (during command input). + +2001-01-31 Gary Thomas <gthomas@redhat.com> + + * include/redboot.h: + * src/main.c (cyg_start): + * src/net/net_io.c (net_io_getc_nonblock): Forgo TELNET escape + processing if GDB is active (requires 8-bit clean connection). + +2001-01-31 Nick Garnett <nickg@cygnus.co.uk> + + * src/syscall.c (__do_syscall): + Added SYS_meminfo syscall. + + * src/net/net_io.c (net_io_getc_nonblock): + Telnet escape processing temporarily disabled because it does not + work. + +2001-01-31 Grant Edwards <grante@visi.com> + + * include/net/net.h: + * src/net/enet.c (__eth_install_listener, __eth_remove_listener): + New functions - allow user registerable callout to handle + non-standard ethernet packets. + +2001-01-30 Gary Thomas <gthomas@redhat.com> + + * src/main.c (do_reset): HAL macro name changed. + + * src/net/ping.c (do_ping): Remove warning. + + * src/main.c (do_help): Only display help for selected topic + if provided. + 2001-01-24 Jonathan Larmour <jlarmour@redhat.com> * src/main.c (cyg_start): Rework last change to use more generic @@ -11,7 +91,8 @@ 2001-01-24 Hugo Tyson <hmt@redhat.com> 2001-01-22 Gary Thomas <gthomas@redhat.com> - * src/net/inet_addr.c (inet_aton): Fix byte order on big endian systems. + * src/net/inet_addr.c (inet_aton): Fix byte order on big endian + systems. * src/net/icmp.c (__icmp_install_listener): (__icmp_remove_listener): New functions. @@ -352,7 +433,7 @@ 2000-09-11 Jonathan Larmour <jlarmour@ 2000-09-07 Andrew Lunn <andrew.lunn@ascom.ch> * src/load.c, include/redboot.h: renamed the getc functions to - redboot_getc and made them globel so custom boot loaders can use + redboot_getc and made them global so custom boot loaders can use them. 2000-09-06 Gary Thomas <gthomas@redhat.com>
--- a/packages/redboot/current/cdl/redboot.cdl +++ b/packages/redboot/current/cdl/redboot.cdl @@ -74,7 +74,7 @@ cdl_package CYGPKG_REDBOOT { stripping before being converted to a binary image. This is handled by a rule in the target CDL." - compile main.c + compile main.c crc.c compile printf.c misc_funs.c io.c parse.c ticks.c xyzModem.c syscall.c compile -library=libextras.a load.c @@ -149,6 +149,18 @@ cdl_package CYGPKG_REDBOOT { rather than from RedBoot's stack." } + cdl_option CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT { + display "Command processing idle timeout (ms)" + flavor data + default_value 10 + description " + This option controls the timeout period before the + command processing is considered 'idle'. Making this + number smaller will cause idle processing to take place + more often, etc. The default value of 10ms is a reasonable + tradeoff between responsiveness and overhead." + } + cdl_component CYGPKG_REDBOOT_FLASH { display "Allow RedBoot to support FLASH programming" flavor bool @@ -180,7 +192,7 @@ cdl_package CYGPKG_REDBOOT { relative to the start of FLASH." } - cdl_option CYGSEM_REDBOOT_FLASH_CONFIG { + cdl_component CYGSEM_REDBOOT_FLASH_CONFIG { display "Keep RedBoot configuration data in FLASH" flavor bool default_value 1 @@ -188,6 +200,24 @@ cdl_package CYGPKG_REDBOOT { When this option is enabled, RedBoot will keep configuration data in a separate block of FLASH memory. This data will include such items as the node IP address or startup scripts." + + cdl_option CYGNUM_REDBOOT_FLASH_CONFIG_SIZE { + display "Length of configuration data in FLASH" + flavor data + default_value 1024 + description " + This option is used to control the amount of memory and FLASH + to be used for configuration options (persistent storage)." + } + + cdl_option CYGNUM_REDBOOT_FLASH_SCRIPT_SIZE { + display "Length of configuration script(s) in FLASH" + flavor data + default_value 512 + description " + This option is used to control the amount of memory and FLASH + to be used for configuration options (persistent storage)." + } } cdl_option CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL {
--- a/packages/redboot/current/include/flash_config.h +++ b/packages/redboot/current/include/flash_config.h @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -46,8 +46,10 @@ #ifndef _FLASH_CONFIG_H_ #define _FLASH_CONFIG_H_ -#define MAX_SCRIPT_LENGTH 512 +#define MAX_SCRIPT_LENGTH CYGNUM_REDBOOT_FLASH_SCRIPT_SIZE +#define MAX_CONFIG_DATA CYGNUM_REDBOOT_FLASH_CONFIG_SIZE +#define CONFIG_EMPTY 0 #define CONFIG_BOOL 1 #define CONFIG_INT 2 #define CONFIG_STRING 3 @@ -63,14 +65,22 @@ struct config_option { char *enable; bool enable_sense; int type; + unsigned long dflt; } CYG_HAL_TABLE_TYPE; #define ALWAYS_ENABLED (char *)0 -#define RedBoot_config_option(_t_,_n_,_e_,_ie_,_type_) \ -struct config_option _config_option_##_n_ \ -CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_config_options,_n_) = {#_n_,_t_,_e_,_ie_,_type_}; +#define RedBoot_config_option(_t_,_n_,_e_,_ie_,_type_,_dflt_) \ +struct config_option _config_option_##_n_ \ +CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_config_options,_n_) = \ + {#_n_,_t_,_e_,_ie_,_type_,(unsigned long)_dflt_}; -void flash_get_config(char *key, void *val, int type); +// Cause the in-memory configuration data to be written to flash +void flash_write_config(void); +// Fetch a data item from flash storage, returns 'false' if not found +bool flash_get_config(char *key, void *val, int type); +// Add a new data item to configuration data base. Returns 'false' +// if no space is available. +bool flash_add_config(struct config_option *opt); #endif // _FLASH_CONFIG_H_
--- a/packages/redboot/current/include/net/net.h +++ b/packages/redboot/current/include/net/net.h @@ -53,7 +53,9 @@ extern bool net_debug; extern unsigned long do_ms_tick(void); -#define MS_TICKS() do_ms_tick() +extern unsigned long get_ms_ticks(void); +#define MS_TICKS() get_ms_ticks() +#define MS_TICKS_DELAY() do_ms_tick() /* #define NET_SUPPORT_RARP 1 */ #define NET_SUPPORT_ICMP 1 @@ -280,7 +282,7 @@ typedef struct _pktbuf { /* protocol handler */ -typedef void (*pkt_handler_t)(pktbuf_t *pkt); +typedef void (*pkt_handler_t)(pktbuf_t *pkt, eth_header_t *eth_hdr); /* ICMP fielder */ typedef void (*icmp_handler_t)(pktbuf_t *pkt, ip_route_t *src_route); @@ -377,17 +379,13 @@ extern void __pktbuf_dump(void); * Install handlers for ethernet packets. * Returns old handler. */ -extern pkt_handler_t __eth_install_handler(int eth_type, - pkt_handler_t handler); -/* - * Set tcp port number for debugging. If not called, a default - * will be selected. - */ -extern void _bsp_net_set_debug_port(int portnum); +extern pkt_handler_t __eth_install_listener(int eth_type, + pkt_handler_t handler); +extern void __eth_remove_listener(int eth_type); /* - * Non-blocking poll of ethernet link. Processes at most - * one packet. + * Non-blocking poll of ethernet link. Processes all pending + * input packets. */ extern void __enet_poll(void);
--- a/packages/redboot/current/include/redboot.h +++ b/packages/redboot/current/include/redboot.h @@ -71,12 +71,12 @@ EXTERN int argc; EXTERN char *argv[MAX_ARGV]; EXTERN unsigned char *ram_start, *ram_end; EXTERN unsigned long *entry_address; -EXTERN bool config_ok; #ifdef CYGPKG_REDBOOT_ANY_CONSOLE EXTERN bool console_selected; #endif EXTERN bool console_echo; +EXTERN bool gdb_active; #ifdef CYGPKG_REDBOOT_NETWORKING EXTERN bool have_net, use_bootp; @@ -120,6 +120,10 @@ int gets(char *line, int len, int timeo int start_console(void); void end_console(int old_console); +// CRC support +unsigned short crc16(unsigned char *buf, int len); +unsigned long crc32(unsigned char *buf, int len); + // CLI support functions bool parse_num(char *s, unsigned long *val, char **es, char *delim); bool parse_bool(char *s, bool *val); @@ -155,7 +159,19 @@ struct init_tab_entry { struct init_tab_entry _init_tab_##_p_##_f_ CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_inits,_f_) = { _f_ }; #define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_) - +// Main loop [idle] call-back functions +#define RedBoot_IDLE_FIRST 0000 +#define RedBoot_IDLE_BEFORE_NETIO 3000 +#define RedBoot_IDLE_NETIO 5000 +#define RedBoot_IDLE_AFTER_NETIO 7000 +#define RedBoot_IDLE_LAST 9999 +struct idle_tab_entry { + void_fun_ptr fun; +} CYG_HAL_TABLE_TYPE; +#define _RedBoot_idle(_f_,_p_) \ +struct idle_tab_entry _idle_tab_##_p_##_f_ CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_idle,_f_) = { _f_ }; +#define RedBoot_idle(_f_,_p_) _RedBoot_idle(_f_,_p_) + // Option processing support struct option_info {
new file mode 100644 --- /dev/null +++ b/packages/redboot/current/src/crc.c @@ -0,0 +1,175 @@ +//========================================================================== +// +// crc.c +// +// RedBoot CRC-16 calculations +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2001-01-31 +// Purpose: +// Description: +// +// This code is part of RedBoot (tm). +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <redboot.h> + +// Table of CRC constants - implements x^16+x^12+x^5+1 +static unsigned short crc16_tab[] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, +}; + +unsigned short +crc16(unsigned char *buf, int len) +{ + int i; + unsigned short cksum; + + cksum = 0; + for (i = 0; i < len; i++) { + cksum = crc16_tab[((cksum>>8) ^ *buf++) & 0xFF] ^ (cksum << 8); + } + return cksum; +} + + /* ====================================================================== */ + /* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or */ + /* code or tables extracted from it, as desired without restriction. */ + /* */ + /* First, the polynomial itself and its table of feedback terms. The */ + /* polynomial is */ + /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ + /* */ + /* ====================================================================== */ + +static unsigned long crc32_tab[] = { + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, + 0x2d02ef8dL + }; + +/* Return a 32-bit CRC of the contents of the buffer. */ + +unsigned long +crc32(unsigned char *s, int len) +{ + int i; + unsigned long crc32val; + + crc32val = 0; + for (i = 0; i < len; i++) { + crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8); + } + return crc32val; +}
--- a/packages/redboot/current/src/flash.c +++ b/packages/redboot/current/src/flash.c @@ -131,20 +131,6 @@ static void *flash_start, *flash_end; static int block_size, blocks; static void *fis_work_block; -// Simple XOR style checksum -static unsigned long -_cksum(unsigned long *buf, int len) -{ - unsigned long cksum = 0; - - // Round 'len' up to multiple of longwords - len = (len + (sizeof(unsigned long)-1)) / sizeof(unsigned long); - while (len-- > 0) { - cksum ^= *buf++; - } - return cksum; -} - struct fis_image_desc * fis_lookup(char *name) { @@ -532,7 +518,7 @@ fis_create(int argc, char *argv[]) img->entry_point = entry_addr_set ? entry_addr : (unsigned long)entry_address; // Hope it's been set img->size = length; img->data_length = img_size; - img->file_cksum = _cksum((unsigned long *)flash_addr, img_size); + img->file_cksum = crc32((unsigned char *)flash_addr, img_size); #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL // Insure [quietly] that the directory is unlocked before trying to update flash_unlock((void *)fis_addr, block_size, (void **)&err_addr); @@ -762,7 +748,7 @@ fis_load(int argc, char *argv[]) } memcpy((void *)mem_addr, (void *)img->flash_base, img->size); entry_address = (unsigned long *)img->entry_point; - cksum = _cksum((unsigned long *)mem_addr, img->data_length); + cksum = crc32((unsigned char *)mem_addr, img->data_length); if (show_cksum) { printf("Checksum: 0x%08lx\n", cksum); } @@ -820,11 +806,13 @@ do_fis(int argc, char *argv[]) // Configuration data, saved in FLASH, used to set/update RedBoot // normal "configuration" data items. static struct _config { + unsigned long len; unsigned long key1; - unsigned char config_data[1024-(3*4)]; + unsigned char config_data[MAX_CONFIG_DATA-(4*4)]; unsigned long key2; unsigned long cksum; } config; +static bool config_ok; #define CONFIG_KEY1 0x0BADFACE #define CONFIG_KEY2 0xDEADDEAD @@ -844,12 +832,14 @@ static struct _config { RedBoot_config_option("Run script at boot", boot_script, ALWAYS_ENABLED, true, - CONFIG_BOOL + CONFIG_BOOL, + false ); RedBoot_config_option("Boot script", boot_script_data, "boot_script", true, - CONFIG_SCRIPT + CONFIG_SCRIPT, + "" ); // Some preprocessor magic for building the [constant] prompt string #define __cat(s1,c2,s3) s1 ## #c2 ## s3 @@ -859,7 +849,8 @@ RedBoot_config_option(_cat("Boot script "ms resolution)"), boot_script_timeout, "boot_script", true, - CONFIG_INT + CONFIG_INT, + 0 ); #undef __cat #undef _cat @@ -869,36 +860,65 @@ CYG_HAL_TABLE_END( __CONFIG_options_TAB_ extern struct config_option __CONFIG_options_TAB__[], __CONFIG_options_TAB_END__[]; +// +// Layout of config data +// Each data item is variable length, with the name, type and dependencies +// encoded into the object. +// offset contents +// 0 data type +// 1 length of name (N) +// 2 enable sense +// 3 length of enable key (M) +// 4 key name +// N+4 enable key +// M+N+4 data value +// + +#define CONFIG_OBJECT_TYPE(dp) (dp)[0] +#define CONFIG_OBJECT_KEYLEN(dp) (dp)[1] +#define CONFIG_OBJECT_ENABLE_SENSE(dp) (dp)[2] +#define CONFIG_OBJECT_ENABLE_KEYLEN(dp) (dp)[3] +#define CONFIG_OBJECT_KEY(dp) ((dp)+4) +#define CONFIG_OBJECT_ENABLE_KEY(dp) ((dp)+4+CONFIG_OBJECT_KEYLEN(dp)) +#define CONFIG_OBJECT_VALUE(dp) ((dp)+4+CONFIG_OBJECT_KEYLEN(dp)+CONFIG_OBJECT_ENABLE_KEYLEN(dp)) + static int -get_config(struct config_option *opt, int offset, bool list_only) +get_config(unsigned char *dp, char *title, bool list_only) { char line[256], *sp, *lp; int ret; - bool hold_bool_val, enable; - unsigned long hold_int_val; + bool hold_bool_val, new_bool_val, enable; + unsigned long hold_int_val, new_int_val; #ifdef CYGPKG_REDBOOT_NETWORKING - in_addr_t hold_ip_val; + in_addr_t hold_ip_val, new_ip_val; enet_addr_t hold_esa_val; int esa_ptr; char *esp; #endif void *val_ptr; + int type; - if (opt->enable) { - flash_get_config(opt->enable, &enable, CONFIG_BOOL); - if ((opt->enable_sense && !enable) || - (!opt->enable_sense && enable)) { + if (CONFIG_OBJECT_ENABLE_KEYLEN(dp)) { + flash_get_config(CONFIG_OBJECT_ENABLE_KEY(dp), &enable, CONFIG_BOOL); + if (((bool)CONFIG_OBJECT_ENABLE_SENSE(dp) && !enable) || + (!(bool)CONFIG_OBJECT_ENABLE_SENSE(dp) && enable)) { return CONFIG_OK; // Disabled field } } - val_ptr = (void *)((unsigned char *)&config + offset); - printf("%s: ", opt->title); - switch (opt->type) { + val_ptr = (void *)CONFIG_OBJECT_VALUE(dp); + if (title != (char *)NULL) { + printf("%s: ", title); + } else { + printf("%s: ", CONFIG_OBJECT_KEY(dp)); + } + switch (type = CONFIG_OBJECT_TYPE(dp)) { case CONFIG_BOOL: - printf("%s ", *(bool *)val_ptr ? "true" : "false"); + memcpy(&hold_bool_val, val_ptr, sizeof(bool)); + printf("%s ", hold_bool_val ? "true" : "false"); break; case CONFIG_INT: - printf("%d ", *(int *)val_ptr); + memcpy(&hold_int_val, val_ptr, sizeof(unsigned long)); + printf("%ld ", hold_int_val); break; #ifdef CYGPKG_REDBOOT_NETWORKING case CONFIG_IP: @@ -931,31 +951,33 @@ get_config(struct config_option *opt, in printf("\n"); return CONFIG_OK; } - if (opt->type != CONFIG_SCRIPT) { + if (type != CONFIG_SCRIPT) { ret = gets(line, sizeof(line), 0); if (ret < 0) return CONFIG_ABORT; if (strlen(line) == 0) return CONFIG_OK; // Just a CR - leave value untouched if (line[0] == '.') return CONFIG_DONE; if (line[0] == '^') return CONFIG_BACK; } - switch (opt->type) { + switch (type) { case CONFIG_BOOL: - hold_bool_val = *(bool *)val_ptr; - if (!parse_bool(line, (bool *)val_ptr)) { + memcpy(&hold_bool_val, val_ptr, sizeof(bool)); + if (!parse_bool(line, &new_bool_val)) { return CONFIG_BAD; } - if (hold_bool_val != *(bool *)val_ptr) { + if (hold_bool_val != new_bool_val) { + memcpy(val_ptr, &new_bool_val, sizeof(bool)); return CONFIG_CHANGED; } else { return CONFIG_OK; } break; case CONFIG_INT: - hold_int_val = *(unsigned long *)val_ptr; - if (!parse_num(line, (unsigned long *)val_ptr, 0, 0)) { + memcpy(&hold_int_val, val_ptr, sizeof(unsigned long)); + if (!parse_num(line, &new_int_val, 0, 0)) { return CONFIG_BAD; } - if (hold_int_val != *(unsigned long *)val_ptr) { + if (hold_int_val != new_int_val) { + memcpy(val_ptr, &new_int_val, sizeof(unsigned long)); return CONFIG_CHANGED; } else { return CONFIG_OK; @@ -963,11 +985,12 @@ get_config(struct config_option *opt, in break; #ifdef CYGPKG_REDBOOT_NETWORKING case CONFIG_IP: - hold_ip_val.s_addr = ((in_addr_t *)val_ptr)->s_addr; - if (!inet_aton(line, (in_addr_t *)val_ptr)) { + memcpy(&hold_ip_val.s_addr, &((in_addr_t *)val_ptr)->s_addr, sizeof(in_addr_t)); + if (!inet_aton(line, &new_ip_val)) { return CONFIG_BAD; } - if (hold_ip_val.s_addr != ((in_addr_t *)val_ptr)->s_addr) { + if (hold_ip_val.s_addr != new_ip_val.s_addr) { + memcpy(val_ptr, &new_ip_val, sizeof(in_addr_t)); return CONFIG_CHANGED; } else { return CONFIG_OK; @@ -1014,28 +1037,6 @@ get_config(struct config_option *opt, in // Manage configuration information with the FLASH // -// Calculate a simple checksum. This is used to validate configuration -// data. Since it is used for sensitive information, it makes sense to -// be somewhat careful when accepting it. Also, the [strange] addition -// of shifted data helps make this work even if the data layout changes -// over time. - -static unsigned long -_fconfig_cksum(unsigned long *buf, int len) -{ - unsigned long cksum = 0; - int shift = 0; - - // Round 'len' up to multiple of longwords - len = (len + (sizeof(unsigned long)-1)) / sizeof(unsigned long); - while (len-- > 0) { - cksum ^= (*buf | (*buf << shift)); - buf++; - if (++shift == 16) shift = 0; - } - return cksum; -} - static int config_length(int type) { @@ -1062,16 +1063,15 @@ config_length(int type) void do_flash_config(int argc, char *argv[]) { - int stat, ret; - void *cfg_base, *err_addr; bool need_update = false; - struct config_option *optbeg = __CONFIG_options_TAB__; struct config_option *optend = __CONFIG_options_TAB_END__; struct config_option *opt = __CONFIG_options_TAB__; struct _config hold_config; - int offset = sizeof(unsigned long); struct option_info opts[1]; bool list_only; + unsigned char *dp; + int len, ret; + char *title; if (!do_flash_init()) return; memcpy(&hold_config, &config, sizeof(config)); @@ -1084,8 +1084,24 @@ do_flash_config(int argc, char *argv[]) return; } - while (opt != optend) { - ret = get_config(opt, offset, list_only); + dp = &config.config_data[0]; + while (dp < &config.config_data[sizeof(config.config_data)]) { + if (CONFIG_OBJECT_TYPE(dp) == CONFIG_EMPTY) { + break; + } + len = 4 + CONFIG_OBJECT_KEYLEN(dp) + CONFIG_OBJECT_ENABLE_KEYLEN(dp) + + config_length(CONFIG_OBJECT_TYPE(dp)); + // Provide a title for well known [i.e. builtin] objects + title = (char *)NULL; + opt = __CONFIG_options_TAB__; + while (opt != optend) { + if (strcmp(opt->key, CONFIG_OBJECT_KEY(dp)) == 0) { + title = opt->title; + break; + } + opt++; + } + ret = get_config(dp, title, list_only); switch (ret) { case CONFIG_DONE: goto done; @@ -1095,11 +1111,10 @@ do_flash_config(int argc, char *argv[]) case CONFIG_CHANGED: need_update = true; case CONFIG_OK: - offset += config_length(opt->type); - opt++; + dp += len; break; case CONFIG_BACK: - if (opt != optbeg) opt--; + dp = &config.config_data[0]; continue; case CONFIG_BAD: // Nothing - make him do it again @@ -1109,8 +1124,22 @@ do_flash_config(int argc, char *argv[]) done: if (!need_update) return; - config.key1 = CONFIG_KEY1; config.key2 = CONFIG_KEY2; - config.cksum = _fconfig_cksum((unsigned long *)&config, sizeof(config)-sizeof(config.cksum)); + flash_write_config(); +} + +// +// Write the in-memory copy of the configuration data to the flash device. +// +void +flash_write_config(void) +{ + int stat; + void *cfg_base, *err_addr; + + config.len = sizeof(config); + config.key1 = CONFIG_KEY1; + config.key2 = CONFIG_KEY2; + config.cksum = crc32((unsigned char *)&config, sizeof(config)-sizeof(config.cksum)); cfg_base = (void *)((unsigned long)flash_end - (2*block_size)); if (verify_action("Update RedBoot non-volatile configuration")) { #ifdef CYGSEM_REDBOOT_FLASH_LOCK_SPECIAL @@ -1133,26 +1162,32 @@ do_flash_config(int argc, char *argv[]) } } -void +// +// Retrieve a data object from the data base (in memory copy) +// +bool flash_get_config(char *key, void *val, int type) { - struct config_option *optend = __CONFIG_options_TAB_END__; - struct config_option *opt = __CONFIG_options_TAB__; - int offset = sizeof(unsigned long); // Offset past starting 'key' + unsigned char *dp; void *val_ptr; + int len; - if (!do_flash_init()) return; + if (!config_ok) return false; - while (opt != optend) { - val_ptr = (void *)((unsigned char *)&config + offset); - if (strcmp(opt->key, key) == 0) { - if (opt->type == type) { - switch (opt->type) { + dp = &config.config_data[0]; + while (dp < &config.config_data[sizeof(config.config_data)]) { + len = 4 + CONFIG_OBJECT_KEYLEN(dp) + CONFIG_OBJECT_ENABLE_KEYLEN(dp) + + config_length(CONFIG_OBJECT_TYPE(dp)); + val_ptr = (void *)CONFIG_OBJECT_VALUE(dp); + if (strcmp(key, CONFIG_OBJECT_KEY(dp)) == 0) { + if (CONFIG_OBJECT_TYPE(dp) == type) { + switch (type) { + // Note: the data may be unaligned in the configuration data case CONFIG_BOOL: - *(bool *)val = *(bool *)val_ptr; + memcpy(val, val_ptr, sizeof(bool)); break; case CONFIG_INT: - *(unsigned long *)val = *(unsigned long *)val_ptr; + memcpy(val, val_ptr, sizeof(unsigned long)); break; #ifdef CYGPKG_REDBOOT_NETWORKING case CONFIG_IP: @@ -1172,13 +1207,102 @@ flash_get_config(char *key, void *val, i } else { printf("Request for config value '%s' - wrong type\n", key); } + return true; + } + dp += len; + } + printf("Can't find config data for '%s'\n", key); + return false; +} + +// +// Add a new option to the database +// +bool +flash_add_config(struct config_option *opt) +{ + unsigned char *dp, *kp; + int len, elen, size; + + dp = &config.config_data[0]; + size = 0; + while (size < sizeof(config.config_data)) { + if (CONFIG_OBJECT_TYPE(dp) == CONFIG_EMPTY) { + kp = opt->key; + len = strlen(kp) + 1; + size += len + 2 + 2 + config_length(opt->type); + if (opt->enable) { + elen = strlen(opt->enable) + 1; + size += elen; + } else { + elen = 0; + } + if (size > sizeof(config.config_data)) { + break; + } + CONFIG_OBJECT_TYPE(dp) = opt->type; + CONFIG_OBJECT_KEYLEN(dp) = len; + CONFIG_OBJECT_ENABLE_SENSE(dp) = opt->enable_sense; + CONFIG_OBJECT_ENABLE_KEYLEN(dp) = elen; + dp = CONFIG_OBJECT_KEY(dp); + while (*kp) *dp++ += *kp++; + *dp++ = '\0'; + if (elen) { + kp = opt->enable; + while (*kp) *dp++ += *kp++; + *dp++ = '\0'; + } + switch (opt->type) { + // Note: the data may be unaligned in the configuration data + case CONFIG_BOOL: + memcpy(dp, (void *)&opt->dflt, sizeof(bool)); + break; + case CONFIG_INT: + memcpy(dp, (void *)&opt->dflt, sizeof(unsigned long)); + break; +#ifdef CYGPKG_REDBOOT_NETWORKING + case CONFIG_IP: + memcpy(dp, (void *)&opt->dflt, sizeof(in_addr_t)); + break; + case CONFIG_ESA: + memcpy(dp, (void *)&opt->dflt, sizeof(enet_addr_t)); + break; +#endif + case CONFIG_STRING: + case CONFIG_SCRIPT: + break; + } + dp += config_length(opt->type); + return true; + } else { + len = 4 + CONFIG_OBJECT_KEYLEN(dp) + CONFIG_OBJECT_ENABLE_KEYLEN(dp) + + config_length(CONFIG_OBJECT_TYPE(dp)); + dp += len; + size += len; + } + } + printf("No space to add '%s'\n", opt->key); + return false; +} + +// +// Reset/initialize configuration data - used only when starting from scratch +// +static void +config_init(void) +{ + // Well known option strings + struct config_option *optend = __CONFIG_options_TAB_END__; + struct config_option *opt = __CONFIG_options_TAB__; + + memset(&config, 0, sizeof(config)); + while (opt != optend) { + if (!flash_add_config(opt)) { return; } - offset += config_length(opt->type); opt++; } - - printf("Can't find config value '%s'\n", key); + config_ok = true; } // @@ -1197,10 +1321,10 @@ load_flash_config(void) if (!do_flash_init()) return; cfg_base = (void *)((unsigned long)flash_end - (2*block_size)); memcpy(&config, cfg_base, sizeof(config)); - if ((_fconfig_cksum((unsigned long *)&config, sizeof(config)-sizeof(config.cksum)) != config.cksum) || + if ((crc32((unsigned char *)&config, sizeof(config)-sizeof(config.cksum)) != config.cksum) || (config.key1 != CONFIG_KEY1)|| (config.key2 != CONFIG_KEY2)) { printf("FLASH configuration checksum error or invalid key\n"); - memset(&config, 0, sizeof(config)); + config_init(); return; } flash_get_config("boot_script", &use_boot_script, CONFIG_BOOL);
--- a/packages/redboot/current/src/main.c +++ b/packages/redboot/current/src/main.c @@ -71,7 +71,7 @@ RedBoot_cmd("version", ); RedBoot_cmd("help", "Help about help?", - "<topic>", + "[<topic>]", do_help ); RedBoot_cmd("go", @@ -89,7 +89,7 @@ RedBoot_cmd("cache", "[ON | OFF]", do_caches ); -#ifdef HAL_STUB_PLATFORM_RESET +#ifdef HAL_PLATFORM_RESET RedBoot_cmd("reset", "Reset the system", "", @@ -101,10 +101,15 @@ RedBoot_cmd("reset", CYG_HAL_TABLE_BEGIN( __RedBoot_INIT_TAB__, RedBoot_inits ); CYG_HAL_TABLE_END( __RedBoot_INIT_TAB_END__, RedBoot_inits ); extern struct init_tab_entry __RedBoot_INIT_TAB__[], __RedBoot_INIT_TAB_END__; + CYG_HAL_TABLE_BEGIN( __RedBoot_CMD_TAB__, RedBoot_commands ); CYG_HAL_TABLE_END( __RedBoot_CMD_TAB_END__, RedBoot_commands ); extern struct cmd __RedBoot_CMD_TAB__[], __RedBoot_CMD_TAB_END__; +CYG_HAL_TABLE_BEGIN( __RedBoot_IDLE_TAB__, RedBoot_idle ); +CYG_HAL_TABLE_END( __RedBoot_IDLE_TAB_END__, RedBoot_idle ); +extern struct idle_tab_entry __RedBoot_IDLE_TAB__[], __RedBoot_IDLE_TAB_END__; + #ifdef HAL_ARCH_PROGRAM_NEW_STACK extern void HAL_ARCH_PROGRAM_NEW_STACK(void *fun); #endif @@ -133,8 +138,9 @@ cyg_start(void) struct cmd *cmd; int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); struct init_tab_entry *init_entry; + struct idle_tab_entry *idle_entry; - CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL); + CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL); #ifdef CYGPKG_REDBOOT_ANY_CONSOLE console_selected = false; #endif @@ -154,8 +160,6 @@ cyg_start(void) do_version(0,0); - config_ok = false; - for (init_entry = __RedBoot_INIT_TAB__; init_entry != &__RedBoot_INIT_TAB_END__; init_entry++) { (*init_entry->fun)(); } @@ -168,21 +172,19 @@ cyg_start(void) printf("== Executing boot script in %d.%03d seconds - enter ^C to abort\n", script_timeout_ms/1000, script_timeout_ms%1000); script = (unsigned char *)0; - while (script_timeout_ms >= 10) { - res = gets(line, sizeof(line), 10); + while (script_timeout_ms >= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT) { + res = gets(line, sizeof(line), CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT); if (res == _GETS_OK) { printf("== Executing boot script in %d.%03d seconds - enter ^C to abort\n", script_timeout_ms/1000, script_timeout_ms%1000); continue; // Ignore anything but ^C } if (res != _GETS_TIMEOUT) break; -#ifdef CYGPKG_REDBOOT_NETWORKING - if (have_net) { - // Check for incoming TCP debug connection - net_io_test(); + for (idle_entry = __RedBoot_IDLE_TAB__; + idle_entry != &__RedBoot_IDLE_TAB_END__; idle_entry++) { + (*idle_entry->fun)(); } -#endif - script_timeout_ms -= 10; + script_timeout_ms -= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT; } if (res == _GETS_CTRLC) { script = (unsigned char *)0; // Disable script @@ -197,18 +199,17 @@ cyg_start(void) printf("RedBoot> "); prompt = false; } - res = gets(line, sizeof(line), 250); + res = gets(line, sizeof(line), CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT); if (res == _GETS_TIMEOUT) { // No input arrived -#ifdef CYGPKG_REDBOOT_NETWORKING - if (have_net) { - // Check for incoming TCP debug connection - net_io_test(); + for (idle_entry = __RedBoot_IDLE_TAB__; + idle_entry != &__RedBoot_IDLE_TAB_END__; idle_entry++) { + (*idle_entry->fun)(); } -#endif } else { if (res == _GETS_GDB) { // Special case of '$' - need to start GDB protocol + gdb_active = true; CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); #ifdef HAL_ARCH_PROGRAM_NEW_STACK HAL_ARCH_PROGRAM_NEW_STACK(breakpoint); @@ -233,6 +234,7 @@ void do_caches(int argc, char *argv[]) { unsigned long oldints; + if (argc == 2) { if (strcmpci(argv[1], "on") == 0) { HAL_DISABLE_INTERRUPTS(oldints); @@ -261,10 +263,26 @@ void do_help(int argc, char *argv[]) { struct cmd *cmd; + char *which = (char *)0; + bool show; + int len = 0; + if (!scan_opts(argc, argv, 1, 0, 0, (void **)&which, OPTION_ARG_TYPE_STR, "<topic>")) { + printf("Invalid argument\n"); + return; + } + if (which) { + len = strlen(which); + } cmd = __RedBoot_CMD_TAB__; while (cmd != &__RedBoot_CMD_TAB_END__) { - printf("%s\n %s %s\n", cmd->help, cmd->str, cmd->usage); + show = true; + if (which && (strncmpci(which, cmd->str, len) != 0)) { + show = false; + } + if (show) { + printf("%s\n %s %s\n", cmd->help, cmd->str, cmd->usage); + } cmd++; } return; @@ -337,7 +355,7 @@ do_go(int argc, char *argv[]) #endif } -#ifdef HAL_STUB_PLATFORM_RESET +#ifdef HAL_PLATFORM_RESET void do_reset(int argc, char *argv[]) { @@ -345,7 +363,7 @@ do_reset(int argc, char *argv[]) CYGACC_CALL_IF_DELAY_US(2*100000); printf("\n"); CYGACC_CALL_IF_DELAY_US(50000); - HAL_STUB_PLATFORM_RESET(); + HAL_PLATFORM_RESET(); printf("!! oops, RESET not working on this platform\n"); } #endif
--- a/packages/redboot/current/src/net/arp.c +++ b/packages/redboot/current/src/net/arp.c @@ -151,7 +151,7 @@ int __enet_send(pkt, &bcast_addr, ETH_TYPE_ARP); retry_start = MS_TICKS(); - while ((MS_TICKS() - retry_start) < 250) { + while ((MS_TICKS_DELAY() - retry_start) < 250) { __enet_poll(); if (!arp_req.waiting) { __pktbuf_free(pkt);
--- a/packages/redboot/current/src/net/bootp.c +++ b/packages/redboot/current/src/net/bootp.c @@ -131,7 +131,7 @@ int __udp_remove_listener(IPPORT_BOOTPC); return 0; } - } while ((MS_TICKS() - start) < RETRY_TIME); + } while ((MS_TICKS_DELAY() - start) < RETRY_TIME); } /* timed out */
--- a/packages/redboot/current/src/net/enet.c +++ b/packages/redboot/current/src/net/enet.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -59,6 +59,55 @@ static int num_received = 0; static int num_transmitted = 0; #endif +// +// Support for user handlers of additional ethernet packets (nonIP) +// + +#define NUM_EXTRA_HANDLERS 4 +static struct { + int type; + pkt_handler_t handler; +} eth_handlers[NUM_EXTRA_HANDLERS]; + +pkt_handler_t +__eth_install_listener(int eth_type, pkt_handler_t handler) +{ + int i, empty; + pkt_handler_t old; + + empty = -1; + for (i = 0; i < NUM_EXTRA_HANDLERS; i++) { + if (eth_handlers[i].type == eth_type) { + // Replace existing handler + old = eth_handlers[i].handler; + eth_handlers[i].handler = handler; + return old; + } + if (eth_handlers[i].type == 0) { + empty = i; + } + } + if (empty >= 0) { + // Found a free slot + eth_handlers[empty].type = eth_type; + eth_handlers[empty].handler = handler; + } + printf("** Warning: can't install listener for ethernet type 0x%02x\n", eth_type); + return (pkt_handler_t)0; +} + +void +__eth_remove_listener(int eth_type) +{ + int i; + + for (i = 0; i < NUM_EXTRA_HANDLERS; i++) { + if (eth_handlers[i].type == eth_type) { + eth_handlers[i].type = 0; + } + } +} + /* * Non-blocking poll of ethernet link. Process packets until no more * are available. @@ -68,6 +117,7 @@ void { pktbuf_t *pkt; eth_header_t eth_hdr; + int i, type; while (true) { /* @@ -86,7 +136,7 @@ void #if ENET_STATS ++num_received; #endif - switch (ntohs(eth_hdr.type)) { + switch (type = ntohs(eth_hdr.type)) { case ETH_TYPE_IP: #if ENET_STATS @@ -115,6 +165,11 @@ void #endif default: + for (i = 0; i < NUM_EXTRA_HANDLERS; i++) { + if (eth_handlers[i].type == type) { + (eth_handlers[i].handler)(pkt, ð_hdr); + } + } __pktbuf_free(pkt); break; } @@ -146,7 +201,6 @@ void #endif } - #ifdef __LITTLE_ENDIAN__ unsigned long
--- a/packages/redboot/current/src/net/net_io.c +++ b/packages/redboot/current/src/net/net_io.c @@ -23,7 +23,7 @@ // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are -// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // @@ -57,12 +57,14 @@ RedBoot_config_option("GDB connection port", gdb_port, ALWAYS_ENABLED, true, - CONFIG_INT + CONFIG_INT, + CYGNUM_REDBOOT_NETWORKING_TCP_PORT ); RedBoot_config_option("Network debug at boot time", net_debug, ALWAYS_ENABLED, true, - CONFIG_BOOL + CONFIG_BOOL, + false ); // Note: the following options are related. If 'bootp' is false, then // the other values are used in the configuration. Because of the way @@ -74,17 +76,20 @@ RedBoot_config_option("Network debug at RedBoot_config_option("Use BOOTP for network configuration", bootp, ALWAYS_ENABLED, true, - CONFIG_BOOL + CONFIG_BOOL, + true ); RedBoot_config_option("Local IP address", bootp_my_ip, "bootp", false, - CONFIG_IP + CONFIG_IP, + 0 ); RedBoot_config_option("Default server IP address", bootp_server_ip, "bootp", false, - CONFIG_IP + CONFIG_IP, + 0 ); #endif @@ -160,32 +165,39 @@ static cyg_bool static cyg_bool net_io_getc_nonblock(void* __ch_data, cyg_uint8* ch) { - if (_net_io_getc_nonblock(__ch_data, ch)) { - if (*ch == TELNET_IAC) { - cyg_uint8 esc; - // Telnet escape - need to read/handle more - while (!_net_io_getc_nonblock(__ch_data, &esc)) ; - if (esc == TELNET_IP) { - // Special case for ^C == Interrupt Process - *ch = 0x03; - // Just in case the other end needs synchronizing - net_io_putc(__ch_data, TELNET_IAC); - net_io_putc(__ch_data, TELNET_WONT); - net_io_putc(__ch_data, TELNET_TM); - net_io_flush(); - return true; - } - if (esc == TELNET_DO) { - // Telnet DO option - while (!_net_io_getc_nonblock(__ch_data, &esc)) ; - // Respond with WONT option - net_io_putc(__ch_data, TELNET_IAC); - net_io_putc(__ch_data, TELNET_WONT); - net_io_putc(__ch_data, esc); - return false; // Ignore this whole thing! - } - } - } else { + cyg_uint8 esc; + + if (!_net_io_getc_nonblock(__ch_data, ch)) + return false; + + if (gdb_active || *ch != TELNET_IAC) + return true; + + // Telnet escape - need to read/handle more + while (!_net_io_getc_nonblock(__ch_data, &esc)) ; + + switch (esc) { + case TELNET_IAC: + // The other special case - escaped escape + return true; + case TELNET_IP: + // Special case for ^C == Interrupt Process + *ch = 0x03; + // Just in case the other end needs synchronizing + net_io_putc(__ch_data, TELNET_IAC); + net_io_putc(__ch_data, TELNET_WONT); + net_io_putc(__ch_data, TELNET_TM); + net_io_flush(); + return true; + case TELNET_DO: + // Telnet DO option + while (!_net_io_getc_nonblock(__ch_data, &esc)) ; + // Respond with WONT option + net_io_putc(__ch_data, TELNET_IAC); + net_io_putc(__ch_data, TELNET_WONT); + net_io_putc(__ch_data, esc); + return false; // Ignore this whole thing! + default: return false; } } @@ -194,16 +206,16 @@ static cyg_uint8 net_io_getc(void* __ch_data) { cyg_uint8 ch; - int idle_timeout = 100; // 10ms + int idle_timeout = 10; // 10ms CYGARC_HAL_SAVE_GP(); while (true) { if (net_io_getc_nonblock(__ch_data, &ch)) break; if (--idle_timeout == 0) { net_io_flush(); - idle_timeout = 100; + idle_timeout = 10; } else { - CYGACC_CALL_IF_DELAY_US(100); + MS_TICKS_DELAY(); } } CYGARC_HAL_RESTORE_GP(); @@ -314,13 +326,13 @@ net_io_getc_timeout(void* __ch_data, cyg CYGARC_HAL_SAVE_GP(); net_io_flush(); // Make sure any output has been sent - delay_count = _timeout * 10; // delay in .1 ms steps + delay_count = _timeout; for(;;) { res = net_io_getc_nonblock(__ch_data, ch); if (res || 0 == delay_count--) break; - CYGACC_CALL_IF_DELAY_US(100); + MS_TICKS_DELAY(); } CYGARC_HAL_RESTORE_GP(); @@ -457,6 +469,7 @@ net_io_init(void) CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); init = 1; + gdb_active = false; } __tcp_listen(&tcp_sock, gdb_port); state = tcp_sock.state; @@ -465,9 +478,11 @@ net_io_init(void) #endif } +// Check for incoming TCP debug connection void net_io_test(void) { + if (!have_net) return; __tcp_poll(); if (state != tcp_sock.state) { // Something has changed @@ -484,6 +499,11 @@ net_io_test(void) state = tcp_sock.state; } +// This schedules the 'net_io_test()' function to be run by RedBoot's +// main command loop when idle (i.e. when no input arrives after some +// period of time). +RedBoot_idle(net_io_test, RedBoot_IDLE_NETIO); + // // Network initialization // @@ -502,20 +522,18 @@ net_init(void) { cyg_netdevtab_entry_t *t; - if (!config_ok) { - // Set defaults as appropriate - use_bootp = true; - net_debug = false; - gdb_port = CYGNUM_REDBOOT_NETWORKING_TCP_PORT; + // Set defaults as appropriate + use_bootp = true; + net_debug = false; + gdb_port = CYGNUM_REDBOOT_NETWORKING_TCP_PORT; #ifdef CYGSEM_REDBOOT_FLASH_CONFIG - } else { - flash_get_config("net_debug", &net_debug, CONFIG_BOOL); - flash_get_config("gdb_port", &gdb_port, CONFIG_INT); - flash_get_config("bootp", &use_bootp, CONFIG_BOOL); - flash_get_config("bootp_my_ip", &__local_ip_addr, CONFIG_IP); - flash_get_config("bootp_server_ip", &my_bootp_info.bp_siaddr, CONFIG_IP); + // Fetch values from saved config data, if available + flash_get_config("net_debug", &net_debug, CONFIG_BOOL); + flash_get_config("gdb_port", &gdb_port, CONFIG_INT); + flash_get_config("bootp", &use_bootp, CONFIG_BOOL); + flash_get_config("bootp_my_ip", &__local_ip_addr, CONFIG_IP); + flash_get_config("bootp_server_ip", &my_bootp_info.bp_siaddr, CONFIG_IP); #endif - } have_net = false; // Make sure the recv buffers are set up eth_drv_buffers_init();
--- a/packages/redboot/current/src/net/ping.c +++ b/packages/redboot/current/src/net/ping.c @@ -182,13 +182,13 @@ do_ping(int argc, char *argv[]) start_time = MS_TICKS(); timer = start_time + timeout; icmp_received = false; - while (!icmp_received && (MS_TICKS() < timer)) { + while (!icmp_received && (MS_TICKS_DELAY() < timer)) { __enet_poll(); } end_time = MS_TICKS(); timer = MS_TICKS() + rate; - while (MS_TICKS() < timer) { + while (MS_TICKS_DELAY() < timer) { __enet_poll(); } @@ -198,7 +198,7 @@ do_ping(int argc, char *argv[]) if (icmp_received) { received++; if (verbose) { - printf("icmp - seq: %d, time: %d (ticks)\n", + printf("icmp - seq: %ld, time: %ld (ticks)\n", ntohs(hold_hdr.seqnum), end_time-start_time); } }
--- a/packages/redboot/current/src/net/udp.c +++ b/packages/redboot/current/src/net/udp.c @@ -239,7 +239,7 @@ int total_ms = (timo->tv_sec * 1000) + (timo->tv_usec / 1000); start = MS_TICKS(); res = -1; - while ((MS_TICKS() - start) < total_ms) { + while ((MS_TICKS_DELAY() - start) < total_ms) { __enet_poll(); // Handle the hardware if (!recvfrom_buf) { // Data have arrived
--- a/packages/redboot/current/src/syscall.c +++ b/packages/redboot/current/src/syscall.c @@ -72,10 +72,10 @@ #define SYS_time 18 #define SYS_interrupt 1000 +#define SYS_meminfo 1001 #define __GET_SHARED 0xbaad - /* * Clients of this BSP will need to have access to BSP functions and * data structures. Because, the client and the BSP may not be linked @@ -230,11 +230,11 @@ sys_utime(unsigned long *p) // module, 1 otherwise. This allows applications to // extend the syscall handler by using exception chaining. // -int -__do_syscall(int func, // syscall function number - long arg1, long arg2, // up to four args. - long arg3, long arg4, - int *retval) // syscall return value +CYG_ADDRWORD +__do_syscall(CYG_ADDRWORD func, // syscall function number + CYG_ADDRWORD arg1, CYG_ADDRWORD arg2, // up to four args. + CYG_ADDRWORD arg3, CYG_ADDRWORD arg4, + CYG_ADDRWORD *retval) // syscall return value { int err = 0; @@ -264,6 +264,12 @@ int err = sys_utime((unsigned long *)arg1); break; + case SYS_meminfo: + err = 1; + *(unsigned long *)arg1 = (unsigned long)(ram_end-ram_start); + *(unsigned long *)arg2 = (unsigned long)ram_end; + break; + case __GET_SHARED: *(__shared_t **)arg1 = &__shared_data; break;
--- a/packages/redboot/current/src/ticks.c +++ b/packages/redboot/current/src/ticks.c @@ -45,10 +45,17 @@ #include "redboot.h" +static unsigned long ticks = 0; + unsigned long do_ms_tick(void) { - static unsigned long ticks = 0; CYGACC_CALL_IF_DELAY_US(1000); // Wait for 1ms return ++ticks; } + +unsigned long +get_ms_ticks(void) +{ + return ticks; +}
--- a/packages/redboot/current/src/xyzModem.c +++ b/packages/redboot/current/src/xyzModem.c @@ -71,42 +71,6 @@ static struct { #define xyzModem_MAX_RETRIES 20 #define xyzModem_MAX_RETRIES_WITH_CRC 10 -// Table of CRC constants - implements x^16+x^12+x^5+1 -static unsigned short crc16[] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, -}; - #ifdef DEBUG #ifndef USE_SPRINTF // @@ -292,10 +256,7 @@ xyzModem_get_hdr(void) } // Verify checksum/CRC if (xyz.crc_mode) { - cksum = 0; - for (i = 0; i < xyz.len; i++) { - cksum = crc16[((cksum>>8) ^ xyz.pkt[i]) & 0xFF] ^ (cksum << 8); - } + cksum = crc16(xyz.pkt, xyz.len); if (cksum != ((xyz.crc1 << 8) | xyz.crc2)) { ZM_DEBUG(zm_dprintf("CRC error - recvd: %02x%02x, computed: %x\n", xyz.crc1, xyz.crc2, cksum & 0xFFFF));
--- a/packages/services/memalloc/common/current/ChangeLog +++ b/packages/services/memalloc/common/current/ChangeLog @@ -1,3 +1,7 @@ +2001-02-01 Jonathan Larmour <jlarmour@redhat.com> + + * tests/malloc4.cxx: Use semaphores to sync startup order. + 2000-11-28 Jonathan Larmour <jlarmour@redhat.com> * src/heapgen.tcl: Don't use cygpath -s for now as not all cygwins
--- a/packages/services/memalloc/common/current/tests/malloc4.cxx +++ b/packages/services/memalloc/common/current/tests/malloc4.cxx @@ -40,6 +40,8 @@ // //####DESCRIPTIONEND#### +// #define DEBUGTEST + // INCLUDES #include <pkgconf/system.h> @@ -54,6 +56,7 @@ # include <cyg/kernel/thread.inl> # include <cyg/kernel/sched.hxx> # include <cyg/kernel/sched.inl> +# include <cyg/kernel/sema.hxx> #endif #include <cyg/infra/testcase.h> @@ -93,7 +96,8 @@ cyg_start() #include <cyg/infra/diag.h> -volatile int gonow = 0; +Cyg_Counting_Semaphore startsema; + volatile int stopnow = 0; struct ptr { @@ -168,8 +172,7 @@ thrmalloc( CYG_ADDRWORD data ) void *mem; unsigned int seed; - while (!gonow) - Cyg_Thread::self()->delay(1); + startsema.wait(); while (!stopnow) { r = myrand( NUM_PTRS-1, &seed ); @@ -192,7 +195,9 @@ thrmalloc( CYG_ADDRWORD data ) ptrs[i].p = (char *)mem; ptrs[i].size = r; if ( NULL != mem ) { -// diag_printf("malloc=%08x size=%d\n", mem, r); +#ifdef DEBUGTEST + diag_printf("malloc=%08x size=%d\n", mem, r); +#endif fill_with_data( &ptrs[i] ); } ptrs[i].busy = 0; @@ -207,8 +212,7 @@ thrcalloc( CYG_ADDRWORD data ) void *mem; unsigned int seed; - while (!gonow) - Cyg_Thread::self()->delay(1); + startsema.wait(); while (!stopnow) { r = myrand( NUM_PTRS-1, &seed ); @@ -231,7 +235,9 @@ thrcalloc( CYG_ADDRWORD data ) ptrs[i].p = (char *)mem; ptrs[i].size = r; if ( NULL != mem ) { -// diag_printf("calloc=%08x size=%d\n", mem, r); +#ifdef DEBUGTEST + diag_printf("calloc=%08x size=%d\n", mem, r); +#endif check_zeroes( &ptrs[i] ); fill_with_data( &ptrs[i] ); } @@ -247,8 +253,7 @@ thrrealloc( CYG_ADDRWORD data ) void *mem; unsigned int seed; - while (!gonow) - Cyg_Thread::self()->delay(1); + startsema.wait(); while (!stopnow) { r = myrand( NUM_PTRS-1, &seed ); @@ -270,7 +275,9 @@ thrrealloc( CYG_ADDRWORD data ) r = myrand(memsize, &seed); mem = realloc( (void *)ptrs[i].p, r ); if ( NULL != mem ) { -// diag_printf("realloc=%08x oldsize=%d newsize=%d\n", mem, ptrs[i].size, r); +#ifdef DEBUGTEST + diag_printf("realloc=%08x oldsize=%d newsize=%d\n", mem, ptrs[i].size, r); +#endif ptrs[i].size = r; ptrs[i].p = (char *)mem; fill_with_data( &ptrs[i] ); @@ -292,7 +299,9 @@ thrfree( CYG_ADDRWORD data ) memsize = (unsigned long) minfo.maxfree; diag_printf("INFO:<Iteration 0, arenasize=%d, space free=%d, maxfree=%d>\n", minfo.arena, minfo.fordblks, minfo.maxfree ); - gonow++; + + // wake the three threads above. + startsema.post(); startsema.post(); startsema.post(); Cyg_Thread::self()->delay(1); @@ -343,7 +352,9 @@ thrfree( CYG_ADDRWORD data ) ptrs[i].busy = 1; Cyg_Scheduler::unlock(); check_data( &ptrs[i] ); -// diag_printf("about to free %08x\n", ptrs[i].p); +#ifdef DEBUGTEST + diag_printf("about to free %08x\n", ptrs[i].p); +#endif free( (void *)ptrs[i].p ); ptrs[i].p = NULL; ptrs[i].busy = 0;
