diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/.gitignore | 13 | ||||
-rw-r--r-- | src/CMakeLists.txt | 64 | ||||
-rw-r--r-- | src/Makefile.Watcom | 206 | ||||
-rw-r--r-- | src/Makefile.am | 89 | ||||
-rw-r--r-- | src/Makefile.b32 | 109 | ||||
-rw-r--r-- | src/Makefile.in | 743 | ||||
-rw-r--r-- | src/Makefile.inc | 108 | ||||
-rw-r--r-- | src/Makefile.m32 | 302 | ||||
-rw-r--r-- | src/Makefile.netware | 330 | ||||
-rw-r--r-- | src/Makefile.riscos | 64 | ||||
-rw-r--r-- | src/Makefile.vc10 | 299 | ||||
-rw-r--r-- | src/Makefile.vc6 | 419 | ||||
-rw-r--r-- | src/Makefile.vc8 | 299 | ||||
-rw-r--r-- | src/Makefile.vc9 | 299 | ||||
-rw-r--r-- | src/checksrc.whitelist | 3 | ||||
-rw-r--r-- | src/config-amigaos.h | 69 | ||||
-rw-r--r-- | src/config-mac.h | 35 | ||||
-rw-r--r-- | src/config-riscos.h | 379 | ||||
-rw-r--r-- | src/config-win32.h | 416 | ||||
-rw-r--r-- | src/curl.rc | 2 | ||||
-rw-r--r-- | src/curl_config.h.in | 1006 | ||||
-rwxr-xr-x | src/curlsrc.vcproj | 553 | ||||
-rw-r--r-- | src/hugehelp.c | 7061 | ||||
-rw-r--r-- | src/macos/MACINSTALL.TXT | 2 | ||||
-rw-r--r-- | src/main.c | 6084 | ||||
-rw-r--r-- | src/makefile.amiga | 12 | ||||
-rw-r--r-- | src/makefile.dj | 20 | ||||
-rw-r--r-- | src/mkhelp.pl | 60 | ||||
-rw-r--r-- | src/setup.h | 223 | ||||
-rw-r--r-- | src/tool_binmode.c | 52 | ||||
-rw-r--r-- | src/tool_binmode.h | 37 | ||||
-rw-r--r-- | src/tool_bname.c | 50 | ||||
-rw-r--r-- | src/tool_bname.h | 35 | ||||
-rw-r--r-- | src/tool_cb_dbg.c | 275 | ||||
-rw-r--r-- | src/tool_cb_dbg.h | 35 | ||||
-rw-r--r-- | src/tool_cb_hdr.c | 226 | ||||
-rw-r--r-- | src/tool_cb_hdr.h | 54 | ||||
-rw-r--r-- | src/tool_cb_prg.c | 150 | ||||
-rw-r--r-- | src/tool_cb_prg.h | 50 | ||||
-rw-r--r-- | src/tool_cb_rea.c | 55 | ||||
-rw-r--r-- | src/tool_cb_rea.h | 33 | ||||
-rw-r--r-- | src/tool_cb_see.c | 131 | ||||
-rw-r--r-- | src/tool_cb_see.h | 46 | ||||
-rw-r--r-- | src/tool_cb_wrt.c | 159 | ||||
-rw-r--r-- | src/tool_cb_wrt.h | 36 | ||||
-rw-r--r-- | src/tool_cfgable.c | 159 | ||||
-rw-r--r-- | src/tool_cfgable.h | 246 | ||||
-rw-r--r-- | src/tool_convert.c | 150 | ||||
-rw-r--r-- | src/tool_convert.h | 45 | ||||
-rw-r--r-- | src/tool_dirhie.c | 147 | ||||
-rw-r--r-- | src/tool_dirhie.h | 29 | ||||
-rw-r--r-- | src/tool_doswin.c | 299 | ||||
-rw-r--r-- | src/tool_doswin.h | 46 | ||||
-rw-r--r-- | src/tool_easysrc.c | 229 | ||||
-rw-r--r-- | src/tool_easysrc.h | 48 | ||||
-rw-r--r-- | src/tool_formparse.c | 361 | ||||
-rw-r--r-- | src/tool_formparse.h | 33 | ||||
-rw-r--r-- | src/tool_getparam.c | 1918 | ||||
-rw-r--r-- | src/tool_getparam.h | 62 | ||||
-rw-r--r-- | src/tool_getpass.c (renamed from src/getpass.c) | 143 | ||||
-rw-r--r-- | src/tool_getpass.h (renamed from src/getpass.h) | 12 | ||||
-rw-r--r-- | src/tool_help.c | 345 | ||||
-rw-r--r-- | src/tool_help.h | 31 | ||||
-rw-r--r-- | src/tool_helpers.c | 79 | ||||
-rw-r--r-- | src/tool_helpers.h | 32 | ||||
-rw-r--r-- | src/tool_homedir.c (renamed from src/homedir.c) | 51 | ||||
-rw-r--r-- | src/tool_homedir.h (renamed from src/homedir.h) | 9 | ||||
-rw-r--r-- | src/tool_hugehelp.c.cvs (renamed from src/writeenv.h) | 12 | ||||
-rw-r--r-- | src/tool_hugehelp.h (renamed from src/hugehelp.h) | 10 | ||||
-rw-r--r-- | src/tool_libinfo.c | 102 | ||||
-rw-r--r-- | src/tool_libinfo.h | 34 | ||||
-rw-r--r-- | src/tool_main.c | 275 | ||||
-rw-r--r-- | src/tool_main.h | 44 | ||||
-rw-r--r-- | src/tool_metalink.c | 982 | ||||
-rw-r--r-- | src/tool_metalink.h | 167 | ||||
-rw-r--r-- | src/tool_mfiles.c | 127 | ||||
-rw-r--r-- | src/tool_mfiles.h | 46 | ||||
-rw-r--r-- | src/tool_msgs.c | 100 | ||||
-rw-r--r-- | src/tool_msgs.h | 31 | ||||
-rw-r--r-- | src/tool_operate.c | 1900 | ||||
-rw-r--r-- | src/tool_operate.h | 29 | ||||
-rw-r--r-- | src/tool_operhlp.c | 174 | ||||
-rw-r--r-- | src/tool_operhlp.h | 39 | ||||
-rw-r--r-- | src/tool_panykey.c | 48 | ||||
-rw-r--r-- | src/tool_panykey.h | 37 | ||||
-rw-r--r-- | src/tool_paramhlp.c | 524 | ||||
-rw-r--r-- | src/tool_paramhlp.h | 54 | ||||
-rw-r--r-- | src/tool_parsecfg.c | 365 | ||||
-rw-r--r-- | src/tool_parsecfg.h | 29 | ||||
-rw-r--r-- | src/tool_sdecls.h | 153 | ||||
-rw-r--r-- | src/tool_setopt.c | 567 | ||||
-rw-r--r-- | src/tool_setopt.h | 148 | ||||
-rw-r--r-- | src/tool_setup.h | 74 | ||||
-rw-r--r-- | src/tool_sleep.c | 58 | ||||
-rw-r--r-- | src/tool_sleep.h (renamed from src/writeout.h) | 12 | ||||
-rw-r--r-- | src/tool_strdup.c | 47 | ||||
-rw-r--r-- | src/tool_strdup.h | 30 | ||||
-rw-r--r-- | src/tool_urlglob.c | 671 | ||||
-rw-r--r-- | src/tool_urlglob.h (renamed from src/urlglob.h) | 48 | ||||
-rw-r--r-- | src/tool_util.c (renamed from src/curlutil.c) | 41 | ||||
-rw-r--r-- | src/tool_util.h (renamed from src/curlutil.h) | 31 | ||||
-rw-r--r-- | src/tool_version.h (renamed from src/version.h) | 11 | ||||
-rw-r--r-- | src/tool_vms.c (renamed from src/os-specific.c) | 24 | ||||
-rw-r--r-- | src/tool_vms.h (renamed from src/os-specific.h) | 17 | ||||
-rw-r--r-- | src/tool_writeenv.c (renamed from src/writeenv.c) | 25 | ||||
-rw-r--r-- | src/tool_writeenv.h | 35 | ||||
-rw-r--r-- | src/tool_writeout.c (renamed from src/writeout.c) | 101 | ||||
-rw-r--r-- | src/tool_writeout.h | 28 | ||||
-rw-r--r-- | src/tool_xattr.c | 90 | ||||
-rw-r--r-- | src/tool_xattr.h | 28 | ||||
-rw-r--r-- | src/urlglob.c | 549 | ||||
-rw-r--r-- | src/vc6curlsrc.dsp | 258 | ||||
-rw-r--r-- | src/vc6curlsrc.dsw | 29 |
113 files changed, 14174 insertions, 19197 deletions
diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..c7ffcdc --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,13 @@ +curl +curl_config.h +curl_config.h.in +tool_hugehelp.c +stamp-h2 +Makefile.vc8.dist +Makefile.vc9.dist +tool_version.h.dist +Makefile.vc10.dist +config-win32.h +*.a +*.res +*.nlm diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index faea096..bfb866b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,11 +1,39 @@ set(EXE_NAME curl) -# First try to locate hugehelp.c to see if it has already been created -# TODO Find the file WITHOUT adding a cache entry!!! Or else the user can delete the file after the script was first run, and the script won't notice it has gone. -find_file(HUGEHELP_C_FILE hugehelp.c PATHS . NO_DEFAULT_PATH) -if (NOT HUGEHELP_C_FILE) - message(STATUS "Warning: hugehelp.c file was not generated before. Generating an 'empty' file...") - file(WRITE hugehelp.c "/* built-in manual is disabled, blank function */\n#include \"hugehelp.h\"\nvoid hugehelp(void) {}\n\n") +if(USE_MANUAL) + find_package(Perl REQUIRED) + # Use the C locale to ensure that only ASCII characters appear in the + # embedded text. NROFF and MANOPT are set in the parent CMakeLists.txt + add_custom_command( + OUTPUT tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "#include \"tool_setup.h\"" > tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "#ifndef HAVE_LIBZ" >> tool_hugehelp.c + COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT} + "${CURL_SOURCE_DIR}/docs/curl.1" | + "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" + "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "#else" >> tool_hugehelp.c + COMMAND env LC_ALL=C "${NROFF}" ${NROFF_MANOPT} + "${CURL_SOURCE_DIR}/docs/curl.1" | + "${PERL}" "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" -c + "${CURL_SOURCE_DIR}/docs/MANUAL" >> tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "#endif /* HAVE_LIBZ */" >> tool_hugehelp.c + DEPENDS + "${CURL_SOURCE_DIR}/docs/MANUAL" + "${CURL_SOURCE_DIR}/docs/curl.1" + "${CMAKE_CURRENT_SOURCE_DIR}/mkhelp.pl" + "${CMAKE_CURRENT_SOURCE_DIR}/tool_hugehelp.h" + VERBATIM) +else() + add_custom_command( + OUTPUT tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "/* built-in manual is disabled, blank function */" > tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "#include \"tool_hugehelp.h\"" >> tool_hugehelp.c + COMMAND ${CMAKE_COMMAND} -E echo "void hugehelp(void) {}" >> tool_hugehelp.c + DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/tool_hugehelp.h" + VERBATIM) + endif() transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") @@ -20,21 +48,20 @@ add_executable( ${curl_SOURCES} ) -source_group("cURLX source files" FILES ${CURLX_ONES}) +source_group("cURLX source files" FILES ${CURLX_CFILES}) source_group("cURL source files" FILES ${CURL_CFILES}) source_group("cURL header files" FILES ${CURL_HFILES}) include_directories( - ${CURL_SOURCE_DIR}/lib # To be able to reach "setup_once.h" - ${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h" + ${CURL_SOURCE_DIR}/lib # To be able to reach "curl_setup_once.h" + ${CURL_BINARY_DIR}/lib # To be able to reach "curl_config.h" ${CURL_BINARY_DIR}/include # To be able to reach "curl/curlbuild.h" + # This is needed as tool_hugehelp.c is generated in the binary dir + ${CURL_SOURCE_DIR}/src # To be able to reach "tool_hugehelp.h" ) - -# Setup dependencies -setup_curl_dependencies(${EXE_NAME}) -target_link_libraries( ${EXE_NAME} libcurl ) - +#Build cURL executable +target_link_libraries( ${EXE_NAME} libcurl ${CURL_LIBS}) ################################################################################ @@ -46,11 +73,6 @@ target_link_libraries( ${EXE_NAME} libcurl ) set_target_properties(${EXE_NAME} PROPERTIES DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") -if(MSVC) - if(NOT BUILD_RELEASE_DEBUG_DIRS) - # Ugly workaround to remove the "/debug" or "/release" in each output - set_target_properties(${EXE_NAME} PROPERTIES PREFIX "../") - endif() -endif() - #INCLUDE(ModuleInstall OPTIONAL) + +install(TARGETS ${EXE_NAME} DESTINATION bin) diff --git a/src/Makefile.Watcom b/src/Makefile.Watcom index 3d42303..6ec598d 100644 --- a/src/Makefile.Watcom +++ b/src/Makefile.Watcom @@ -3,11 +3,23 @@ # G. Vanem <gvanem@broadpark.no> # +.ERASE + +!if $(__VERSION__) < 1280 +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!message ! This Open Watcom version is too old and is no longer supported ! +!message ! Please download latest version from www.openwatcom.org ! +!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!error Unsupported version of Open Watcom +!endif + !ifndef %watcom !error WATCOM environment variable not set! -!else -SYS_INCL = -I$(%watcom)\h\nt -I$(%watcom)\h -SYS_LIBS = $(%watcom)\lib386\nt;$(%watcom)\lib386 +!endif + +# In order to process Makefile.inc wmake must be called with -u switch! +!ifndef %MAKEFLAGS +!error You MUST call wmake with the -u switch! !endif !ifdef %libname @@ -15,7 +27,8 @@ LIBNAME = $(%libname) !else LIBNAME = libcurl !endif -TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib + +TARGETS = curl.exe CC = wcc386 LD = wlink @@ -26,25 +39,29 @@ RC = wrc ! loaddll wcc386 wccd386 ! loaddll wpp386 wppd386 ! loaddll wlib wlibd -! if $(__VERSION__) > 1270 -! loaddll wlink wlinkd -! else -! loaddll wlink wlink -! endif +! loaddll wlink wlinkd !endif -!if $(__VERSION__) < 1250 -RM = del /q /f 2>NUL +!ifdef __UNIX__ +CP = cp +MD = mkdir -p !else -RM = rm -f -!endif +CP = copy 2>NUL MD = mkdir +!endif +!if $(__VERSION__) > 1290 +RD = rm -rf +!else ifdef __UNIX__ +RD = rm -rf +!else RD = rmdir /q /s 2>NUL -CP = copy +!endif + +SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h" CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm & -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL & - -I..\include -I..\lib $(SYS_INCL) + -I"../include" -I"../lib" $(SYS_INCL) !ifdef %debug DEBUG = -dDEBUG=1 -dDEBUGBUILD @@ -57,134 +74,139 @@ CFLAGS += -d0 CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6 !endif +!ifdef %use_ssl +CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32" +!endif + +!ifdef %curl_static +CFLAGS += -DCURL_STATICLIB +!else +CFLAGS += -br +!endif + # # Change to suite. # !ifdef %zlib_root ZLIB_ROOT = $(%zlib_root) !else -ZLIB_ROOT = ..\..\zlib-1.2.5 +ZLIB_ROOT = ../../zlib-1.2.8 !endif !ifdef %libssh2_root LIBSSH2_ROOT = $(%libssh2_root) !else -LIBSSH2_ROOT = ..\..\libssh2-1.2.7 +LIBSSH2_ROOT = ../../libssh2-1.5.0 !endif !ifdef %librtmp_root LIBRTMP_ROOT = $(%librtmp_root) !else -LIBRTMP_ROOT = ..\..\librtmp-2.3 +LIBRTMP_ROOT = ../../rtmpdump-2.3 !endif !ifdef %openssl_root OPENSSL_ROOT = $(%openssl_root) !else -OPENSSL_ROOT = ..\..\openssl-0.9.8o +OPENSSL_ROOT = ../../openssl-1.0.2a !endif !ifdef %ares_root ARES_ROOT = $(%ares_root) !else -ARES_ROOT = ..\ares -!endif - -!ifdef %use_ssl -CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)\inc32 +ARES_ROOT = ../ares !endif OBJ_DIR = WC_Win32.obj -LINK_ARG = $(OBJ_DIR)\wlink.arg +LINK_ARG = $(OBJ_DIR)/wlink.arg -# In order to process Makefile.inc wmake must be called with -u switch! -!ifndef %MAKEFLAGS -!error You MUST call wmake with the -u switch! -!else !include Makefile.inc -!endif -# For now we still define the CURLX_ONES sources here unless we know how -# to split off the prefixed path. -CURLX_SOURCES = rawstr.c nonblock.c -OBJS = $(CURL_CFILES:.c=.obj) -!ifdef %curl_static -CFLAGS += -DCURL_STATICLIB -!else -CFLAGS += -br -OBJS += $(CURLX_SOURCES:.c=.obj) +OBJS1 = $(OBJ_DIR)/$(CURL_CFILES) +!ifndef %curl_static +OBJS1 += $(CURLX_CFILES:../lib/=) !endif -OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\) +OBJS2 = $(OBJS1: = $(OBJ_DIR)/) +OBJS = $(OBJS2:.c=.obj) -RESOURCE = $(OBJ_DIR)\curl.res +RESOURCE = $(OBJ_DIR)/curl.res -all: hugehelp.c $(OBJ_DIR) curl.exe .SYMBOLIC +DIRS = $(OBJ_DIR) + +all: tool_hugehelp.c $(DIRS) $(TARGETS) .SYMBOLIC @echo Welcome to cURL clean: .SYMBOLIC - -$(RM) $(OBJS) - -$(RM) $(RESOURCE) $(LINK_ARG) + -rm -f $(OBJS) + -rm -f $(RESOURCE) $(LINK_ARG) vclean distclean: clean .SYMBOLIC -$(RD) $(OBJ_DIR) - -$(RM) curl.exe curl.map curl.sym hugehelp.c + -rm -f curl.exe curl.sym tool_hugehelp.c -hugehelp.c: hugehelp.c.cvs +tool_hugehelp.c: tool_hugehelp.c.cvs $(CP) $[@ $^@ -hugehelp.c.cvs: .EXISTSONLY - $(CP) hugehelp.c $^@ +tool_hugehelp.c.cvs: .EXISTSONLY + $(CP) tool_hugehelp.c $^@ -$(OBJ_DIR): +$(DIRS): -$(MD) $^@ -curl.exe: $(OBJS) $(RESOURCE) $(LINK_ARG) - $(LD) name $^@ @$]@ - -$(RESOURCE): curl.rc - $(RC) $(DEBUG) -q -r -zm -I..\include $(SYS_INCL) $[@ -fo=$^@ - -# suffix search path - vpath-like hack -.c: ..\lib - -.ERASE -.c{$(OBJ_DIR)}.obj: - $(CC) $(CFLAGS) $[@ -fo=$^@ - -$(LINK_ARG): $(__MAKEFILES__) - %create $^@ - @%append $^@ system nt - @%append $^@ file { $(OBJS) } +curl.exe: $(OBJS) $(RESOURCE) + %create $(LINK_ARG) + @%append $(LINK_ARG) system nt !ifdef %debug - @%append $^@ debug all - @%append $^@ option symfile -!endif - @%append $^@ option quiet, map, caseexact, eliminate, - @%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS) -!ifdef %curl_static - @%append $^@ library wldap32.lib - @%append $^@ library ..\lib\$(LIBNAME).lib -!ifdef %use_zlib - @%append $^@ library $(ZLIB_ROOT)\zlib.lib -!endif -!ifdef %use_rtmp - @%append $^@ library $(LIBRTMP_ROOT)\librtmp\librtmp.lib, winmm.lib -!endif -!ifdef %use_ssh2 - @%append $^@ library $(LIBSSH2_ROOT)\win32\libssh2.lib -!endif -!ifdef %use_ssl - @%append $^@ library $(OPENSSL_ROOT)\out32\libeay32.lib, $(OPENSSL_ROOT)\out32\ssleay32.lib -!endif -!ifdef %use_ares - @%append $^@ library $(ARES_ROOT)\cares.lib -!endif + @%append $(LINK_ARG) debug all + @%append $(LINK_ARG) option symfile +!endif + @%append $(LINK_ARG) option quiet, caseexact, eliminate + @%append $(LINK_ARG) option map=$(OBJ_DIR)/$^&.map + @%append $(LINK_ARG) option res=$(RESOURCE) + @%append $(LINK_ARG) file { $(OBJS) } +!ifndef %curl_static + @%append $(LINK_ARG) library ../lib/$(LIBNAME)_imp.lib !else - @%append $^@ library ..\lib\$(LIBNAME)_imp.lib + @%append $(LINK_ARG) library ../lib/$(LIBNAME).lib + @%append $(LINK_ARG) library wldap32.lib +! ifdef %use_zlib + @%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib' +! endif +! ifdef %use_rtmp + @%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib' + @%append $(LINK_ARG) library winmm.lib +! endif +! ifdef %use_ssh2 + @%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib' +! endif +! ifdef %use_ssl + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib' + @%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib' +! endif +! ifdef %use_ares + @%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib' +! endif +! ifdef %use_winidn +! if $(__VERSION__) > 1290 + @%append $(LINK_ARG) library normaliz.lib +! else + @%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii' + @%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode' +! endif +! endif !endif !ifeq USE_WATT32 1 - @%append $^@ library $(%watt_root)\lib\wattcpw_imp.lib + @%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib' !else - @%append $^@ library ws2_32.lib + @%append $(LINK_ARG) library ws2_32.lib !endif + $(LD) name $^@ @$(LINK_ARG) + +$(RESOURCE): curl.rc + $(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@ +# suffix search path - vpath-like hack +.c: ../lib + +.c{$(OBJ_DIR)}.obj: + $(CC) $(CFLAGS) $[@ -fo=$^@ diff --git a/src/Makefile.am b/src/Makefile.am index f2b4c8c..f4bc6c9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. +# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms @@ -21,70 +21,97 @@ ########################################################################### AUTOMAKE_OPTIONS = foreign nostdinc +# remove targets if the command fails +.DELETE_ON_ERROR: + # Specify our include paths here, and do it relative to $(top_srcdir) and # $(top_builddir), to ensure that these paths which belong to the library # being currently built and tested are searched before the library which # might possibly already be installed in the system. # # $(top_builddir)/include/curl for generated curlbuild.h included from curl.h -# $(top_builddir)/include for generated curlbuild.h included from lib/setup.h +# $(top_builddir)/include for generated curlbuild.h inc. from lib/curl_setup.h # $(top_srcdir)/include is for libcurl's external include files # $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file # $(top_builddir)/src is for curl's generated src/curl_config.h file -# $(top_srcdir)/lib is for libcurl's lib/setup.h and other "borrowed" files -# $(top_srcdir)/src is for curl's src/setup.h and "curl-private" files +# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "borrowed" files +# $(top_srcdir)/src is for curl's src/tool_setup.h and "curl-private" files -INCLUDES = -I$(top_builddir)/include/curl \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/lib \ - -I$(top_builddir)/src \ - -I$(top_srcdir)/lib \ - -I$(top_srcdir)/src +AM_CPPFLAGS = -I$(top_builddir)/include/curl \ + -I$(top_builddir)/include \ + -I$(top_srcdir)/include \ + -I$(top_builddir)/lib \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src bin_PROGRAMS = curl +if USE_CPPFLAG_CURL_STATICLIB +AM_CPPFLAGS += -DCURL_STATICLIB +endif + include Makefile.inc # This might hold -Werror CFLAGS += @CURL_CFLAG_EXTRAS@ -curl_LDADD = $(top_builddir)/lib/libcurl.la @CURL_LIBS@ +# Prevent LIBS from being used for all link targets +LIBS = $(BLANK_AT_MAKETIME) + +if USE_EXPLICIT_LIB_DEPS +curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @LIBCURL_LIBS@ +else +curl_LDADD = $(top_builddir)/lib/libcurl.la @LIBMETALINK_LIBS@ @NSS_LIBS@ @SSL_LIBS@ @ZLIB_LIBS@ @CURL_NETWORK_AND_TIME_LIBS@ +endif + +curl_LDFLAGS = @LIBMETALINK_LDFLAGS@ +curl_CPPFLAGS = $(AM_CPPFLAGS) $(LIBMETALINK_CPPFLAGS) curl_DEPENDENCIES = $(top_builddir)/lib/libcurl.la -BUILT_SOURCES = hugehelp.c -CLEANFILES = hugehelp.c + +# if unit tests are enabled, build a static library to link them with +if BUILD_UNITTESTS +noinst_LTLIBRARIES = libcurltool.la +libcurltool_la_CPPFLAGS = $(LIBMETALINK_CPPFLAGS) $(AM_CPPFLAGS) +libcurltool_la_CFLAGS = -DUNITTESTS +libcurltool_la_LDFLAGS = -static $(LINKFLAGS) +libcurltool_la_SOURCES = $(curl_SOURCES) +endif + +BUILT_SOURCES = tool_hugehelp.c +CLEANFILES = tool_hugehelp.c # Use the C locale to ensure that only ASCII characters appear in the # embedded text. NROFF=env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script -EXTRA_DIST = mkhelp.pl makefile.dj Makefile.vc6 Makefile.b32 Makefile.m32 \ - Makefile.riscos curl_config.h.in macos/curl.mcp.xml.sit.hqx \ - macos/MACINSTALL.TXT macos/src/curl_GUSIConfig.cpp vc6curlsrc.dsp \ - macos/src/macos_main.cpp config-amigaos.h makefile.amiga curl.rc \ - Makefile.netware Makefile.inc Makefile.Watcom vc6curlsrc.dsw \ - CMakeLists.txt +EXTRA_DIST = mkhelp.pl makefile.dj Makefile.vc6 Makefile.b32 \ + Makefile.m32 macos/curl.mcp.xml.sit.hqx macos/MACINSTALL.TXT \ + macos/src/curl_GUSIConfig.cpp macos/src/macos_main.cpp makefile.amiga \ + curl.rc Makefile.netware Makefile.inc Makefile.Watcom CMakeLists.txt \ + checksrc.whitelist MANPAGE=$(top_srcdir)/docs/curl.1 README=$(top_srcdir)/docs/MANUAL MKHELP=$(top_srcdir)/src/mkhelp.pl -HUGE=hugehelp.c +HUGE=tool_hugehelp.c if USE_MANUAL # Here are the stuff to create a built-in manual if HAVE_LIBZ -# This generates the hugehelp.c file in both uncompressed and compressed formats +# This generates the tool_hugehelp.c file in both uncompressed and +# compressed formats $(HUGE): $(README) $(MANPAGE) mkhelp.pl - echo '#include "setup.h"' > $(HUGE) + echo '#include "tool_setup.h"' > $(HUGE) echo '#ifndef HAVE_LIBZ' >> $(HUGE) $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE) echo '#else' >> $(HUGE) $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c $(README) >> $(HUGE) echo '#endif /* HAVE_LIBZ */' >> $(HUGE) else # HAVE_LIBZ -# This generates the hugehelp.c file uncompressed only +# This generates the tool_hugehelp.c file uncompressed only $(HUGE): $(README) $(MANPAGE) mkhelp.pl - echo '#include "setup.h"' > $(HUGE) + echo '#include "tool_setup.h"' > $(HUGE) $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE) endif @@ -92,6 +119,16 @@ else # USE_MANUAL # built-in manual has been disabled, make a blank file $(HUGE): echo "/* built-in manual is disabled, blank function */" > $(HUGE) - echo '#include "hugehelp.h"' >> $(HUGE) + echo '#include "tool_hugehelp.h"' >> $(HUGE) echo "void hugehelp(void) {}" >>$(HUGE) endif + +# ignore tool_hugehelp.c since it is generated source code and it plays +# by slightly different rules! +checksrc: + @@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/src -Wtool_hugehelp.c $(CURL_CFILES) $(CURL_HFILES) + +if CURLDEBUG +# for debug builds, we scan the sources on all regular make invokes +all-local: checksrc +endif diff --git a/src/Makefile.b32 b/src/Makefile.b32 index 7408dd2..85fe49f 100644 --- a/src/Makefile.b32 +++ b/src/Makefile.b32 @@ -6,84 +6,129 @@ # # 'BCCDIR' has to be set up to point to the base directory # of the compiler, i.e. SET BCCDIR = c:\Borland\BCC55 -# where c:\Borland\BCC55 is the compiler is installed # -# Written by Jaepil Kim, pit@paradise.net.nz +# Initially written by Jaepil Kim, pit@paradise.net.nz ############################################################ +!if "$(__MAKE__)" == "" +!error __MAKE__ not defined. Use Borlands's MAKE to process this makefile. +!endif + +# Borland's $(MAKEDIR) expands to the path where make.exe is located, +# use this feature to define BCCDIR when user has not defined BCCDIR. +!ifndef BCCDIR +BCCDIR = $(MAKEDIR)\.. +!endif + # Edit the path below to point to the base of your Zlib sources. !ifndef ZLIB_PATH -ZLIB_PATH = ../../zlib-1.2.1 +ZLIB_PATH = ..\..\zlib-1.2.8 !endif # Edit the path below to point to the base of your OpenSSL package. !ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.7d +OPENSSL_PATH = ..\..\openssl-1.0.2a !endif # Set program's name PROGNAME = curl.exe # Setup environment -CXX = bcc32 +PP_CMD = cpp32 -q -P- +CC_CMD = bcc32 -q -c LD = bcc32 -CP = copy -RM = del -LIB = tlib +RM = del 2>NUL +MKDIR = md +RMDIR = rd /q 2>NUL +COPY = $(COMSPEC) /c copy /y -CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM +CC_FLAGS = -5 -O2 -tWM -w -w-aus -w-ccc -w-dup -w-prc -w-pro -w-rch -w-sig -w-spa -w-inl -w-pia -w-pin -Dinline=__inline LDFLAGS = -q -lq -lap -INCDIRS = -I.;../include;../lib -LINKLIB = $(BCCDIR)/lib/cw32mt.lib - -# If you build with SSL support, set WITH_SSL=1 +SRCDIRS = .;..\lib +OBJDIR = .\BCC_objs +INCDIRS = -I.;..\include;..\lib +LINKLIB = $(BCCDIR)\lib\cw32mt.lib $(BCCDIR)\lib\ws2_32.lib DEFINES = -DNDEBUG -DWIN32 !ifdef DYNAMIC -LIBCURL_LIB = ../lib/libcurl_imp.lib +LIBCURL_LIB = ..\lib\libcurl_imp.lib !else -LIBCURL_LIB = ../lib/libcurl.lib +LIBCURL_LIB = ..\lib\libcurl.lib DEFINES = $(DEFINES) -DCURL_STATICLIB !endif +# ZLIB support is enabled setting WITH_ZLIB=1 !ifdef WITH_ZLIB DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H INCDIRS = $(INCDIRS);$(ZLIB_PATH) -LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib +LINKLIB = $(LINKLIB) $(ZLIB_PATH)\zlib.lib !endif +# SSL support is enabled setting WITH_SSL=1 !ifdef WITH_SSL -DEFINES = $(DEFINES) -DUSE_SSLEAY -INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl -LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib +DEFINES = $(DEFINES) -DUSE_OPENSSL +INCDIRS = $(INCDIRS);$(OPENSSL_PATH)\inc32;$(OPENSSL_PATH)\inc32\openssl +LINKLIB = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\libeay32.lib !endif .autodepend +.path.c = $(SRCDIRS) +.path.obj = $(OBJDIR) +.path.int = $(OBJDIR) + # Makefile.inc provides the CSOURCES and HHEADERS defines -top_srcdir = .. !include Makefile.inc -CSOURCES = $(CURL_CFILES) $(CURLX_ONES) +CSOURCES = $(CURL_CFILES) $(CURLX_CFILES:../lib/=) OBJECTS = $(CSOURCES:.c=.obj) +PREPROCESSED = $(CSOURCES:.c=.int) + +# Borland's command line compiler (BCC32) version 5.5.1 integrated +# preprocessor has a bug which results in silently generating wrong +# definitions for libcurl macros such as CURL_OFF_T_C, on the other +# hand Borland's command line preprocessor (CPP32) version 5.5.1 does +# not have the bug and achieves proper results. In order to avoid the +# silent bug we first preprocess source files and later compile the +# preprocessed result. .c.obj: - $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< + @-$(RM) $(@R).int + $(PP_CMD) $(CC_FLAGS) $(INCDIRS) $(DEFINES) -o$(@R).int $(<) + $(CC_CMD) $(CC_FLAGS) -o$(@) $(@R).int -all: $(PROGNAME) +all: $(OBJDIR) tool_hugehelp $(PROGNAME) clean: - -$(RM) $(PROGNAME) - -$(RM) *.obj - -$(RM) hugehelp.c + cd $(OBJDIR) + @-$(RM) $(OBJECTS) + @-$(RM) $(PREPROCESSED) + cd .. + @-$(RMDIR) $(OBJDIR) + @-$(RM) $(PROGNAME) + @-$(RM) curl.tds + +$(OBJDIR): + @-$(RMDIR) $(OBJDIR) + @-$(MKDIR) $(OBJDIR) -$(PROGNAME): $(OBJECTS) $(LIBCURL_LIB) $(LINKLIB) - @-$(RM) $@ - $(LD) $(LDFLAGS) -e$@ $** +!ifdef WITH_ZLIB +tool_hugehelp: ..\docs\MANUAL ..\docs\curl.1 mkhelp.pl + groff -Tascii -man -P -c ../docs/curl.1 > tool_hugehelp.tmp + perl -w mkhelp.pl -c ../docs/MANUAL < tool_hugehelp.tmp > tool_hugehelp.c + @-$(RM) tool_hugehelp.tmp +!else +tool_hugehelp: + if exist ..\GIT-INFO $(COPY) tool_hugehelp.c.cvs tool_hugehelp.c +!endif -hugehelp.c: hugehelp.c.cvs - @echo Creating $@ - @$(CP) $** $@ +$(PROGNAME): $(OBJECTS) $(LIBCURL_LIB) $(LINKLIB) + @-$(RM) $(PROGNAME) + $(LD) $(LDFLAGS) -e$@ @&&! +$(**: = ^ +) +! +# End of Makefile.b32 diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index 962ac87..0000000 --- a/src/Makefile.in +++ /dev/null @@ -1,743 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -# ./src/Makefile.inc -# Using the backslash as line continuation character might be problematic -# with some make flavours, as Watcom's wmake showed us already. If we -# ever want to change this in a portable manner then we should consider -# this idea (posted to the libcurl list by Adam Kellas): -# CSRC1 = file1.c file2.c file3.c -# CSRC2 = file4.c file5.c file6.c -# CSOURCES = $(CSRC1) $(CSRC2) - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -bin_PROGRAMS = curl$(EXEEXT) -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/Makefile.inc $(srcdir)/curl_config.h.in -subdir = src -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/curl-compilers.m4 \ - $(top_srcdir)/m4/curl-confopts.m4 \ - $(top_srcdir)/m4/curl-functions.m4 \ - $(top_srcdir)/m4/curl-override.m4 \ - $(top_srcdir)/m4/curl-reentrant.m4 \ - $(top_srcdir)/m4/curl-system.m4 $(top_srcdir)/m4/libtool.m4 \ - $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ - $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = $(top_builddir)/lib/curl_config.h curl_config.h \ - $(top_builddir)/include/curl/curlbuild.h -CONFIG_CLEAN_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) -am__objects_1 = main.$(OBJEXT) hugehelp.$(OBJEXT) urlglob.$(OBJEXT) \ - writeout.$(OBJEXT) writeenv.$(OBJEXT) getpass.$(OBJEXT) \ - homedir.$(OBJEXT) curlutil.$(OBJEXT) os-specific.$(OBJEXT) -am__objects_2 = strtoofft.$(OBJEXT) strdup.$(OBJEXT) rawstr.$(OBJEXT) \ - nonblock.$(OBJEXT) -am__objects_3 = -am_curl_OBJECTS = $(am__objects_1) $(am__objects_2) $(am__objects_3) -curl_OBJECTS = $(am_curl_OBJECTS) -DEFAULT_INCLUDES = -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(curl_SOURCES) -DIST_SOURCES = $(curl_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AS = @AS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BUILD_LIBHOSTNAME_FALSE = @BUILD_LIBHOSTNAME_FALSE@ -BUILD_LIBHOSTNAME_TRUE = @BUILD_LIBHOSTNAME_TRUE@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ - -# This might hold -Werror -CFLAGS = @CFLAGS@ @CURL_CFLAG_EXTRAS@ -CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CROSSCOMPILING_FALSE = @CROSSCOMPILING_FALSE@ -CROSSCOMPILING_TRUE = @CROSSCOMPILING_TRUE@ -CURLDEBUG_FALSE = @CURLDEBUG_FALSE@ -CURLDEBUG_TRUE = @CURLDEBUG_TRUE@ -CURL_CA_BUNDLE = @CURL_CA_BUNDLE@ -CURL_CFLAG_EXTRAS = @CURL_CFLAG_EXTRAS@ -CURL_DISABLE_DICT = @CURL_DISABLE_DICT@ -CURL_DISABLE_FILE = @CURL_DISABLE_FILE@ -CURL_DISABLE_FTP = @CURL_DISABLE_FTP@ -CURL_DISABLE_GOPHER = @CURL_DISABLE_GOPHER@ -CURL_DISABLE_HTTP = @CURL_DISABLE_HTTP@ -CURL_DISABLE_IMAP = @CURL_DISABLE_IMAP@ -CURL_DISABLE_LDAP = @CURL_DISABLE_LDAP@ -CURL_DISABLE_LDAPS = @CURL_DISABLE_LDAPS@ -CURL_DISABLE_POP3 = @CURL_DISABLE_POP3@ -CURL_DISABLE_PROXY = @CURL_DISABLE_PROXY@ -CURL_DISABLE_RTSP = @CURL_DISABLE_RTSP@ -CURL_DISABLE_SMTP = @CURL_DISABLE_SMTP@ -CURL_DISABLE_TELNET = @CURL_DISABLE_TELNET@ -CURL_DISABLE_TFTP = @CURL_DISABLE_TFTP@ -CURL_LIBS = @CURL_LIBS@ -CURL_NETWORK_LIBS = @CURL_NETWORK_LIBS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ENABLE_SHARED = @ENABLE_SHARED@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -HAVE_LDAP_SSL = @HAVE_LDAP_SSL@ -HAVE_LIBZ = @HAVE_LIBZ@ -HAVE_LIBZ_FALSE = @HAVE_LIBZ_FALSE@ -HAVE_LIBZ_TRUE = @HAVE_LIBZ_TRUE@ -HAVE_PK11_CREATEGENERICOBJECT = @HAVE_PK11_CREATEGENERICOBJECT@ -IDN_ENABLED = @IDN_ENABLED@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -IPV6_ENABLED = @IPV6_ENABLED@ -KRB4_ENABLED = @KRB4_ENABLED@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBCURL_LIBS = @LIBCURL_LIBS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -MANOPT = @MANOPT@ -MIMPURE_FALSE = @MIMPURE_FALSE@ -MIMPURE_TRUE = @MIMPURE_TRUE@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@ -NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@ -# Use the C locale to ensure that only ASCII characters appear in the -# embedded text. -NROFF = env LC_ALL=C @NROFF@ @MANOPT@ # figured out by the configure script -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH = @PATH@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -PKGADD_NAME = @PKGADD_NAME@ -PKGADD_PKG = @PKGADD_PKG@ -PKGADD_VENDOR = @PKGADD_VENDOR@ -PKGCONFIG = @PKGCONFIG@ -RANDOM_FILE = @RANDOM_FILE@ -RANLIB = @RANLIB@ -REQUIRE_LIB_DEPS = @REQUIRE_LIB_DEPS@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SONAME_BUMP_FALSE = @SONAME_BUMP_FALSE@ -SONAME_BUMP_TRUE = @SONAME_BUMP_TRUE@ -SSL_ENABLED = @SSL_ENABLED@ -STATICLIB_FALSE = @STATICLIB_FALSE@ -STATICLIB_TRUE = @STATICLIB_TRUE@ -STRIP = @STRIP@ -SUPPORT_FEATURES = @SUPPORT_FEATURES@ -SUPPORT_PROTOCOLS = @SUPPORT_PROTOCOLS@ -TEST_SERVER_LIBS = @TEST_SERVER_LIBS@ -USE_ARES = @USE_ARES@ -USE_EMBEDDED_ARES_FALSE = @USE_EMBEDDED_ARES_FALSE@ -USE_EMBEDDED_ARES_TRUE = @USE_EMBEDDED_ARES_TRUE@ -USE_GNUTLS = @USE_GNUTLS@ -USE_LIBRTMP = @USE_LIBRTMP@ -USE_LIBSSH2 = @USE_LIBSSH2@ -USE_MANUAL_FALSE = @USE_MANUAL_FALSE@ -USE_MANUAL_TRUE = @USE_MANUAL_TRUE@ -USE_NSS = @USE_NSS@ -USE_OPENLDAP = @USE_OPENLDAP@ -USE_POLARSSL = @USE_POLARSSL@ -USE_SSLEAY = @USE_SSLEAY@ -USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@ -VERSION = @VERSION@ -VERSIONNUM = @VERSIONNUM@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -libext = @libext@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ - -#*************************************************************************** -# _ _ ____ _ -# Project ___| | | | _ \| | -# / __| | | | |_) | | -# | (__| |_| | _ <| |___ -# \___|\___/|_| \_\_____| -# -# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. -# -# This software is licensed as described in the file COPYING, which -# you should have received as part of this distribution. The terms -# are also available at http://curl.haxx.se/docs/copyright.html. -# -# You may opt to use, copy, modify, merge, publish, distribute and/or sell -# copies of the Software, and permit persons to whom the Software is -# furnished to do so, under the terms of the COPYING file. -# -# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY -# KIND, either express or implied. -# -########################################################################### -AUTOMAKE_OPTIONS = foreign nostdinc - -# Specify our include paths here, and do it relative to $(top_srcdir) and -# $(top_builddir), to ensure that these paths which belong to the library -# being currently built and tested are searched before the library which -# might possibly already be installed in the system. -# -# $(top_builddir)/include/curl for generated curlbuild.h included from curl.h -# $(top_builddir)/include for generated curlbuild.h included from lib/setup.h -# $(top_srcdir)/include is for libcurl's external include files -# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file -# $(top_builddir)/src is for curl's generated src/curl_config.h file -# $(top_srcdir)/lib is for libcurl's lib/setup.h and other "borrowed" files -# $(top_srcdir)/src is for curl's src/setup.h and "curl-private" files -INCLUDES = -I$(top_builddir)/include/curl \ - -I$(top_builddir)/include \ - -I$(top_srcdir)/include \ - -I$(top_builddir)/lib \ - -I$(top_builddir)/src \ - -I$(top_srcdir)/lib \ - -I$(top_srcdir)/src - - -# libcurl has sources that provide functions named curlx_* that aren't part of -# the official API, but we re-use the code here to avoid duplication. -CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \ - $(top_srcdir)/lib/strdup.c \ - $(top_srcdir)/lib/rawstr.c \ - $(top_srcdir)/lib/nonblock.c - -CURL_CFILES = main.c hugehelp.c urlglob.c writeout.c writeenv.c \ - getpass.c homedir.c curlutil.c os-specific.c - -CURL_HFILES = hugehelp.h setup.h config-win32.h config-mac.h \ - config-riscos.h urlglob.h version.h os-specific.h \ - writeout.h writeenv.h getpass.h homedir.h curlutil.h - -curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES) -curl_LDADD = $(top_builddir)/lib/libcurl.la @CURL_LIBS@ -curl_DEPENDENCIES = $(top_builddir)/lib/libcurl.la -BUILT_SOURCES = hugehelp.c -CLEANFILES = hugehelp.c -EXTRA_DIST = mkhelp.pl makefile.dj Makefile.vc6 Makefile.b32 Makefile.m32 \ - Makefile.riscos curl_config.h.in macos/curl.mcp.xml.sit.hqx \ - macos/MACINSTALL.TXT macos/src/curl_GUSIConfig.cpp vc6curlsrc.dsp \ - macos/src/macos_main.cpp config-amigaos.h makefile.amiga curl.rc \ - Makefile.netware Makefile.inc Makefile.Watcom vc6curlsrc.dsw \ - CMakeLists.txt - -MANPAGE = $(top_srcdir)/docs/curl.1 -README = $(top_srcdir)/docs/MANUAL -MKHELP = $(top_srcdir)/src/mkhelp.pl -HUGE = hugehelp.c -all: $(BUILT_SOURCES) curl_config.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -curl_config.h: stamp-h2 - @if test ! -f $@; then \ - rm -f stamp-h2; \ - $(MAKE) stamp-h2; \ - else :; fi - -stamp-h2: $(srcdir)/curl_config.h.in $(top_builddir)/config.status - @rm -f stamp-h2 - cd $(top_builddir) && $(SHELL) ./config.status src/curl_config.h -$(srcdir)/curl_config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h2 - touch $@ - -distclean-hdr: - -rm -f curl_config.h stamp-h2 -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done -curl$(EXEEXT): $(curl_OBJECTS) $(curl_DEPENDENCIES) - @rm -f curl$(EXEEXT) - $(LINK) $(curl_LDFLAGS) $(curl_OBJECTS) $(curl_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curlutil.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpass.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/homedir.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hugehelp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonblock.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os-specific.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rawstr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoofft.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/urlglob.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writeenv.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writeout.Po@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -.c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< - -strtoofft.o: $(top_srcdir)/lib/strtoofft.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT strtoofft.o -MD -MP -MF "$(DEPDIR)/strtoofft.Tpo" -c -o strtoofft.o `test -f '$(top_srcdir)/lib/strtoofft.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/strtoofft.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/strtoofft.Tpo" "$(DEPDIR)/strtoofft.Po"; else rm -f "$(DEPDIR)/strtoofft.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/strtoofft.c' object='strtoofft.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o strtoofft.o `test -f '$(top_srcdir)/lib/strtoofft.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/strtoofft.c - -strtoofft.obj: $(top_srcdir)/lib/strtoofft.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT strtoofft.obj -MD -MP -MF "$(DEPDIR)/strtoofft.Tpo" -c -o strtoofft.obj `if test -f '$(top_srcdir)/lib/strtoofft.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/strtoofft.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/strtoofft.Tpo" "$(DEPDIR)/strtoofft.Po"; else rm -f "$(DEPDIR)/strtoofft.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/strtoofft.c' object='strtoofft.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o strtoofft.obj `if test -f '$(top_srcdir)/lib/strtoofft.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/strtoofft.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/strtoofft.c'; fi` - -strdup.o: $(top_srcdir)/lib/strdup.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT strdup.o -MD -MP -MF "$(DEPDIR)/strdup.Tpo" -c -o strdup.o `test -f '$(top_srcdir)/lib/strdup.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/strdup.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/strdup.Tpo" "$(DEPDIR)/strdup.Po"; else rm -f "$(DEPDIR)/strdup.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/strdup.c' object='strdup.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o strdup.o `test -f '$(top_srcdir)/lib/strdup.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/strdup.c - -strdup.obj: $(top_srcdir)/lib/strdup.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT strdup.obj -MD -MP -MF "$(DEPDIR)/strdup.Tpo" -c -o strdup.obj `if test -f '$(top_srcdir)/lib/strdup.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/strdup.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/strdup.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/strdup.Tpo" "$(DEPDIR)/strdup.Po"; else rm -f "$(DEPDIR)/strdup.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/strdup.c' object='strdup.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o strdup.obj `if test -f '$(top_srcdir)/lib/strdup.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/strdup.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/strdup.c'; fi` - -rawstr.o: $(top_srcdir)/lib/rawstr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rawstr.o -MD -MP -MF "$(DEPDIR)/rawstr.Tpo" -c -o rawstr.o `test -f '$(top_srcdir)/lib/rawstr.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/rawstr.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rawstr.Tpo" "$(DEPDIR)/rawstr.Po"; else rm -f "$(DEPDIR)/rawstr.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/rawstr.c' object='rawstr.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rawstr.o `test -f '$(top_srcdir)/lib/rawstr.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/rawstr.c - -rawstr.obj: $(top_srcdir)/lib/rawstr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rawstr.obj -MD -MP -MF "$(DEPDIR)/rawstr.Tpo" -c -o rawstr.obj `if test -f '$(top_srcdir)/lib/rawstr.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/rawstr.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rawstr.Tpo" "$(DEPDIR)/rawstr.Po"; else rm -f "$(DEPDIR)/rawstr.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/rawstr.c' object='rawstr.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rawstr.obj `if test -f '$(top_srcdir)/lib/rawstr.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/rawstr.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/rawstr.c'; fi` - -nonblock.o: $(top_srcdir)/lib/nonblock.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonblock.o -MD -MP -MF "$(DEPDIR)/nonblock.Tpo" -c -o nonblock.o `test -f '$(top_srcdir)/lib/nonblock.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/nonblock.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/nonblock.Tpo" "$(DEPDIR)/nonblock.Po"; else rm -f "$(DEPDIR)/nonblock.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/nonblock.c' object='nonblock.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonblock.o `test -f '$(top_srcdir)/lib/nonblock.c' || echo '$(srcdir)/'`$(top_srcdir)/lib/nonblock.c - -nonblock.obj: $(top_srcdir)/lib/nonblock.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nonblock.obj -MD -MP -MF "$(DEPDIR)/nonblock.Tpo" -c -o nonblock.obj `if test -f '$(top_srcdir)/lib/nonblock.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/nonblock.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/nonblock.Tpo" "$(DEPDIR)/nonblock.Po"; else rm -f "$(DEPDIR)/nonblock.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/lib/nonblock.c' object='nonblock.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nonblock.obj `if test -f '$(top_srcdir)/lib/nonblock.c'; then $(CYGPATH_W) '$(top_srcdir)/lib/nonblock.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/lib/nonblock.c'; fi` - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) curl_config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) curl_config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) curl_config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) curl_config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/macos $(distdir)/macos/src - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(PROGRAMS) curl_config.h -installdirs: - for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: install-binPROGRAMS - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libtool ctags distclean distclean-compile \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-binPROGRAMS install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-info-am - - -# Here are the stuff to create a built-in manual - -# This generates the hugehelp.c file in both uncompressed and compressed formats -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@$(HUGE): $(README) $(MANPAGE) mkhelp.pl -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ echo '#include "setup.h"' > $(HUGE) -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ echo '#ifndef HAVE_LIBZ' >> $(HUGE) -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE) -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ echo '#else' >> $(HUGE) -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c $(README) >> $(HUGE) -@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@ echo '#endif /* HAVE_LIBZ */' >> $(HUGE) -# This generates the hugehelp.c file uncompressed only -@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@$(HUGE): $(README) $(MANPAGE) mkhelp.pl -@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@ echo '#include "setup.h"' > $(HUGE) -@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@ $(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) $(README) >> $(HUGE) - -# built-in manual has been disabled, make a blank file -@USE_MANUAL_FALSE@$(HUGE): -@USE_MANUAL_FALSE@ echo "/* built-in manual is disabled, blank function */" > $(HUGE) -@USE_MANUAL_FALSE@ echo '#include "hugehelp.h"' >> $(HUGE) -@USE_MANUAL_FALSE@ echo "void hugehelp(void) {}" >>$(HUGE) -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/Makefile.inc b/src/Makefile.inc index 34dfd45..401a635 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -9,17 +9,105 @@ # libcurl has sources that provide functions named curlx_* that aren't part of # the official API, but we re-use the code here to avoid duplication. -CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \ - $(top_srcdir)/lib/strdup.c \ - $(top_srcdir)/lib/rawstr.c \ - $(top_srcdir)/lib/nonblock.c +CURLX_CFILES = \ + ../lib/strtoofft.c \ + ../lib/rawstr.c \ + ../lib/nonblock.c \ + ../lib/warnless.c -CURL_CFILES = main.c hugehelp.c urlglob.c writeout.c writeenv.c \ - getpass.c homedir.c curlutil.c os-specific.c +CURLX_HFILES = \ + ../lib/curl_setup.h \ + ../lib/strtoofft.h \ + ../lib/rawstr.h \ + ../lib/nonblock.h \ + ../lib/warnless.h -CURL_HFILES = hugehelp.h setup.h config-win32.h config-mac.h \ - config-riscos.h urlglob.h version.h os-specific.h \ - writeout.h writeenv.h getpass.h homedir.h curlutil.h +CURL_CFILES = \ + tool_binmode.c \ + tool_bname.c \ + tool_cb_dbg.c \ + tool_cb_hdr.c \ + tool_cb_prg.c \ + tool_cb_rea.c \ + tool_cb_see.c \ + tool_cb_wrt.c \ + tool_cfgable.c \ + tool_convert.c \ + tool_dirhie.c \ + tool_doswin.c \ + tool_easysrc.c \ + tool_formparse.c \ + tool_getparam.c \ + tool_getpass.c \ + tool_help.c \ + tool_helpers.c \ + tool_homedir.c \ + tool_hugehelp.c \ + tool_libinfo.c \ + tool_main.c \ + tool_metalink.c \ + tool_mfiles.c \ + tool_msgs.c \ + tool_operate.c \ + tool_operhlp.c \ + tool_panykey.c \ + tool_paramhlp.c \ + tool_parsecfg.c \ + tool_strdup.c \ + tool_setopt.c \ + tool_sleep.c \ + tool_urlglob.c \ + tool_util.c \ + tool_vms.c \ + tool_writeenv.c \ + tool_writeout.c \ + tool_xattr.c -curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES) +CURL_HFILES = \ + tool_binmode.h \ + tool_bname.h \ + tool_cb_dbg.h \ + tool_cb_hdr.h \ + tool_cb_prg.h \ + tool_cb_rea.h \ + tool_cb_see.h \ + tool_cb_wrt.h \ + tool_cfgable.h \ + tool_convert.h \ + tool_dirhie.h \ + tool_doswin.h \ + tool_easysrc.h \ + tool_formparse.h \ + tool_getparam.h \ + tool_getpass.h \ + tool_help.h \ + tool_helpers.h \ + tool_homedir.h \ + tool_hugehelp.h \ + tool_libinfo.h \ + tool_main.h \ + tool_metalink.h \ + tool_mfiles.h \ + tool_msgs.h \ + tool_operate.h \ + tool_operhlp.h \ + tool_panykey.h \ + tool_paramhlp.h \ + tool_parsecfg.h \ + tool_sdecls.h \ + tool_setopt.h \ + tool_setup.h \ + tool_sleep.h \ + tool_strdup.h \ + tool_urlglob.h \ + tool_util.h \ + tool_version.h \ + tool_vms.h \ + tool_writeenv.h \ + tool_writeout.h \ + tool_xattr.h + +CURL_RCFILES = curl.rc + +curl_SOURCES = $(CURL_CFILES) $(CURLX_CFILES) $(CURL_HFILES) diff --git a/src/Makefile.m32 b/src/Makefile.m32 index dfe8092..fc59f63 100644 --- a/src/Makefile.m32 +++ b/src/Makefile.m32 @@ -1,111 +1,285 @@ -######################################################################### +########################################################################### # -## Makefile for building curl.exe with MingW32 (GCC-3.2 or later) -## and optionally OpenSSL (0.9.8), libssh2 (1.2), zlib (1.2.5) +## Makefile for building curl.exe with MingW (GCC-3.2 or later) +## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4) ## -## Usage: -## mingw32-make -f Makefile.m32 [SSL=1] [SSH2=1] [ZLIB=1] [IDN=1] [SSPI=1] [IPV6=1] [LDAPS=1] [RTMP=1] [DYN=1] +## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...] +## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-spi-winidn ## ## Hint: you can also set environment vars to control the build, f.e.: -## set ZLIB_PATH=c:/zlib-1.2.5 +## set ZLIB_PATH=c:/zlib-1.2.8 ## set ZLIB=1 -## -## Comments to: Troy Engel <tengel@sonic.net> or -## Joern Hartroth <hartroth@acm.org> -######################################################################### +# +########################################################################### # Edit the path below to point to the base of your Zlib sources. ifndef ZLIB_PATH -ZLIB_PATH = ../../zlib-1.2.5 +ZLIB_PATH = ../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8o +OPENSSL_PATH = ../../openssl-1.0.2a endif # Edit the path below to point to the base of your LibSSH2 package. ifndef LIBSSH2_PATH -LIBSSH2_PATH = ../../libssh2-1.2.7 +LIBSSH2_PATH = ../../libssh2-1.5.0 +endif +# Edit the path below to point to the base of your librtmp package. +ifndef LIBRTMP_PATH +LIBRTMP_PATH = ../../librtmp-2.4 +endif +# Edit the path below to point to the base of your libmetalink package. +ifndef LIBMETALINK_PATH +LIBMETALINK_PATH = ../../libmetalink-0.1.3 +endif +# Edit the path below to point to the base of your libexpat package. +ifndef LIBEXPAT_PATH +LIBEXPAT_PATH = ../../expat-2.1.0 +endif +# Edit the path below to point to the base of your libxml2 package. +ifndef LIBXML2_PATH +LIBXML2_PATH = ../../libxml2-2.9.2 endif # Edit the path below to point to the base of your libidn package. ifndef LIBIDN_PATH -LIBIDN_PATH = ../../libidn-1.18 +LIBIDN_PATH = ../../libidn-1.30 endif -# Edit the path below to point to the base of your librtmp package. -ifndef LIBRTMP_PATH -LIBRTMP_PATH = ../../librtmp-2.3 +# Edit the path below to point to the base of your MS IDN package. +# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1 +# https://www.microsoft.com/en-us/download/details.aspx?id=734 +ifndef WINIDN_PATH +WINIDN_PATH = ../../Microsoft IDN Mitigation APIs endif # Edit the path below to point to the base of your Novell LDAP NDK. ifndef LDAP_SDK LDAP_SDK = c:/novell/ndk/cldapsdk/win32 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-1.0.0 +endif + +PROOT = .. # Edit the path below to point to the base of your c-ares package. ifndef LIBCARES_PATH -LIBCARES_PATH = ../ares +LIBCARES_PATH = $(PROOT)/ares endif -CC = gcc -CFLAGS = -g -O2 +CC = $(CROSSPREFIX)gcc +CFLAGS = -g -O2 -Wall +CFLAGS += -fno-strict-aliasing # comment LDFLAGS below to keep debug info -LDFLAGS = -s -RC = windres -RCFLAGS = --include-dir=../include -O COFF -i -RM = del /q /f 2>NUL -CP = copy +LDFLAGS = -s +AR = $(CROSSPREFIX)ar +RC = $(CROSSPREFIX)windres +RCFLAGS = --include-dir=$(PROOT)/include -O COFF +STRIP = $(CROSSPREFIX)strip -g # We may need these someday # PERL = perl # NROFF = nroff +# Set environment var ARCH to your architecture to override autodetection. +ifndef ARCH +ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64) +ARCH = w64 +else +ARCH = w32 +endif +endif + +ifeq ($(ARCH),w64) +CFLAGS += -m64 -D_AMD64_ +LDFLAGS += -m64 +RCFLAGS += -F pe-x86-64 +else +CFLAGS += -m32 +LDFLAGS += -m32 +RCFLAGS += -F pe-i386 +endif + +# Platform-dependent helper tool macros +ifeq ($(findstring /sh,$(SHELL)),/sh) +DEL = rm -f $1 +RMDIR = rm -fr $1 +MKDIR = mkdir -p $1 +COPY = -cp -afv $1 $2 +#COPYR = -cp -afr $1/* $2 +COPYR = -rsync -aC $1/* $2 +TOUCH = touch $1 +CAT = cat +ECHONL = echo "" +DL = ' +else +ifeq "$(OS)" "Windows_NT" +DEL = -del 2>NUL /q /f $(subst /,\,$1) +RMDIR = -rd 2>NUL /q /s $(subst /,\,$1) +else +DEL = -del 2>NUL $(subst /,\,$1) +RMDIR = -deltree 2>NUL /y $(subst /,\,$1) +endif +MKDIR = -md 2>NUL $(subst /,\,$1) +COPY = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2) +COPYR = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2) +TOUCH = copy 2>&1>NUL /b $(subst /,\,$1) +,, +CAT = type +ECHONL = $(ComSpec) /c echo. +endif + ######################################################## ## Nothing more to do below this line! -INCLUDES = -I. -I.. -I../include -I../lib -LINK = $(CC) $(LDFLAGS) -o $@ +ifeq ($(findstring -dyn,$(CFG)),-dyn) +DYN = 1 +endif +ifeq ($(findstring -ares,$(CFG)),-ares) +ARES = 1 +endif +ifeq ($(findstring -sync,$(CFG)),-sync) +SYNC = 1 +endif +ifeq ($(findstring -rtmp,$(CFG)),-rtmp) +RTMP = 1 +SSL = 1 +ZLIB = 1 +endif +ifeq ($(findstring -ssh2,$(CFG)),-ssh2) +SSH2 = 1 +SSL = 1 +ZLIB = 1 +endif +ifeq ($(findstring -ssl,$(CFG)),-ssl) +SSL = 1 +endif +ifeq ($(findstring -zlib,$(CFG)),-zlib) +ZLIB = 1 +endif +ifeq ($(findstring -idn,$(CFG)),-idn) +IDN = 1 +endif +ifeq ($(findstring -winidn,$(CFG)),-winidn) +WINIDN = 1 +endif +ifeq ($(findstring -sspi,$(CFG)),-sspi) +SSPI = 1 +endif +ifeq ($(findstring -ldaps,$(CFG)),-ldaps) +LDAPS = 1 +endif +ifeq ($(findstring -ipv6,$(CFG)),-ipv6) +IPV6 = 1 +endif +ifeq ($(findstring -metalink,$(CFG)),-metalink) +METALINK = 1 +endif +ifeq ($(findstring -winssl,$(CFG)),-winssl) +WINSSL = 1 +SSPI = 1 +endif +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +NGHTTP2 = 1 +endif + +INCLUDES = -I. -I../include -I../lib -curl_PROGRAMS = curl.exe ifdef DYN - curl_DEPENDENCIES = ../lib/libcurldll.a ../lib/libcurl.dll - curl_LDADD = -L../lib -lcurldll + curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll + curl_LDADD = -L$(PROOT)/lib -lcurldll else - curl_DEPENDENCIES = ../lib/libcurl.a - curl_LDADD = -L../lib -lcurl + curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a + curl_LDADD = -L$(PROOT)/lib -lcurl CFLAGS += -DCURL_STATICLIB + LDFLAGS += -static endif -ifdef ARES - ifndef DYN - curl_DEPENDENCIES += $(LIBCARES_PATH)/libcares.a +ifdef SYNC + CFLAGS += -DUSE_SYNC_DNS +else + ifdef ARES + ifndef DYN + curl_DEPENDENCIES += $(LIBCARES_PATH)/libcares.a + endif + CFLAGS += -DUSE_ARES -DCARES_STATICLIB + curl_LDADD += -L"$(LIBCARES_PATH)" -lcares endif - CFLAGS += -DUSE_ARES - curl_LDADD += -L$(LIBCARES_PATH) -lcares endif ifdef RTMP CFLAGS += -DUSE_LIBRTMP curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm endif +ifdef NGHTTP2 + CFLAGS += -DUSE_NGHTTP2 + curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2 +endif ifdef SSH2 CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H - curl_LDADD += -L$(LIBSSH2_PATH)/win32 -lssh2 + curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2 endif ifdef SSL - CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H - curl_LDADD += -L$(OPENSSL_PATH)/out -leay32 -lssl32 + ifndef OPENSSL_INCLUDE + ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc" + OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc + endif + ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include" + OPENSSL_INCLUDE = $(OPENSSL_PATH)/include + endif + endif + ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h" + $(error Invalid path to OpenSSL package: $(OPENSSL_PATH)) + endif + ifndef OPENSSL_LIBPATH + OPENSSL_LIBS = -lssl -lcrypto + ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out" + OPENSSL_LIBPATH = $(OPENSSL_PATH)/out + ifdef DYN + OPENSSL_LIBS = -lssl32 -leay32 + endif + endif + ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib" + OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib + endif + endif + ifndef DYN + OPENSSL_LIBS += -lgdi32 -lcrypt32 + endif + INCLUDES += -I"$(OPENSSL_INCLUDE)" + CFLAGS += -DUSE_OPENSSL + curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS) endif ifdef ZLIB INCLUDES += -I"$(ZLIB_PATH)" CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H - curl_LDADD += -L$(ZLIB_PATH) -lz + curl_LDADD += -L"$(ZLIB_PATH)" -lz endif ifdef IDN - INCLUDES += -I"$(LIBIDN_PATH)/include" CFLAGS += -DUSE_LIBIDN - curl_LDADD += -L$(LIBIDN_PATH)/lib -lidn + curl_LDADD += -L"$(LIBIDN_PATH)/lib" -lidn +else +ifdef WINIDN + CFLAGS += -DUSE_WIN32_IDN + curl_LDADD += -L"$(WINIDN_PATH)" -lnormaliz +endif +endif +ifdef METALINK + INCLUDES += -I"$(LIBMETALINK_PATH)/include" + CFLAGS += -DUSE_METALINK + curl_LDADD += -L"$(LIBMETALINK_PATH)/lib" -lmetalink + ifndef DYN + ifeq ($(findstring libexpat_metalink_parser.o,$(shell $(AR) t "$(LIBMETALINK_PATH)/lib/libmetalink.a")),libexpat_metalink_parser.o) + curl_LDADD += -L"$(LIBEXPAT_PATH)/lib" -lexpat + else + curl_LDADD += -L"$(LIBXML2_PATH)/lib" -lxml2 + endif + endif endif ifdef SSPI CFLAGS += -DUSE_WINDOWS_SSPI + ifdef WINSSL + CFLAGS += -DUSE_SCHANNEL + endif endif ifdef IPV6 - CFLAGS += -DENABLE_IPV6 + CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501 endif ifdef LDAPS CFLAGS += -DHAVE_LDAP_SSL @@ -124,49 +298,47 @@ curl_LDADD += -lwldap32 endif endif curl_LDADD += -lws2_32 -COMPILE = $(CC) $(INCLUDES) $(CFLAGS) # Makefile.inc provides the CSOURCES and HHEADERS defines include Makefile.inc +curl_PROGRAMS = curl.exe curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES))) +curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES)))) ifdef DYN -curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_ONES)))) curl_OBJECTS += $(curlx_OBJECTS) -vpath %.c ../lib +vpath %.c $(PROOT)/lib endif RESOURCE = curl.res -.SUFFIXES: .rc .res -all: curl.exe +all: $(curl_PROGRAMS) curl.exe: $(RESOURCE) $(curl_OBJECTS) $(curl_DEPENDENCIES) - -$(RM) $@ - $(LINK) $< $(curl_OBJECTS) $(curl_LDADD) + $(call DEL, $@) + $(CC) $(LDFLAGS) -o $@ $< $(curl_OBJECTS) $(curl_LDADD) # We don't have nroff normally under win32 -# hugehelp.c: ../README.curl ../curl.1 mkhelp.pl -# -$(RM) hugehelp.c -# $(NROFF) -man ../curl.1 | $(PERL) mkhelp.pl ../README.curl > hugehelp.c +# tool_hugehelp.c: $(PROOT)/docs/MANUAL $(PROOT)/docs/curl.1 mkhelp.pl +# @$(call DEL, tool_hugehelp.c) +# $(NROFF) -man $(PROOT)/docs/curl.1 | $(PERL) mkhelp.pl $(PROOT)/docs/MANUAL > tool_hugehelp.c -hugehelp.c: +tool_hugehelp.c: @echo Creating $@ - @$(CP) hugehelp.c.cvs $@ + @$(call COPY, $@.cvs, $@) -.c.o: - $(COMPILE) -c $< +%.o: %.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< -.rc.res: - $(RC) $(RCFLAGS) $< -o $@ +%.res: %.rc + $(RC) $(RCFLAGS) -i $< -o $@ clean: -ifeq "$(wildcard hugehelp.c.cvs)" "hugehelp.c.cvs" - -$(RM) hugehelp.c +ifeq "$(wildcard tool_hugehelp.c.cvs)" "tool_hugehelp.c.cvs" + @$(call DEL, tool_hugehelp.c) endif - -$(RM) $(curl_OBJECTS) $(RESOURCE) + @$(call DEL, $(curl_OBJECTS) $(curlx_OBJECTS) $(RESOURCE)) distclean vclean: clean - -$(RM) $(curl_PROGRAMS) - + @$(call DEL, $(curl_PROGRAMS)) diff --git a/src/Makefile.netware b/src/Makefile.netware index 3f5802c..5065cbf 100644 --- a/src/Makefile.netware +++ b/src/Makefile.netware @@ -14,17 +14,22 @@ endif # Edit the path below to point to the base of your Zlib sources. ifndef ZLIB_PATH -ZLIB_PATH = ../../zlib-1.2.5 +ZLIB_PATH = ../../zlib-1.2.8 endif # Edit the path below to point to the base of your OpenSSL package. ifndef OPENSSL_PATH -OPENSSL_PATH = ../../openssl-0.9.8o +OPENSSL_PATH = ../../openssl-1.0.2a endif # Edit the path below to point to the base of your LibSSH2 package. ifndef LIBSSH2_PATH -LIBSSH2_PATH = ../../libssh2-1.2.7 +LIBSSH2_PATH = ../../libssh2-1.5.0 +endif + +# Edit the path below to point to the base of your axTLS package. +ifndef AXTLS_PATH +AXTLS_PATH = ../../axTLS-1.2.7 endif # Edit the path below to point to the base of your libidn package. @@ -37,6 +42,31 @@ ifndef LIBRTMP_PATH LIBRTMP_PATH = ../../librtmp-2.3 endif +# Edit the path below to point to the base of your nghttp2 package. +ifndef NGHTTP2_PATH +NGHTTP2_PATH = ../../nghttp2-0.6.7 +endif + +# Edit the path below to point to the base of your fbopenssl package. +ifndef FBOPENSSL_PATH +FBOPENSSL_PATH = ../../fbopenssl-0.4 +endif + +# Edit the path below to point to the base of your libmetalink package. +ifndef LIBMETALINK_PATH +LIBMETALINK_PATH = ../../libmetalink-0.1.2 +endif + +# Edit the path below to point to the base of your libexpat package. +ifndef LIBEXPAT_PATH +LIBEXPAT_PATH = ../../expat-2.1.0 +endif + +# Edit the path below to point to the base of your libXML2 package. +ifndef LIBXML2_PATH +LIBXML2_PATH = ../../libxml2-2.8.0 +endif + # Edit the path below to point to the base of your c-ares package. ifndef LIBCARES_PATH LIBCARES_PATH = ../ares @@ -91,7 +121,7 @@ else endif PERL = perl # Here you can find a native Win32 binary of the original awk: -# http://www.gknw.net/development/prgtools/awk-20070501.zip +# http://www.gknw.net/development/prgtools/awk-20100523.zip AWK = awk CP = cp -afv MKDIR = mkdir @@ -135,7 +165,11 @@ else LD = nlmconv LDFLAGS = -T LIBEXT = a -CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing +CFLAGS += -m32 +CFLAGS += -fno-builtin -fno-strict-aliasing +ifeq ($(findstring gcc,$(CC)),gcc) +CFLAGS += -fpcc-struct-return +endif CFLAGS += -Wall # -pedantic ifeq ($(LIBARCH),LIBC) ifeq ($(POSIXFL),1) @@ -167,6 +201,47 @@ CURL_LIB = ../lib INCLUDES = -I$(CURL_INC) -I$(CURL_LIB) +ifeq ($(findstring -static,$(CFG)),-static) +LINK_STATIC = 1 +endif +ifeq ($(findstring -ares,$(CFG)),-ares) +WITH_ARES = 1 +endif +ifeq ($(findstring -rtmp,$(CFG)),-rtmp) +WITH_RTMP = 1 +WITH_SSL = 1 +WITH_ZLIB = 1 +endif +ifeq ($(findstring -ssh2,$(CFG)),-ssh2) +WITH_SSH2 = 1 +WITH_SSL = 1 +WITH_ZLIB = 1 +endif +ifeq ($(findstring -axtls,$(CFG)),-axtls) +WITH_AXTLS = 1 +WITH_SSL = +else +ifeq ($(findstring -ssl,$(CFG)),-ssl) +WITH_SSL = 1 +endif +endif +ifeq ($(findstring -zlib,$(CFG)),-zlib) +WITH_ZLIB = 1 +endif +ifeq ($(findstring -idn,$(CFG)),-idn) +WITH_IDN = 1 +endif +ifeq ($(findstring -metalink,$(CFG)),-metalink) +WITH_METALINK = 1 +WITH_SSL = 1 +endif +ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2) +WITH_NGHTTP2 = 1 +endif +ifeq ($(findstring -ipv6,$(CFG)),-ipv6) +ENABLE_IPV6 = 1 +endif + ifdef LINK_STATIC LDLIBS = $(CURL_LIB)/libcurl.$(LIBEXT) ifdef WITH_ARES @@ -177,7 +252,7 @@ else IMPORTS = @$(CURL_LIB)/libcurl.imp endif ifdef WITH_SSH2 - INCLUDES += -I$(LIBSSH2_PATH)/include + # INCLUDES += -I$(LIBSSH2_PATH)/include ifdef LINK_STATIC LDLIBS += $(LIBSSH2_PATH)/nw/libssh2.$(LIBEXT) else @@ -192,10 +267,20 @@ ifdef LINK_STATIC endif endif ifdef WITH_SSL - INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L) + # INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT) IMPORTS += GetProcessSwitchCount RunningProcess +else +ifdef WITH_AXTLS + # INCLUDES += -I$(AXTLS_PATH)/inc +ifdef LINK_STATIC + LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT) +else + MODULES += libaxtls.nlm + IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp +endif +endif endif ifdef WITH_ZLIB INCLUDES += -I$(ZLIB_PATH) @@ -210,6 +295,30 @@ ifdef WITH_IDN # INCLUDES += -I$(LIBIDN_PATH)/include LDLIBS += $(LIBIDN_PATH)/lib/libidn.$(LIBEXT) endif +ifdef WITH_NGHTTP2 + INCLUDES += -I$(NGHTTP2_PATH)/include + LDLIBS += $(NGHTTP2_PATH)/lib/libnghttp2.$(LIBEXT) +endif +ifdef WITH_METALINK + CFLAGS += -DUSE_METALINK + INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L) + INCLUDES += -I$(LIBMETALINK_PATH)/include + LDLIBS += $(LIBMETALINK_PATH)/lib/libmetalink.$(LIBEXT) +ifdef WITH_LIBEXPAT + ifeq ($(LIBARCH),LIBC) + IMPORTS += @$(LIBEXPAT_PATH)/imports/expatlbc.imp + MODULES += expatlbc + else + IMPORTS += @$(LIBEXPAT_PATH)/imports/expatlib.imp + MODULES += expatlib + endif +else +ifdef WITH_LIBXML2 + IMPORTS += @$(LIBXML2_PATH)/lib/libxml2.imp + MODULES += libxml2 +endif +endif +endif ifeq ($(LIBARCH),LIBC) INCLUDES += -I$(NDK_LIBC)/include @@ -248,7 +357,7 @@ endif # Makefile.inc provides the CSOURCES and HHEADERS defines include Makefile.inc -OBJX := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(strip $(CURLX_ONES)))) +OBJX := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(strip $(CURLX_CFILES)))) OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CURL_CFILES))) ifndef LINK_STATIC OBJS += $(OBJX) @@ -258,7 +367,7 @@ vpath %.c $(CURL_LIB) all: prebuild $(TARGET).nlm -prebuild: $(OBJDIR) $(OBJDIR)/version.inc curl_config.h +prebuild: $(OBJDIR) $(OBJDIR)/version.inc $(OBJDIR)/%.o: %.c # @echo Compiling $< @@ -274,10 +383,9 @@ install: $(INSTDIR) all @$(CP) $(TARGET).nlm $(INSTDIR) clean: -ifeq "$(wildcard hugehelp.c.cvs)" "hugehelp.c.cvs" - -$(RM) hugehelp.c +ifeq "$(wildcard tool_hugehelp.c.cvs)" "tool_hugehelp.c.cvs" + -$(RM) tool_hugehelp.c endif - -$(RM) curl_config.h -$(RM) -r $(OBJDIR) distclean vclean: clean @@ -384,203 +492,9 @@ endif @echo $(DL)output $(TARGET).nlm$(DL) >> $@ endif -curl_config.h: Makefile.netware - @echo Creating $@ - @echo $(DL)/* $@ for NetWare target.$(DL) > $@ - @echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@ - @echo $(DL)** All your changes will be lost!!$(DL) >> $@ - @echo $(DL)*/$(DL) >> $@ - @echo $(DL)#ifndef NETWARE$(DL) >> $@ - @echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@ - @echo $(DL)#endif$(DL) >> $@ - @echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@ - @echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@ -ifeq ($(LIBARCH),CLIB) - @echo $(DL)#define OS "i586-pc-clib-NetWare"$(DL) >> $@ - @echo $(DL)#define NETDB_USE_INTERNET 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRICMP 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRNICMP 1$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG2 char *$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG3 int$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_RETV int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG2 char$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG3 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG5 struct sockaddr$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG6 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_RETV int$(DL) >> $@ - @echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG2 char *$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@ - @echo $(DL)#define pressanykey PressAnyKeyToContinue$(DL) >> $@ -else - @echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@ - @echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@ - @echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@ - @echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@ - @echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRTOLL 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG2 void *$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG3 size_t$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define RECV_TYPE_RETV ssize_t$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG2 void$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG3 size_t$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG5 struct sockaddr$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG6 size_t$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_RETV ssize_t$(DL) >> $@ - @echo $(DL)#define RECVFROM_TYPE_ARG2_IS_VOID 1$(DL) >> $@ - @echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG2 void *$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG3 size_t$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ - @echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@ - @echo $(DL)#define SIZEOF_OFF_T 8$(DL) >> $@ - @echo $(DL)#define _LARGEFILE 1$(DL) >> $@ -ifdef ENABLE_IPV6 - @echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@ - @echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ - @echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@ - @echo $(DL)#define HAVE_FREEADDRINFO 1$(DL) >> $@ - @echo $(DL)#define HAVE_GETADDRINFO 1$(DL) >> $@ - @echo $(DL)#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@ - @echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ -endif -endif - @echo $(DL)#define USE_MANUAL 1$(DL) >> $@ - @echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@ - @echo $(DL)#define HAVE_GETHOSTBYNAME 1$(DL) >> $@ - @echo $(DL)#define HAVE_GETPROTOBYNAME 1$(DL) >> $@ - @echo $(DL)#define HAVE_GMTIME_R 1$(DL) >> $@ - @echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@ - @echo $(DL)#define HAVE_IOCTL 1$(DL) >> $@ - @echo $(DL)#define HAVE_IOCTL_FIONBIO 1$(DL) >> $@ - @echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LL 1$(DL) >> $@ - @echo $(DL)#define HAVE_LOCALE_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LOCALTIME_R 1$(DL) >> $@ - @echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_RECV 1$(DL) >> $@ - @echo $(DL)#define HAVE_RECVFROM 1$(DL) >> $@ - @echo $(DL)#define HAVE_SELECT 1$(DL) >> $@ - @echo $(DL)#define HAVE_SEND 1$(DL) >> $@ - @echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SETLOCALE 1$(DL) >> $@ - @echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@ - @echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@ - @echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@ - @echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@ - @echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ - @echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_UTIME 1$(DL) >> $@ - @echo $(DL)#define HAVE_UTIME_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_WRITEV 1$(DL) >> $@ - @echo $(DL)#define RETSIGTYPE void$(DL) >> $@ - @echo $(DL)#define SIZEOF_INT 4$(DL) >> $@ - @echo $(DL)#define SIZEOF_SHORT 2$(DL) >> $@ - @echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ - @echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ - @echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ -ifdef DISABLE_LDAP - @echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ -else - @echo $(DL)#define CURL_HAS_NOVELL_LDAPSDK 1$(DL) >> $@ -ifndef DISABLE_LDAPS - @echo $(DL)#define HAVE_LDAP_SSL 1$(DL) >> $@ -endif - @echo $(DL)#define HAVE_LDAP_SSL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LDAP_URL_PARSE 1$(DL) >> $@ -endif -ifdef NW_WINSOCK - @echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ -else - @echo $(DL)#define USE_BSD_SOCKETS 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_TYPES_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_SOCKET_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@ -endif -ifdef WITH_ARES - @echo $(DL)#define USE_ARES 1$(DL) >> $@ -endif -ifdef WITH_ZLIB - @echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ -endif -ifdef WITH_SSL - @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ - @echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_PEM_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_ERR_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_CRYPTO_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_OPENSSL_ENGINE_H 1$(DL) >> $@ - @echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@ - @echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@ - @echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@ -endif -ifdef WITH_SSH2 - @echo $(DL)#define USE_LIBSSH2 1$(DL) >> $@ - @echo $(DL)#define HAVE_LIBSSH2_H 1$(DL) >> $@ -endif -ifdef WITH_IDN - @echo $(DL)#define HAVE_LIBIDN 1$(DL) >> $@ - @echo $(DL)#define HAVE_TLD_H 1$(DL) >> $@ -endif -ifdef WITH_RTMP - @echo $(DL)#define USE_LIBRTMP 1$(DL) >> $@ -endif - @echo $(DL)#ifdef __GNUC__$(DL) >> $@ - @echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@ - @echo $(DL)#else$(DL) >> $@ - @echo $(DL)#define HAVE_VARIADIC_MACROS_C99 1$(DL) >> $@ - @echo $(DL)#endif$(DL) >> $@ -ifdef CABUNDLE - @echo $(DL)#define CURL_CA_BUNDLE "$(CABUNDLE)"$(DL) >> $@ -else - @echo $(DL)#define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE")$(DL) >> $@ -endif - -hugehelp.c: +tool_hugehelp.c: @echo Creating $@ - @$(CP) hugehelp.c.cvs $@ + @$(CP) tool_hugehelp.c.cvs $@ $(LIBCARES_PATH)/libcares.$(LIBEXT): $(MAKE) -C $(LIBCARES_PATH) -f Makefile.netware lib diff --git a/src/Makefile.riscos b/src/Makefile.riscos deleted file mode 100644 index 35a194f..0000000 --- a/src/Makefile.riscos +++ /dev/null @@ -1,64 +0,0 @@ -# Makefile for project cURL -# Generated on Sun,13 Jan 2002.17:11:10 by EasyGCC (0.1.3 [beta 2] (3 Jan 2002)) -# Manually updated -# Contact: easygcc@melotech.co.uk - -# Project objects: -objs = o.hugehelp o.main o.urlglob o.writeout o.writeenv o.rawstr o.nonblock - - -# Compile options: -linkopts = ../lib/libcurl openldap:libraries/libldap/libldap -o curl -compileropts = -mpoke-function-name -IUtilLib: -mthrowback - -# Project target: -curl: $(objs) - gcc $(linkopts) $(objs) - -# Static dependancies: -o.hugehelp: c.hugehelp - gcc $(compileropts) -c -o hugehelp.o c.hugehelp - -o.main: c.main - gcc $(compileropts) -c -o main.o c.main - -o.os-specific: c.os-specific - gcc $(compileropts) -c -o os-specific.o c.os-specific - -o.urlglob: c.urlglob - gcc $(compileropts) -c -o urlglob.o c.urlglob - -o.writeout: c.writeout - gcc $(compileropts) -c -o writeout.o c.writeout - -o.writeenv: c.writeenv - gcc $(compileropts) -c -o writeenv.o c.writeenv - -o.rawstr: ../lib/c.rawstr - gcc $(compileropts) -c -o rawstr.o ../lib/c.rawstr - -o.nonblock: ../lib/c.nonblock - gcc $(compileropts) -c -o nonblock.o ../lib/c.nonblock - -# Dynamic dependancies: -o.hugehelp: c.hugehelp - -o.main: c.main -o.main: h.setup -o.main: h.os-specific -o.main: h.urlglob -o.main: h.writeout -o.main: h.version - -o.os-specific: c.os-specific -o.os-specific: h.setup -o.os-specific: h.os-specific - -o.urlglob: c.urlglob -o.urlglob: h.setup -o.urlglob: h.os-specific -o.urlglob: h.urlglob - -o.writeout: c.writeout -o.writeout: h.writeout - diff --git a/src/Makefile.vc10 b/src/Makefile.vc10 deleted file mode 100644 index 24d1b93..0000000 --- a/src/Makefile.vc10 +++ /dev/null @@ -1,299 +0,0 @@ -#############################################################
-#
-## Makefile for building curl.exe with MSVC10
-## Use: nmake -f makefile.vc10 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc10 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-## Comments to: Troy Engel <tengel@sonic.net>
-## Updated by: Craig Davison <cd@securityfocus.com>
-## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-0.9.8o
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.5
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC10 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_SSLEAY
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib advapi32.lib
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC10
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- hugehelpr.obj \
- writeoutr.obj \
- urlglobr.obj \
- getpassr.obj \
- homedirr.obj \
- curlutilr.obj \
- os-specificr.obj \
- nonblockr.obj \
- rawstrr.obj \
- strtoofftr.obj \
- mainr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- hugehelpd.obj \
- writeoutd.obj \
- urlglobd.obj \
- getpassd.obj \
- homedird.obj \
- curlutild.obj \
- os-specificd.obj \
- nonblockd.obj \
- rawstrd.obj \
- strtoofftd.obj \
- maind.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib
-LINKLIBS_DEBUG = libcurld.lib
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = libcurl_imp.lib
-LINKLIBS_DEBUG = libcurld_imp.lib
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-
-LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-hugehelpr.obj: hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutr.obj: writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" writeout.c
-urlglobr.obj: urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" urlglob.c
-getpassr.obj: getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" getpass.c
-homedirr.obj: homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" homedir.c
-curlutilr.obj: curlutil.c
- $(CCR) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificr.obj: os-specific.c
- $(CCR) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrr.obj: ../lib/rawstr.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-mainr.obj: main.c
- $(CCR) $(CFLAGS) /Fo"$@" main.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-hugehelpd.obj: hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutd.obj: writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" writeout.c
-urlglobd.obj: urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" urlglob.c
-getpassd.obj: getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" getpass.c
-homedird.obj: homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" homedir.c
-curlutild.obj: curlutil.c
- $(CCD) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificd.obj: os-specific.c
- $(CCD) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrd.obj: ../lib/rawstr.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-maind.obj: main.c
- $(CCD) $(CFLAGS) /Fo"$@" main.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc6 b/src/Makefile.vc6 index 4a3480d..eec89c2 100644 --- a/src/Makefile.vc6 +++ b/src/Makefile.vc6 @@ -1,3 +1,30 @@ +#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1999 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+# All files in the Makefile.vc* series are generated automatically from the
+# one made for MSVC version 6. Alas, if you want to do changes to any of the
+# files and send back to the project, edit the version six, make your diff and
+# mail curl-users.
+
#############################################################
#
## Makefile for building curl.exe with MSVC6
@@ -6,20 +33,34 @@ ## "nmake -f makefile.vc6 CFG=release-ssl" statically links OpenSSL
## into curl.exe producing a standalone SSL-enabled executable.
##
-## Comments to: Troy Engel <tengel@sonic.net>
-## Updated by: Craig Davison <cd@securityfocus.com>
-## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
#
#############################################################
PROGRAM_NAME = curl.exe
+# -------------------------------------------
+# Verify that current subdir is curl's 'src'
+# -------------------------------------------
+
+!IF ! EXIST(.\tool_main.c)
+! MESSAGE Can not process this makefile from outside of curl's 'src' subdirectory.
+! MESSAGE Change to curl's 'src' subdirectory, and try again.
+! ERROR See previous message.
+!ENDIF
+
+# ------------------------------------------------
+# Makefile.msvc.names provides libcurl file names
+# ------------------------------------------------
+
+!INCLUDE ..\winbuild\Makefile.msvc.names
+
+
!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-0.9.8o
+OPENSSL_PATH = ../../openssl-1.0.2a
!ENDIF
!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.5
+ZLIB_PATH = ../../zlib-1.2.8
!ENDIF
!IFNDEF MACHINE
@@ -36,27 +77,36 @@ MACHINE = X86 # If, for some reason the Windows SDK is installed but not installed
# in the default location, you can specify WINDOWS_SDK_PATH.
# It can be downloaded from:
-# http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
+# https://msdn.microsoft.com/windows/bb980924.aspx
# WINDOWS_SSPI = 1
!IFDEF WINDOWS_SSPI
!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
+WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
!ENDIF
!ENDIF
########################################################
## Nothing more to do below this line!
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-SSL_CFLAGS = /DUSE_SSLEAY
+ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
+ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
+ZLIB_LIBS = zlib.lib
+ZLIB_IMP_LIBS = zdll.lib
+
+SSL_CFLAGS = /DUSE_OPENSSL
SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib advapi32.lib
+SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib
+WINLIBS = ws2_32.lib wldap32.lib advapi32.lib
+
+WINSSL_CFLAGS = /DUSE_SCHANNEL
+#WINSSL_LIBS = gdi32.lib user32.lib
+
+!IFDEF USE_IDN
+WINLIBS = $(WINLIBS) normaliz.lib
+!ENDIF
# Runtime library configuration
RTLIB = /MD
@@ -77,7 +127,7 @@ CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /GZ LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
RCD = rc.exe /dDEBUGBUILD=1
-CFLAGS = /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c
+CFLAGS = /I../lib /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /D_BIND_TO_CURRENT_VCLIBS_VERSION=1
LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
RESFLAGS = /i../include
@@ -91,46 +141,108 @@ CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include !ENDIF
RELEASE_OBJS= \
- hugehelpr.obj \
- writeoutr.obj \
- urlglobr.obj \
- getpassr.obj \
- homedirr.obj \
- curlutilr.obj \
- os-specificr.obj \
nonblockr.obj \
rawstrr.obj \
strtoofftr.obj \
- mainr.obj \
+ warnless.obj \
+ tool_binmoder.obj \
+ tool_bnamer.obj \
+ tool_cb_dbgr.obj \
+ tool_cb_hdrr.obj \
+ tool_cb_prgr.obj \
+ tool_cb_rear.obj \
+ tool_cb_seer.obj \
+ tool_cb_wrtr.obj \
+ tool_cfgabler.obj \
+ tool_convertr.obj \
+ tool_dirhier.obj \
+ tool_doswinr.obj \
+ tool_easysrcr.obj \
+ tool_formparser.obj \
+ tool_getparamr.obj \
+ tool_getpassr.obj \
+ tool_helpr.obj \
+ tool_helpersr.obj \
+ tool_homedirr.obj \
+ tool_hugehelpr.obj \
+ tool_libinfor.obj \
+ tool_mainr.obj \
+ tool_metalinkr.obj \
+ tool_mfilesr.obj \
+ tool_msgsr.obj \
+ tool_operater.obj \
+ tool_operhlpr.obj \
+ tool_panykeyr.obj \
+ tool_paramhlpr.obj \
+ tool_parsecfgr.obj \
+ tool_setoptr.obj \
+ tool_sleepr.obj \
+ tool_urlglobr.obj \
+ tool_utilr.obj \
+ tool_vmsr.obj \
+ tool_writeenvr.obj \
+ tool_writeoutr.obj \
+ tool_xattrr.obj \
curlr.res
DEBUG_OBJS= \
- hugehelpd.obj \
- writeoutd.obj \
- urlglobd.obj \
- getpassd.obj \
- homedird.obj \
- curlutild.obj \
- os-specificd.obj \
nonblockd.obj \
rawstrd.obj \
strtoofftd.obj \
- maind.obj \
+ warnlessd.obj \
+ tool_binmoded.obj \
+ tool_bnamed.obj \
+ tool_cb_dbgd.obj \
+ tool_cb_hdrd.obj \
+ tool_cb_prgd.obj \
+ tool_cb_read.obj \
+ tool_cb_seed.obj \
+ tool_cb_wrtd.obj \
+ tool_cfgabled.obj \
+ tool_convertd.obj \
+ tool_dirhied.obj \
+ tool_doswind.obj \
+ tool_easysrcd.obj \
+ tool_formparsed.obj \
+ tool_getparamd.obj \
+ tool_getpassd.obj \
+ tool_helpd.obj \
+ tool_helpersd.obj \
+ tool_homedird.obj \
+ tool_hugehelpd.obj \
+ tool_libinfod.obj \
+ tool_maind.obj \
+ tool_metalinkd.obj \
+ tool_mfilesd.obj \
+ tool_msgsd.obj \
+ tool_operated.obj \
+ tool_operhlpd.obj \
+ tool_panykeyd.obj \
+ tool_paramhlpd.obj \
+ tool_parsecfgd.obj \
+ tool_setoptd.obj \
+ tool_sleepd.obj \
+ tool_urlglobd.obj \
+ tool_utild.obj \
+ tool_vmsd.obj \
+ tool_writeenvd.obj \
+ tool_writeoutd.obj \
+ tool_xattrd.obj \
curld.res
#################################################
# If CFG not specified, use static libs
CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib
-LINKLIBS_DEBUG = libcurld.lib
+LINKLIBS = $(LIBCURL_STA_LIB_REL)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG)
#################################################
# release dynamic library
!IF "$(CFG)" == "release-dll"
-LINKLIBS = libcurl_imp.lib
-LINKLIBS_DEBUG = libcurld_imp.lib
+LINKLIBS = $(LIBCURL_IMP_LIB_REL)
+LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG)
!ENDIF
#################################################
@@ -138,8 +250,8 @@ LINKLIBS_DEBUG = libcurld_imp.lib !IF "$(CFG)" == "release-zlib"
CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_LIBS)
LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
@@ -148,8 +260,8 @@ LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS) !IF "$(CFG)" == "release-ssl"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
!ENDIF
@@ -158,8 +270,8 @@ LFLAGS = $(LFLAGS) $(SSL_LFLAGS) !IF "$(CFG)" == "release-dll-ssl-dll"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS)
+LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS)
LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
!ENDIF
@@ -168,18 +280,28 @@ LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) !IF "$(CFG)" == "release-ssl-zlib"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_LIBS)
LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
#################################################
+# release static library with winssl and zlib
+
+!IF "$(CFG)" == "release-winssl-zlib"
+CFLAGS = $(CFLAGS) $(WINSSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(WINSSL_LIBS) $(ZLIB_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(WINSSL_LIBS) $(ZLIB_LIBS)
+LFLAGS = $(LFLAGS) $(WINSSL_LFLAGS) $(ZLIB_LFLAGS)
+!ENDIF
+
+#################################################
# release static library with dynamic ssl
!IF "$(CFG)" == "release-ssl-dll"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS)
LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
!ENDIF
@@ -188,8 +310,8 @@ LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) !IF "$(CFG)" == "release-zlib-dll"
CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_IMP_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(ZLIB_IMP_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(ZLIB_IMP_LIBS)
LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
@@ -198,8 +320,8 @@ LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS) !IF "$(CFG)" == "release-dll-zlib-dll"
CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(ZLIB_IMP_LIBS)
+LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(ZLIB_IMP_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(ZLIB_IMP_LIBS)
LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
@@ -208,8 +330,8 @@ LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS) !IF "$(CFG)" == "release-ssl-dll-zlib-dll"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
+LINKLIBS = $(LIBCURL_STA_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_STA_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
@@ -218,14 +340,13 @@ LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS) !IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
+LINKLIBS = $(LIBCURL_IMP_LIB_REL) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
+LINKLIBS_DEBUG = $(LIBCURL_IMP_LIB_DBG) $(SSL_LIBS) $(ZLIB_IMP_LIBS)
LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
!ENDIF
-
-LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib
+LINKLIBS = $(LINKLIBS) $(WINLIBS)
+LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) $(WINLIBS)
all : release
@@ -238,54 +359,178 @@ debug: $(DEBUG_OBJS) $(MANIFESTTOOL)
## Release
-hugehelpr.obj: hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutr.obj: writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" writeout.c
-urlglobr.obj: urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" urlglob.c
-getpassr.obj: getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" getpass.c
-homedirr.obj: homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" homedir.c
-curlutilr.obj: curlutil.c
- $(CCR) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificr.obj: os-specific.c
- $(CCR) $(CFLAGS) /Fo"$@" os-specific.c
nonblockr.obj: ../lib/nonblock.c
$(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
rawstrr.obj: ../lib/rawstr.c
$(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
strtoofftr.obj: ../lib/strtoofft.c
$(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-mainr.obj: main.c
- $(CCR) $(CFLAGS) /Fo"$@" main.c
+warnless.obj: ../lib/warnless.c
+ $(CCR) $(CFLAGS) /Fo"$@" ../lib/warnless.c
+tool_binmoder.obj: tool_binmode.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_binmode.c
+tool_bnamer.obj: tool_bname.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_bname.c
+tool_cb_dbgr.obj: tool_cb_dbg.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
+tool_cb_hdrr.obj: tool_cb_hdr.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
+tool_cb_prgr.obj: tool_cb_prg.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_prg.c
+tool_cb_rear.obj: tool_cb_rea.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_rea.c
+tool_cb_seer.obj: tool_cb_see.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_see.c
+tool_cb_wrtr.obj: tool_cb_wrt.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
+tool_cfgabler.obj: tool_cfgable.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_cfgable.c
+tool_convertr.obj: tool_convert.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_convert.c
+tool_dirhier.obj: tool_dirhie.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_dirhie.c
+tool_doswinr.obj: tool_doswin.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c
+tool_easysrcr.obj: tool_easysrc.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c
+tool_formparser.obj: tool_formparse.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_formparse.c
+tool_getparamr.obj: tool_getparam.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_getparam.c
+tool_getpassr.obj: tool_getpass.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_getpass.c
+tool_helpr.obj: tool_help.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_help.c
+tool_helpersr.obj: tool_helpers.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_helpers.c
+tool_homedirr.obj: tool_homedir.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_homedir.c
+tool_hugehelpr.obj: tool_hugehelp.c
+ $(CCR) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
+tool_libinfor.obj: tool_libinfo.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c
+tool_mainr.obj: tool_main.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_main.c
+tool_metalinkr.obj: tool_metalink.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_metalink.c
+tool_mfilesr.obj: tool_mfiles.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c
+tool_msgsr.obj: tool_msgs.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_msgs.c
+tool_operater.obj: tool_operate.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_operate.c
+tool_operhlpr.obj: tool_operhlp.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_operhlp.c
+tool_panykeyr.obj: tool_panykey.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_panykey.c
+tool_paramhlpr.obj: tool_paramhlp.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_paramhlp.c
+tool_parsecfgr.obj: tool_parsecfg.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_parsecfg.c
+tool_setoptr.obj: tool_setopt.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_setopt.c
+tool_sleepr.obj: tool_sleep.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_sleep.c
+tool_urlglobr.obj: tool_urlglob.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_urlglob.c
+tool_utilr.obj: tool_util.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_util.c
+tool_vmsr.obj: tool_vms.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_vms.c
+tool_writeenvr.obj: tool_writeenv.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_writeenv.c
+tool_writeoutr.obj: tool_writeout.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_writeout.c
+tool_xattrr.obj: tool_xattr.c
+ $(CCR) $(CFLAGS) /Fo"$@" tool_xattr.c
curlr.res : curl.rc
$(RCR) $(RESFLAGS) /Fo"$@" curl.rc
## Debug
-hugehelpd.obj: hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutd.obj: writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" writeout.c
-urlglobd.obj: urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" urlglob.c
-getpassd.obj: getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" getpass.c
-homedird.obj: homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" homedir.c
-curlutild.obj: curlutil.c
- $(CCD) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificd.obj: os-specific.c
- $(CCD) $(CFLAGS) /Fo"$@" os-specific.c
nonblockd.obj: ../lib/nonblock.c
$(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
rawstrd.obj: ../lib/rawstr.c
$(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
strtoofftd.obj: ../lib/strtoofft.c
$(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-maind.obj: main.c
- $(CCD) $(CFLAGS) /Fo"$@" main.c
+warnlessd.obj: ../lib/warnless.c
+ $(CCD) $(CFLAGS) /Fo"$@" ../lib/warnless.c
+tool_binmoded.obj: tool_binmode.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_binmode.c
+tool_bnamed.obj: tool_bname.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_bname.c
+tool_cb_dbgd.obj: tool_cb_dbg.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_dbg.c
+tool_cb_hdrd.obj: tool_cb_hdr.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_hdr.c
+tool_cb_prgd.obj: tool_cb_prg.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_prg.c
+tool_cb_read.obj: tool_cb_rea.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_rea.c
+tool_cb_seed.obj: tool_cb_see.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_see.c
+tool_cb_wrtd.obj: tool_cb_wrt.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cb_wrt.c
+tool_cfgabled.obj: tool_cfgable.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_cfgable.c
+tool_convertd.obj: tool_convert.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_convert.c
+tool_dirhied.obj: tool_dirhie.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_dirhie.c
+tool_doswind.obj: tool_doswin.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c
+tool_easysrcd.obj: tool_easysrc.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c
+tool_formparsed.obj: tool_formparse.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_formparse.c
+tool_getparamd.obj: tool_getparam.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_getparam.c
+tool_getpassd.obj: tool_getpass.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_getpass.c
+tool_helpd.obj: tool_help.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_help.c
+tool_helpersd.obj: tool_helpers.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_helpers.c
+tool_homedird.obj: tool_homedir.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_homedir.c
+tool_hugehelpd.obj: tool_hugehelp.c
+ $(CCD) $(CFLAGS) /Zm200 /Fo"$@" tool_hugehelp.c
+tool_libinfod.obj: tool_libinfo.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c
+tool_maind.obj: tool_main.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_main.c
+tool_metalinkd.obj: tool_metalink.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_metalink.c
+tool_mfilesd.obj: tool_mfiles.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c
+tool_msgsd.obj: tool_msgs.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_msgs.c
+tool_operated.obj: tool_operate.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_operate.c
+tool_operhlpd.obj: tool_operhlp.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_operhlp.c
+tool_panykeyd.obj: tool_panykey.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_panykey.c
+tool_paramhlpd.obj: tool_paramhlp.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_paramhlp.c
+tool_parsecfgd.obj: tool_parsecfg.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_parsecfg.c
+tool_setoptd.obj: tool_setopt.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_setopt.c
+tool_sleepd.obj: tool_sleep.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_sleep.c
+tool_urlglobd.obj: tool_urlglob.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_urlglob.c
+tool_utild.obj: tool_util.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_util.c
+tool_vmsd.obj: tool_vms.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_vms.c
+tool_writeenvd.obj: tool_writeenv.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_writeenv.c
+tool_writeoutd.obj: tool_writeout.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_writeout.c
+tool_xattrd.obj: tool_xattr.c
+ $(CCD) $(CFLAGS) /Fo"$@" tool_xattr.c
curld.res : curl.rc
$(RCD) $(RESFLAGS) /Fo"$@" curl.rc
diff --git a/src/Makefile.vc8 b/src/Makefile.vc8 deleted file mode 100644 index ffcb05f..0000000 --- a/src/Makefile.vc8 +++ /dev/null @@ -1,299 +0,0 @@ -#############################################################
-#
-## Makefile for building curl.exe with MSVC8
-## Use: nmake -f makefile.vc6 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc6 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-## Comments to: Troy Engel <tengel@sonic.net>
-## Updated by: Craig Davison <cd@securityfocus.com>
-## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-0.9.8o
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.5
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC8 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_SSLEAY
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib advapi32.lib
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC8
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- hugehelpr.obj \
- writeoutr.obj \
- urlglobr.obj \
- getpassr.obj \
- homedirr.obj \
- curlutilr.obj \
- os-specificr.obj \
- nonblockr.obj \
- rawstrr.obj \
- strtoofftr.obj \
- mainr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- hugehelpd.obj \
- writeoutd.obj \
- urlglobd.obj \
- getpassd.obj \
- homedird.obj \
- curlutild.obj \
- os-specificd.obj \
- nonblockd.obj \
- rawstrd.obj \
- strtoofftd.obj \
- maind.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib
-LINKLIBS_DEBUG = libcurld.lib
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = libcurl_imp.lib
-LINKLIBS_DEBUG = libcurld_imp.lib
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-
-LINKLIBS = $(LINKLIBS) ws2_32.lib bufferoverflowu.lib wldap32.lib
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib bufferoverflowu.lib wldap32.lib
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-hugehelpr.obj: hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutr.obj: writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" writeout.c
-urlglobr.obj: urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" urlglob.c
-getpassr.obj: getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" getpass.c
-homedirr.obj: homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" homedir.c
-curlutilr.obj: curlutil.c
- $(CCR) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificr.obj: os-specific.c
- $(CCR) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrr.obj: ../lib/rawstr.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-mainr.obj: main.c
- $(CCR) $(CFLAGS) /Fo"$@" main.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-hugehelpd.obj: hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutd.obj: writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" writeout.c
-urlglobd.obj: urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" urlglob.c
-getpassd.obj: getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" getpass.c
-homedird.obj: homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" homedir.c
-curlutild.obj: curlutil.c
- $(CCD) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificd.obj: os-specific.c
- $(CCD) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrd.obj: ../lib/rawstr.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-maind.obj: main.c
- $(CCD) $(CFLAGS) /Fo"$@" main.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/Makefile.vc9 b/src/Makefile.vc9 deleted file mode 100644 index 5dd44f8..0000000 --- a/src/Makefile.vc9 +++ /dev/null @@ -1,299 +0,0 @@ -#############################################################
-#
-## Makefile for building curl.exe with MSVC9
-## Use: nmake -f makefile.vc9 [release | debug] [CFG=release-ssl]
-## (default is release)
-## "nmake -f makefile.vc9 CFG=release-ssl" statically links OpenSSL
-## into curl.exe producing a standalone SSL-enabled executable.
-##
-## Comments to: Troy Engel <tengel@sonic.net>
-## Updated by: Craig Davison <cd@securityfocus.com>
-## release-ssl added by Miklos Nemeth <mnemeth@kfkisystems.com>
-#
-#############################################################
-
-PROGRAM_NAME = curl.exe
-
-!IFNDEF OPENSSL_PATH
-OPENSSL_PATH = ../../openssl-0.9.8o
-!ENDIF
-
-!IFNDEF ZLIB_PATH
-ZLIB_PATH = ../../zlib-1.2.5
-!ENDIF
-
-!IFNDEF MACHINE
-MACHINE = X86
-!ENDIF
-
-# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
-# without an openssl installation and offers the ability to authenticate
-# using the "current logged in user". Since at least with MSVC9 the sspi.h
-# header is broken it is either required to install the Windows SDK,
-# or to fix sspi.h with adding this define at the beginning of sspi.h:
-# #define FreeCredentialHandle FreeCredentialsHandle
-#
-# If, for some reason the Windows SDK is installed but not installed
-# in the default location, you can specify WINDOWS_SDK_PATH.
-# It can be downloaded from:
-# http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
-# WINDOWS_SSPI = 1
-
-!IFDEF WINDOWS_SSPI
-!IFNDEF WINDOWS_SDK_PATH
-WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK"
-!ENDIF
-!ENDIF
-
-########################################################
-## Nothing more to do below this line!
-ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
-ZLIB_LFLAGS = "/LIBPATH:$(ZLIB_PATH)"
-ZLIB_LIBS = zlib.lib
-ZLIB_IMP_LIBS = zdll.lib
-
-SSL_CFLAGS = /DUSE_SSLEAY
-SSL_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32"
-SSL_IMP_LFLAGS = /LIBPATH:"$(OPENSSL_PATH)/out32dll"
-SSL_LIBS = libeay32.lib ssleay32.lib gdi32.lib user32.lib advapi32.lib
-
-# Runtime library configuration
-RTLIB = /MD
-RTLIBD = /MDd
-
-!IF "$(RTLIBCFG)" == "static"
-RTLIB = /MT
-RTLIBD = /MTd
-!ENDIF
-
-## Release
-CCR = cl.exe $(RTLIB) /O2 /DNDEBUG
-LINKR = link.exe /incremental:no /libpath:"../lib"
-RCR = rc.exe /dDEBUGBUILD=0
-
-## Debug
-CCD = cl.exe $(RTLIBD) /Gm /ZI /Od /D_DEBUG /RTC1
-LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
-RCD = rc.exe /dDEBUGBUILD=1
-
-CFLAGS = /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
-LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
-RESFLAGS = /i../include
-
-# This manifest thing is for VC8, enabled by the maketgz script that
-# builds the VC8 version of this makefile. Left commented out in the VC9
-# version!
-#MANIFESTTOOL = mt -manifest $(PROGRAM_NAME).manifest -outputresource:$(PROGRAM_NAME);1
-
-!IFDEF WINDOWS_SSPI
-CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include
-!ENDIF
-
-RELEASE_OBJS= \
- hugehelpr.obj \
- writeoutr.obj \
- urlglobr.obj \
- getpassr.obj \
- homedirr.obj \
- curlutilr.obj \
- os-specificr.obj \
- nonblockr.obj \
- rawstrr.obj \
- strtoofftr.obj \
- mainr.obj \
- curlr.res
-
-DEBUG_OBJS= \
- hugehelpd.obj \
- writeoutd.obj \
- urlglobd.obj \
- getpassd.obj \
- homedird.obj \
- curlutild.obj \
- os-specificd.obj \
- nonblockd.obj \
- rawstrd.obj \
- strtoofftd.obj \
- maind.obj \
- curld.res
-
-#################################################
-# If CFG not specified, use static libs
-
-CFLAGS = $(CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib
-LINKLIBS_DEBUG = libcurld.lib
-
-#################################################
-# release dynamic library
-
-!IF "$(CFG)" == "release-dll"
-LINKLIBS = libcurl_imp.lib
-LINKLIBS_DEBUG = libcurld_imp.lib
-!ENDIF
-
-#################################################
-# release static library with zlib
-
-!IF "$(CFG)" == "release-zlib"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl
-
-!IF "$(CFG)" == "release-ssl"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl
-
-!IF "$(CFG)" == "release-dll-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with ssl and zlib
-
-!IF "$(CFG)" == "release-ssl-zlib"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl
-
-!IF "$(CFG)" == "release-ssl-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic zlib
-
-!IF "$(CFG)" == "release-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic zlib
-
-!IF "$(CFG)" == "release-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release static library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS) /DCURL_STATICLIB
-LINKLIBS = libcurl.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-#################################################
-# release dynamic library with dynamic ssl and dynamic zlib
-
-!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
-CFLAGS = $(CFLAGS) $(SSL_CFLAGS) $(ZLIB_CFLAGS)
-LINKLIBS = libcurl_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LINKLIBS_DEBUG = libcurld_imp.lib $(SSL_LIBS) $(ZLIB_IMP_LIBS)
-LFLAGS = $(LFLAGS) $(SSL_IMP_LFLAGS) $(ZLIB_LFLAGS)
-!ENDIF
-
-
-LINKLIBS = $(LINKLIBS) ws2_32.lib wldap32.lib
-LINKLIBS_DEBUG = $(LINKLIBS_DEBUG) ws2_32.lib wldap32.lib
-
-all : release
-
-release: $(RELEASE_OBJS)
- $(LINKR) $(LFLAGS) $(LINKLIBS) $(RELEASE_OBJS)
- $(MANIFESTTOOL)
-
-debug: $(DEBUG_OBJS)
- $(LINKD) $(LFLAGS) $(LINKLIBS_DEBUG) $(DEBUG_OBJS)
- $(MANIFESTTOOL)
-
-## Release
-hugehelpr.obj: hugehelp.c
- $(CCR) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutr.obj: writeout.c
- $(CCR) $(CFLAGS) /Fo"$@" writeout.c
-urlglobr.obj: urlglob.c
- $(CCR) $(CFLAGS) /Fo"$@" urlglob.c
-getpassr.obj: getpass.c
- $(CCR) $(CFLAGS) /Fo"$@" getpass.c
-homedirr.obj: homedir.c
- $(CCR) $(CFLAGS) /Fo"$@" homedir.c
-curlutilr.obj: curlutil.c
- $(CCR) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificr.obj: os-specific.c
- $(CCR) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockr.obj: ../lib/nonblock.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrr.obj: ../lib/rawstr.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftr.obj: ../lib/strtoofft.c
- $(CCR) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-mainr.obj: main.c
- $(CCR) $(CFLAGS) /Fo"$@" main.c
-curlr.res : curl.rc
- $(RCR) $(RESFLAGS) /Fo"$@" curl.rc
-
-## Debug
-hugehelpd.obj: hugehelp.c
- $(CCD) $(CFLAGS) /Zm200 /Fo"$@" hugehelp.c
-writeoutd.obj: writeout.c
- $(CCD) $(CFLAGS) /Fo"$@" writeout.c
-urlglobd.obj: urlglob.c
- $(CCD) $(CFLAGS) /Fo"$@" urlglob.c
-getpassd.obj: getpass.c
- $(CCD) $(CFLAGS) /Fo"$@" getpass.c
-homedird.obj: homedir.c
- $(CCD) $(CFLAGS) /Fo"$@" homedir.c
-curlutild.obj: curlutil.c
- $(CCD) $(CFLAGS) /Fo"$@" curlutil.c
-os-specificd.obj: os-specific.c
- $(CCD) $(CFLAGS) /Fo"$@" os-specific.c
-nonblockd.obj: ../lib/nonblock.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/nonblock.c
-rawstrd.obj: ../lib/rawstr.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/rawstr.c
-strtoofftd.obj: ../lib/strtoofft.c
- $(CCD) $(CFLAGS) /Fo"$@" ../lib/strtoofft.c
-maind.obj: main.c
- $(CCD) $(CFLAGS) /Fo"$@" main.c
-curld.res : curl.rc
- $(RCD) $(RESFLAGS) /Fo"$@" curl.rc
-
-clean:
- @-erase $(PROGRAM_NAME) 2> NUL
- @-erase $(RELEASE_OBJS) 2> NUL
- @-erase $(DEBUG_OBJS) 2> NUL
- @-erase *.idb 2> NUL
- @-erase *.pdb 2> NUL
- @-erase *.pch 2> NUL
- @-erase *.ilk 2> NUL
diff --git a/src/checksrc.whitelist b/src/checksrc.whitelist new file mode 100644 index 0000000..b078ac1 --- /dev/null +++ b/src/checksrc.whitelist @@ -0,0 +1,3 @@ + * 'name=@filename,filename2,filename3' + * 'name=@filename;type=image/gif,filename2,filename3' + file = fopen(name, "r"); /* VMS */ diff --git a/src/config-amigaos.h b/src/config-amigaos.h deleted file mode 100644 index fba875d..0000000 --- a/src/config-amigaos.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef CURL_CONFIG_AMIGAOS_H -#define CURL_CONFIG_AMIGAOS_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#ifdef __AMIGA__ /* Any AmigaOS flavour */ - -/* Define to 1 if you want the built-in manual */ -#define USE_MANUAL 1 - -#define OS "AmigaOS" - -#define HAVE_CLOSESOCKET_CAMEL 1 -#define HAVE_UNISTD_H 1 -#define HAVE_STRDUP 1 -#define HAVE_UTIME 1 -#define HAVE_UTIME_H 1 -#define HAVE_SYS_TYPES_H 1 -#define HAVE_SYS_SOCKET_H 1 -#define HAVE_WRITABLE_ARGV 1 -#define HAVE_SYS_TIME_H 1 -#define HAVE_TIME_H 1 -#define TIME_WITH_SYS_TIME 1 -#define HAVE_STRUCT_TIMEVAL 1 - -#if 0 -# define HAVE_TERMIOS_H 1 -# define HAVE_FTRUNCATE 1 -#endif - -#define HAVE_PWD_H 1 - -#ifndef F_OK -# define F_OK 0 -#endif -#ifndef O_RDONLY -# define O_RDONLY 0x0000 /* open for reading only */ -#endif -#ifndef LONG_MAX -# define LONG_MAX 0x7fffffffL /* max value for a long */ -#endif -#ifndef LONG_MIN -# define LONG_MIN (-0x7fffffffL-1) /* min value for a long */ -#endif - -#define SIZEOF_INT 4 -#define SIZEOF_SHORT 2 - -#endif /* __AMIGA__ */ -#endif /* CURL_CONFIG_AMIGAOS_H */ diff --git a/src/config-mac.h b/src/config-mac.h deleted file mode 100644 index dc7f767..0000000 --- a/src/config-mac.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __SRC_CONFIG_MAC_H -#define __SRC_CONFIG_MAC_H - -/* =================================================================== */ -/* src/config-mac.h - Hand crafted config file for Mac OS 9 */ -/* =================================================================== */ -/* On Mac OS X you must run configure to generate curl_config.h file */ -/* =================================================================== */ - -/* Define to 1 if you want the built-in manual */ -#define USE_MANUAL 1 - -#define HAVE_UNISTD_H 1 -#define HAVE_FCNTL_H 1 -#define HAVE_UTIME_H 1 -#define HAVE_SYS_UTIME_H 1 - -#define HAVE_SETVBUF 1 -#define HAVE_UTIME 1 -#define HAVE_FTRUNCATE 1 - -#define HAVE_TIME_H 1 -#define HAVE_SYS_TIME_H 1 -#define TIME_WITH_SYS_TIME 1 -#define HAVE_STRUCT_TIMEVAL 1 - -#define SIZEOF_INT 4 -#define SIZEOF_SHORT 2 - -#define main(x,y) curl_main(x,y) - -/* we provide our own strdup prototype */ -char *strdup(char *s1); - -#endif /* __SRC_CONFIG_MAC_H */ diff --git a/src/config-riscos.h b/src/config-riscos.h deleted file mode 100644 index ba95f13..0000000 --- a/src/config-riscos.h +++ /dev/null @@ -1,379 +0,0 @@ -/* curl_config.h.in. Generated automatically from configure.in by autoheader. */ -/* Name of this package! */ -#undef PACKAGE - -/* Version number of this archive. */ -#undef VERSION - -/* Define if you have the getpass function. */ -#undef HAVE_GETPASS - -/* Define cpu-machine-OS */ -#define OS "ARM-RISC OS" - -/* Define to 1 if you want the built-in manual */ -#define USE_MANUAL 1 - -/* Define if you have the gethostbyaddr_r() function with 5 arguments */ -#undef HAVE_GETHOSTBYADDR_R_5 - -/* Define if you have the gethostbyaddr_r() function with 7 arguments */ -#undef HAVE_GETHOSTBYADDR_R_7 - -/* Define if you have the gethostbyaddr_r() function with 8 arguments */ -#undef HAVE_GETHOSTBYADDR_R_8 - -/* Define if you have the gethostbyname_r() function with 3 arguments */ -#undef HAVE_GETHOSTBYNAME_R_3 - -/* Define if you have the gethostbyname_r() function with 5 arguments */ -#undef HAVE_GETHOSTBYNAME_R_5 - -/* Define if you have the gethostbyname_r() function with 6 arguments */ -#undef HAVE_GETHOSTBYNAME_R_6 - -/* Define if you need the _REENTRANT define for some functions */ -#undef NEED_REENTRANT - -/* Define if you have the Kerberos4 libraries (including -ldes) */ -#undef HAVE_KRB4 - -/* Define if you want to enable IPv6 support */ -#undef ENABLE_IPV6 - -/* Define if struct sockaddr_in6 has the sin6_scope_id member */ -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - -/* Define this to 'int' if ssize_t is not an available typedefed type */ -#undef ssize_t - -/* Define this as a suitable file to read random data from */ -#undef RANDOM_FILE - -/* Define this to your Entropy Gathering Daemon socket pathname */ -#undef EGD_SOCKET - -/* Define if you want to enable IPv6 support */ -#undef ENABLE_IPV6 - -/* Define if you have the <alloca.h> header file. */ -#define HAVE_ALLOCA_H - -/* Define if you have the <arpa/inet.h> header file. */ -#define HAVE_ARPA_INET_H - -/* Define if you have the `closesocket' function. */ -#undef HAVE_CLOSESOCKET - -/* Define if you have the <crypto.h> header file. */ -#undef HAVE_CRYPTO_H - -/* Define if you have the <des.h> header file. */ -#undef HAVE_DES_H - -/* Define if you have the <err.h> header file. */ -#undef HAVE_ERR_H - -/* Define if you have the <fcntl.h> header file. */ -#define HAVE_FCNTL_H - -/* Define if you have the `ftruncate' function. */ -#define HAVE_FTRUNCATE - -/* Define if getaddrinfo exists and works */ -#define HAVE_GETADDRINFO - -/* Define if you have the `geteuid' function. */ -#undef HAVE_GETEUID - -/* Define if you have the `gethostbyaddr' function. */ -#define HAVE_GETHOSTBYADDR - -/* Define if you have the `gethostbyaddr_r' function. */ -#undef HAVE_GETHOSTBYADDR_R - -/* Define if you have the `gethostbyname_r' function. */ -#undef HAVE_GETHOSTBYNAME_R - -/* Define if you have the `gethostname' function. */ -#define HAVE_GETHOSTNAME - -/* Define if you have the <getopt.h> header file. */ -#define HAVE_GETOPT_H - -/* Define if you have the `getpass_r' function. */ -#undef HAVE_GETPASS_R - -/* Define if you have the `getpwuid' function. */ -#undef HAVE_GETPWUID - -/* Define if you have the `getservbyname' function. */ -#undef HAVE_GETSERVBYNAME - -/* Define if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY - -/* Define if you have the `timeval' struct. */ -#define HAVE_STRUCT_TIMEVAL - -/* Define if you have the `inet_addr' function. */ -#undef HAVE_INET_ADDR - -/* Define if you have the <inttypes.h> header file. */ -#define HAVE_INTTYPES_H - -/* Define if you have the <io.h> header file. */ -#undef HAVE_IO_H - -/* Define if you have the `krb_get_our_ip_for_realm' function. */ -#undef HAVE_KRB_GET_OUR_IP_FOR_REALM - -/* Define if you have the <krb.h> header file. */ -#undef HAVE_KRB_H - -/* Define if you have the `crypto' library (-lcrypto). */ -#undef HAVE_LIBCRYPTO - -/* Define if you have the `nsl' library (-lnsl). */ -#undef HAVE_LIBNSL - -/* Define if you have the `resolv' library (-lresolv). */ -#undef HAVE_LIBRESOLV - -/* Define if you have the `resolve' library (-lresolve). */ -#undef HAVE_LIBRESOLVE - -/* Define if you have the `socket' library (-lsocket). */ -#undef HAVE_LIBSOCKET - -/* Define if you have the `ssl' library (-lssl). */ -#undef HAVE_LIBSSL - -/* Define if you have the `ucb' library (-lucb). */ -#undef HAVE_LIBUCB - -/* Define if you have the `localtime_r' function. */ -#undef HAVE_LOCALTIME_R - -/* Define if you have the <malloc.h> header file. */ -#define HAVE_MALLOC_H - -/* Define to 1 if you need the malloc.h header file even with stdlib.h */ -/* #define NEED_MALLOC_H 1 */ - -/* Define if you have the <memory.h> header file. */ -#undef HAVE_MEMORY_H - -/* Define if you have the <netdb.h> header file. */ -#define HAVE_NETDB_H - -/* Define if you have the <netinet/if_ether.h> header file. */ -#undef HAVE_NETINET_IF_ETHER_H - -/* Define if you have the <netinet/in.h> header file. */ -#define HAVE_NETINET_IN_H - -/* Define if you have the <net/if.h> header file. */ -#define HAVE_NET_IF_H - -/* Define if you have the <openssl/crypto.h> header file. */ -#undef HAVE_OPENSSL_CRYPTO_H - -/* Define if you have the <openssl/err.h> header file. */ -#undef HAVE_OPENSSL_ERR_H - -/* Define if you have the <openssl/pem.h> header file. */ -#undef HAVE_OPENSSL_PEM_H - -/* Define if you have the <openssl/rsa.h> header file. */ -#undef HAVE_OPENSSL_RSA_H - -/* Define if you have the <openssl/ssl.h> header file. */ -#undef HAVE_OPENSSL_SSL_H - -/* Define if you have the <openssl/x509.h> header file. */ -#undef HAVE_OPENSSL_X509_H - -/* Define if you have the <pem.h> header file. */ -#undef HAVE_PEM_H - -/* Define if you have the `perror' function. */ -#undef HAVE_PERROR - -/* Define if you have the <pwd.h> header file. */ -#undef HAVE_PWD_H - -/* Define if you have the `RAND_egd' function. */ -#undef HAVE_RAND_EGD - -/* Define if you have the `RAND_screen' function. */ -#undef HAVE_RAND_SCREEN - -/* Define if you have the `RAND_status' function. */ -#undef HAVE_RAND_STATUS - -/* Define if you have the <rsa.h> header file. */ -#undef HAVE_RSA_H - -/* Define if you have the `select' function. */ -#define HAVE_SELECT - -/* Define if you have the `setvbuf' function. */ -#undef HAVE_SETVBUF - -/* Define if you have the <sgtty.h> header file. */ -#define HAVE_SGTTY_H - -/* Define if you have the `sigaction' function. */ -#undef HAVE_SIGACTION - -/* Define if you have the `signal' function. */ -#define HAVE_SIGNAL - -/* Define if you have the `socket' function. */ -#define HAVE_SOCKET - -/* Define if you have the <ssl.h> header file. */ -#undef HAVE_SSL_H - -/* Define if you have the <stdint.h> header file. */ -#undef HAVE_STDINT_H - -/* Define if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H - -/* Define if you have the `strcasecmp' function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the `strcmpi' function. */ -#undef HAVE_STRCMPI - -/* Define if you have the `strdup' function. */ -#define HAVE_STRDUP - -/* Define if you have the `strftime' function. */ -#define HAVE_STRFTIME - -/* Define if you have the `stricmp' function. */ -#define HAVE_STRICMP - -/* Define if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the <string.h> header file. */ -#define HAVE_STRING_H - -/* Define if you have the `strlcat' function. */ -#undef HAVE_STRLCAT - -/* Define if you have the `strlcpy' function. */ -#undef HAVE_STRLCPY - -/* Define if you have the `strstr' function. */ -#define HAVE_STRSTR - -/* Define if you have the `strtok_r' function. */ -#undef HAVE_STRTOK_R - -/* Define if you have the <sys/param.h> header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the <sys/select.h> header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define if you have the <sys/socket.h> header file. */ -#define HAVE_SYS_SOCKET_H - -/* Define if you have the <sys/sockio.h> header file. */ -#undef HAVE_SYS_SOCKIO_H - -/* Define if you have the <sys/stat.h> header file. */ -#undef HAVE_SYS_STAT_H - -/* Define if you have the <sys/time.h> header file. */ -#define HAVE_SYS_TIME_H - -/* Define if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H - -/* Define if you have the `tcgetattr' function. */ -#define HAVE_TCGETATTR - -/* Define if you have the `tcsetattr' function. */ -#define HAVE_TCSETATTR - -/* Define if you have the <termios.h> header file. */ -#define HAVE_TERMIOS_H - -/* Define if you have the <termio.h> header file. */ -#undef HAVE_TERMIO_H - -/* Define if you have the <time.h> header file. */ -#undef HAVE_TIME_H - -/* Define if you have the `uname' function. */ -#define HAVE_UNAME - -/* Define if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H - -/* Define if you have the <winsock.h> header file. */ -#undef HAVE_WINSOCK_H - -/* Define if you have the <x509.h> header file. */ -#undef HAVE_X509_H - -/* Name of package */ -#undef PACKAGE - -/* Define as the return type of signal handlers (`int' or `void'). */ -#define RETSIGTYPE void - -/* The size of `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of `long double', as computed by sizeof. */ -#undef SIZEOF_LONG_DOUBLE - -/* The size of `long long', as computed by sizeof. */ -#undef SIZEOF_LONG_LONG - -/* The size of `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if you can safely include both <sys/time.h> and <time.h>. */ -#undef TIME_WITH_SYS_TIME - -/* Version number of package */ -#undef VERSION - -/* Define if on AIX 3. - System headers sometimes define this. - We just want to avoid a redefinition error message. */ -#ifndef _ALL_SOURCE -# undef _ALL_SOURCE -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Define to `unsigned' if <sys/types.h> does not define. */ -#undef size_t - -/* Define to `int' if <sys/types.h> does not define. */ -#undef ssize_t - -/* Define if you have the ioctl function. */ -#define HAVE_IOCTL - -/* Define if you have a working ioctl FIONBIO function. */ -#define HAVE_IOCTL_FIONBIO diff --git a/src/config-win32.h b/src/config-win32.h deleted file mode 100644 index 10a5eaf..0000000 --- a/src/config-win32.h +++ /dev/null @@ -1,416 +0,0 @@ -#ifndef __SRC_CONFIG_WIN32_H -#define __SRC_CONFIG_WIN32_H - -/* ================================================================ */ -/* src/config-win32.h - Hand crafted config file for windows */ -/* ================================================================ */ - -/* ---------------------------------------------------------------- */ -/* HEADER FILES */ -/* ---------------------------------------------------------------- */ - -/* Define if you have the <fcntl.h> header file. */ -#define HAVE_FCNTL_H 1 - -/* Define if you have the <io.h> header file. */ -#define HAVE_IO_H 1 - -/* Define if you have the <limits.h> header file. */ -#define HAVE_LIMITS_H 1 - -/* Define if you have the <locale.h> header file. */ -#define HAVE_LOCALE_H 1 - -/* Define if you need the malloc.h header file even with stdlib.h */ -#if !defined(__SALFORDC__) && !defined(__POCC__) -#define NEED_MALLOC_H 1 -#endif - -/* Define if you have the <signal.h> header file. */ -#define HAVE_SIGNAL_H 1 - -/* Define if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define if you have the <sys/time.h> header file */ -/* #define HAVE_SYS_TIME_H 1 */ - -/* Define if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if you have the <sys/utime.h> header file. */ -#ifndef __BORLANDC__ -#define HAVE_SYS_UTIME_H 1 -#endif - -/* Define if you have the <time.h> header file. */ -#define HAVE_TIME_H 1 - -/* Define if you have the <unistd.h> header file. */ -#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \ - defined(__POCC__) -#define HAVE_UNISTD_H 1 -#endif - -/* Define if you have the <windows.h> header file. */ -#define HAVE_WINDOWS_H 1 - -/* Define if you have the <winsock.h> header file. */ -#define HAVE_WINSOCK_H 1 - -/* Define if you have the <winsock2.h> header file. */ -#ifndef __SALFORDC__ -#define HAVE_WINSOCK2_H 1 -#endif - -/* Define if you have the <ws2tcpip.h> header file. */ -#ifndef __SALFORDC__ -#define HAVE_WS2TCPIP_H 1 -#endif - -/* ---------------------------------------------------------------- */ -/* OTHER HEADER INFO */ -/* ---------------------------------------------------------------- */ - -/* Define if sig_atomic_t is an available typedef. */ -#define HAVE_SIG_ATOMIC_T 1 - -/* Define if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define if you can safely include both <sys/time.h> and <time.h>. */ -/* #define TIME_WITH_SYS_TIME 1 */ - -/* ---------------------------------------------------------------- */ -/* FUNCTIONS */ -/* ---------------------------------------------------------------- */ - -/* Define if you have the ftruncate function. */ -#define HAVE_FTRUNCATE 1 - -/* Define if you have the ioctlsocket function. */ -#define HAVE_IOCTLSOCKET 1 - -/* Define if you have a working ioctlsocket FIONBIO function. */ -#define HAVE_IOCTLSOCKET_FIONBIO 1 - -/* Define if you have the setlocale function. */ -#define HAVE_SETLOCALE 1 - -/* Define if you have the setmode function. */ -#define HAVE_SETMODE 1 - -/* Define if you have the strcasecmp function. */ -/* #define HAVE_STRCASECMP 1 */ - -/* Define if you have the strdup function. */ -#define HAVE_STRDUP 1 - -/* Define if you have the stricmp function. */ -#define HAVE_STRICMP 1 - -/* Define if you have the strncasecmp function. */ -/* #define HAVE_STRNCASECMP 1 */ - -/* Define if you have the strnicmp function. */ -#define HAVE_STRNICMP 1 - -/* Define if you have the utime function */ -#ifndef __BORLANDC__ -#define HAVE_UTIME 1 -#endif - -/* Define if you have the recv function. */ -#define HAVE_RECV 1 - -/* Define to the type of arg 1 for recv. */ -#define RECV_TYPE_ARG1 SOCKET - -/* Define to the type of arg 2 for recv. */ -#define RECV_TYPE_ARG2 char * - -/* Define to the type of arg 3 for recv. */ -#define RECV_TYPE_ARG3 int - -/* Define to the type of arg 4 for recv. */ -#define RECV_TYPE_ARG4 int - -/* Define to the function return type for recv. */ -#define RECV_TYPE_RETV int - -/* Define if you have the recvfrom function. */ -#define HAVE_RECVFROM 1 - -/* Define to the type of arg 1 for recvfrom. */ -#define RECVFROM_TYPE_ARG1 SOCKET - -/* Define to the type pointed by arg 2 for recvfrom. */ -#define RECVFROM_TYPE_ARG2 char - -/* Define to the type of arg 3 for recvfrom. */ -#define RECVFROM_TYPE_ARG3 int - -/* Define to the type of arg 4 for recvfrom. */ -#define RECVFROM_TYPE_ARG4 int - -/* Define to the type pointed by arg 5 for recvfrom. */ -#define RECVFROM_TYPE_ARG5 struct sockaddr - -/* Define to the type pointed by arg 6 for recvfrom. */ -#define RECVFROM_TYPE_ARG6 int - -/* Define to the function return type for recvfrom. */ -#define RECVFROM_TYPE_RETV int - -/* Define if you have the send function. */ -#define HAVE_SEND 1 - -/* Define to the type of arg 1 for send. */ -#define SEND_TYPE_ARG1 SOCKET - -/* Define to the type qualifier of arg 2 for send. */ -#define SEND_QUAL_ARG2 const - -/* Define to the type of arg 2 for send. */ -#define SEND_TYPE_ARG2 char * - -/* Define to the type of arg 3 for send. */ -#define SEND_TYPE_ARG3 int - -/* Define to the type of arg 4 for send. */ -#define SEND_TYPE_ARG4 int - -/* Define to the function return type for send. */ -#define SEND_TYPE_RETV int - -/* ---------------------------------------------------------------- */ -/* TYPEDEF REPLACEMENTS */ -/* ---------------------------------------------------------------- */ - -/* Define this if in_addr_t is not an available 'typedefed' type */ -#define in_addr_t unsigned long - -/* Define as the return type of signal handlers (int or void). */ -#define RETSIGTYPE void - -/* Define ssize_t if it is not an available 'typedefed' type */ -#ifndef _SSIZE_T_DEFINED -# if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \ - defined(__POCC__) || \ - defined(__MINGW32__) -# elif defined(_WIN64) -# define _SSIZE_T_DEFINED -# define ssize_t __int64 -# else -# define _SSIZE_T_DEFINED -# define ssize_t int -# endif -#endif - -/* ---------------------------------------------------------------- */ -/* TYPE SIZES */ -/* ---------------------------------------------------------------- */ - -/* The size of `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of `long double', as computed by sizeof. */ -#define SIZEOF_LONG_DOUBLE 16 - -/* The size of `long long', as computed by sizeof. */ -/* #define SIZEOF_LONG_LONG 8 */ - -/* The size of `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* ---------------------------------------------------------------- */ -/* STRUCT RELATED */ -/* ---------------------------------------------------------------- */ - -/* Define this if you have struct sockaddr_storage */ -#ifndef __SALFORDC__ -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 -#endif - -/* Define this if you have struct timeval */ -#define HAVE_STRUCT_TIMEVAL 1 - -/* Define this if struct sockaddr_in6 has the sin6_scope_id member */ -#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1 - -/* ---------------------------------------------------------------- */ -/* Watt-32 tcp/ip SPECIFIC */ -/* ---------------------------------------------------------------- */ - -#ifdef USE_WATT32 - #include <tcp.h> - #undef byte - #undef word - #undef USE_WINSOCK - #undef HAVE_WINSOCK_H - #undef HAVE_WINSOCK2_H - #undef HAVE_WS2TCPIP_H - #define HAVE_GETADDRINFO - #define HAVE_GETNAMEINFO - #define HAVE_SYS_IOCTL_H - #define HAVE_SYS_SOCKET_H - #define HAVE_NETINET_IN_H - #define HAVE_NETDB_H - #define HAVE_ARPA_INET_H - #define HAVE_FREEADDRINFO - #define SOCKET int -#endif - - -/* ---------------------------------------------------------------- */ -/* COMPILER SPECIFIC */ -/* ---------------------------------------------------------------- */ - -/* Undef keyword 'const' if it does not work. */ -/* #undef const */ - -/* Windows should not have HAVE_GMTIME_R defined */ -/* #undef HAVE_GMTIME_R */ - -/* Define if the compiler supports C99 variadic macro style. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#define HAVE_VARIADIC_MACROS_C99 1 -#endif - -/* Define if the compiler supports the 'long long' data type. */ -#if defined(__MINGW32__) || defined(__WATCOMC__) -#define HAVE_LONGLONG 1 -#endif - -/* Define to avoid VS2005 complaining about portable C functions */ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#define _CRT_SECURE_NO_DEPRECATE 1 -#define _CRT_NONSTDC_NO_DEPRECATE 1 -#endif - -/* VS2005 and later dafault size for time_t is 64-bit, unless */ -/* _USE_32BIT_TIME_T has been defined to get a 32-bit time_t. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -# ifndef _USE_32BIT_TIME_T -# define SIZEOF_TIME_T 8 -# else -# define SIZEOF_TIME_T 4 -# endif -#endif - -/* Officially, Microsoft's Windows SDK versions 6.X do not support Windows - 2000 as a supported build target. VS2008 default installations provide an - embedded Windows SDK v6.0A along with the claim that Windows 2000 is a - valid build target for VS2008. Popular belief is that binaries built using - Windows SDK versions 6.X and Windows 2000 as a build target are functional */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -# define VS2008_MINIMUM_TARGET 0x0500 -#endif - -/* When no build target is specified VS2008 default build target is Windows - Vista, which leaves out even Winsows XP. If no build target has been given - for VS2008 we will target the minimum Officially supported build target, - which happens to be Windows XP. */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -# define VS2008_DEFAULT_TARGET 0x0501 -#endif - -/* VS2008 default target settings and minimum build target check */ -#if defined(_MSC_VER) && (_MSC_VER >= 1500) -# ifndef _WIN32_WINNT -# define _WIN32_WINNT VS2008_DEFAULT_TARGET -# endif -# ifndef WINVER -# define WINVER VS2008_DEFAULT_TARGET -# endif -# if (_WIN32_WINNT < VS2008_MINIMUM_TARGET) || (WINVER < VS2008_MINIMUM_TARGET) -# error VS2008 does not support Windows build targets prior to Windows 2000 -# endif -#endif - -/* When no build target is specified Pelles C 5.00 and later default build - target is Windows Vista. We override default target to be Windows 2000. */ -#if defined(__POCC__) && (__POCC__ >= 500) -# ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0500 -# endif -# ifndef WINVER -# define WINVER 0x0500 -# endif -#endif - -/* Availability of freeaddrinfo, getaddrinfo and getnameinfo functions is - quite convoluted, compiler dependent and even build target dependent. */ -#if defined(HAVE_WS2TCPIP_H) -# if defined(__POCC__) -# define HAVE_FREEADDRINFO 1 -# define HAVE_GETADDRINFO 1 -# define HAVE_GETADDRINFO_THREADSAFE 1 -# define HAVE_GETNAMEINFO 1 -# elif defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) -# define HAVE_FREEADDRINFO 1 -# define HAVE_GETADDRINFO 1 -# define HAVE_GETADDRINFO_THREADSAFE 1 -# define HAVE_GETNAMEINFO 1 -# elif defined(_MSC_VER) && (_MSC_VER >= 1200) -# define HAVE_FREEADDRINFO 1 -# define HAVE_GETADDRINFO 1 -# define HAVE_GETADDRINFO_THREADSAFE 1 -# define HAVE_GETNAMEINFO 1 -# endif -#endif - -#if defined(__POCC__) -# ifndef _MSC_VER -# error Microsoft extensions /Ze compiler option is required -# endif -# ifndef __POCC__OLDNAMES -# error Compatibility names /Go compiler option is required -# endif -#endif - -/* ---------------------------------------------------------------- */ -/* LARGE FILE SUPPORT */ -/* ---------------------------------------------------------------- */ - -#if defined(_MSC_VER) && !defined(_WIN32_WCE) -# if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64) -# define USE_WIN32_LARGE_FILES -# else -# define USE_WIN32_SMALL_FILES -# endif -#endif - -#if defined(__MINGW32__) && !defined(USE_WIN32_LARGE_FILES) -# define USE_WIN32_LARGE_FILES -#endif - -#if defined(__WATCOMC__) && !defined(USE_WIN32_LARGE_FILES) -# define USE_WIN32_LARGE_FILES -#endif - -#if defined(__POCC__) -# undef USE_WIN32_LARGE_FILES -#endif - -#if !defined(USE_WIN32_LARGE_FILES) && !defined(USE_WIN32_SMALL_FILES) -# define USE_WIN32_SMALL_FILES -#endif - -/* ---------------------------------------------------------------- */ -/* ADDITIONAL DEFINITIONS */ -/* ---------------------------------------------------------------- */ - -/* Define cpu-machine-OS */ -#ifndef OS -#define OS "i386-pc-win32" -#endif - -/* Define to 1 if you want the built-in manual */ -#define USE_MANUAL 1 - -#if defined(__POCC__) -# define ENABLE_IPV6 1 -#endif - -#endif /* __SRC_CONFIG_WIN32_H */ diff --git a/src/curl.rc b/src/curl.rc index 58e439d..3db59bd 100644 --- a/src/curl.rc +++ b/src/curl.rc @@ -20,7 +20,7 @@ * ***************************************************************************/ #include <winver.h> -#include "version.h" +#include "tool_version.h" LANGUAGE 0x09,0x01 diff --git a/src/curl_config.h.in b/src/curl_config.h.in deleted file mode 100644 index 15ea387..0000000 --- a/src/curl_config.h.in +++ /dev/null @@ -1,1006 +0,0 @@ -/* lib/curl_config.h.in. Generated from configure.ac by autoheader. */ - -/* when building libcurl itself */ -#undef BUILDING_LIBCURL - -/* Location of default ca bundle */ -#undef CURL_CA_BUNDLE - -/* Location of default ca path */ -#undef CURL_CA_PATH - -/* to disable cookies support */ -#undef CURL_DISABLE_COOKIES - -/* to disable cryptographic authentication */ -#undef CURL_DISABLE_CRYPTO_AUTH - -/* to disable DICT */ -#undef CURL_DISABLE_DICT - -/* to disable FILE */ -#undef CURL_DISABLE_FILE - -/* to disable FTP */ -#undef CURL_DISABLE_FTP - -/* to disable Gopher */ -#undef CURL_DISABLE_GOPHER - -/* to disable HTTP */ -#undef CURL_DISABLE_HTTP - -/* to disable IMAP */ -#undef CURL_DISABLE_IMAP - -/* to disable LDAP */ -#undef CURL_DISABLE_LDAP - -/* to disable LDAPS */ -#undef CURL_DISABLE_LDAPS - -/* to disable POP3 */ -#undef CURL_DISABLE_POP3 - -/* to disable proxies */ -#undef CURL_DISABLE_PROXY - -/* to disable RTSP */ -#undef CURL_DISABLE_RTSP - -/* to disable SMTP */ -#undef CURL_DISABLE_SMTP - -/* to disable TELNET */ -#undef CURL_DISABLE_TELNET - -/* to disable TFTP */ -#undef CURL_DISABLE_TFTP - -/* to disable verbose strings */ -#undef CURL_DISABLE_VERBOSE_STRINGS - -/* to make a symbol visible */ -#undef CURL_EXTERN_SYMBOL - -/* to enable hidden symbols */ -#undef CURL_HIDDEN_SYMBOLS - -/* Use Windows LDAP implementation */ -#undef CURL_LDAP_WIN - -/* when not building a shared library */ -#undef CURL_STATICLIB - -/* your Entropy Gathering Daemon socket pathname */ -#undef EGD_SOCKET - -/* Define if you want to enable IPv6 support */ -#undef ENABLE_IPV6 - -/* Define to the type qualifier of arg 1 for getnameinfo. */ -#undef GETNAMEINFO_QUAL_ARG1 - -/* Define to the type of arg 1 for getnameinfo. */ -#undef GETNAMEINFO_TYPE_ARG1 - -/* Define to the type of arg 2 for getnameinfo. */ -#undef GETNAMEINFO_TYPE_ARG2 - -/* Define to the type of args 4 and 6 for getnameinfo. */ -#undef GETNAMEINFO_TYPE_ARG46 - -/* Define to the type of arg 7 for getnameinfo. */ -#undef GETNAMEINFO_TYPE_ARG7 - -/* Specifies the number of arguments to getservbyport_r */ -#undef GETSERVBYPORT_R_ARGS - -/* Specifies the size of the buffer to pass to getservbyport_r */ -#undef GETSERVBYPORT_R_BUFSIZE - -/* Define to 1 if you have the alarm function. */ -#undef HAVE_ALARM - -/* Define to 1 if you have the <alloca.h> header file. */ -#undef HAVE_ALLOCA_H - -/* Define to 1 if you have the <arpa/inet.h> header file. */ -#undef HAVE_ARPA_INET_H - -/* Define to 1 if you have the <arpa/tftp.h> header file. */ -#undef HAVE_ARPA_TFTP_H - -/* Define to 1 if you have the <assert.h> header file. */ -#undef HAVE_ASSERT_H - -/* Define to 1 if you have the basename function. */ -#undef HAVE_BASENAME - -/* Define to 1 if bool is an available type. */ -#undef HAVE_BOOL_T - -/* Define to 1 if you have the clock_gettime function and monotonic timer. */ -#undef HAVE_CLOCK_GETTIME_MONOTONIC - -/* Define to 1 if you have the closesocket function. */ -#undef HAVE_CLOSESOCKET - -/* Define to 1 if you have the CloseSocket camel case function. */ -#undef HAVE_CLOSESOCKET_CAMEL - -/* Define to 1 if you have the connect function. */ -#undef HAVE_CONNECT - -/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */ -#undef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA - -/* Define to 1 if you have the <crypto.h> header file. */ -#undef HAVE_CRYPTO_H - -/* Define to 1 if you have the <des.h> header file. */ -#undef HAVE_DES_H - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the `ENGINE_cleanup' function. */ -#undef HAVE_ENGINE_CLEANUP - -/* Define to 1 if you have the `ENGINE_load_builtin_engines' function. */ -#undef HAVE_ENGINE_LOAD_BUILTIN_ENGINES - -/* Define to 1 if you have the <errno.h> header file. */ -#undef HAVE_ERRNO_H - -/* Define to 1 if you have the <err.h> header file. */ -#undef HAVE_ERR_H - -/* Define to 1 if you have the fcntl function. */ -#undef HAVE_FCNTL - -/* Define to 1 if you have the <fcntl.h> header file. */ -#undef HAVE_FCNTL_H - -/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ -#undef HAVE_FCNTL_O_NONBLOCK - -/* Define to 1 if you have the fdopen function. */ -#undef HAVE_FDOPEN - -/* Define to 1 if you have the `fork' function. */ -#undef HAVE_FORK - -/* Define to 1 if you have the freeaddrinfo function. */ -#undef HAVE_FREEADDRINFO - -/* Define to 1 if you have the freeifaddrs function. */ -#undef HAVE_FREEIFADDRS - -/* Define to 1 if you have the ftruncate function. */ -#undef HAVE_FTRUNCATE - -/* Define to 1 if you have a working getaddrinfo function. */ -#undef HAVE_GETADDRINFO - -/* Define to 1 if the getaddrinfo function is threadsafe. */ -#undef HAVE_GETADDRINFO_THREADSAFE - -/* Define to 1 if you have the `geteuid' function. */ -#undef HAVE_GETEUID - -/* Define to 1 if you have the gethostbyaddr function. */ -#undef HAVE_GETHOSTBYADDR - -/* Define to 1 if you have the gethostbyaddr_r function. */ -#undef HAVE_GETHOSTBYADDR_R - -/* gethostbyaddr_r() takes 5 args */ -#undef HAVE_GETHOSTBYADDR_R_5 - -/* gethostbyaddr_r() takes 7 args */ -#undef HAVE_GETHOSTBYADDR_R_7 - -/* gethostbyaddr_r() takes 8 args */ -#undef HAVE_GETHOSTBYADDR_R_8 - -/* Define to 1 if you have the gethostbyname function. */ -#undef HAVE_GETHOSTBYNAME - -/* Define to 1 if you have the gethostbyname_r function. */ -#undef HAVE_GETHOSTBYNAME_R - -/* gethostbyname_r() takes 3 args */ -#undef HAVE_GETHOSTBYNAME_R_3 - -/* gethostbyname_r() takes 5 args */ -#undef HAVE_GETHOSTBYNAME_R_5 - -/* gethostbyname_r() takes 6 args */ -#undef HAVE_GETHOSTBYNAME_R_6 - -/* Define to 1 if you have the gethostname function. */ -#undef HAVE_GETHOSTNAME - -/* Define to 1 if you have a working getifaddrs function. */ -#undef HAVE_GETIFADDRS - -/* Define to 1 if you have the getnameinfo function. */ -#undef HAVE_GETNAMEINFO - -/* Define to 1 if you have the `getpass_r' function. */ -#undef HAVE_GETPASS_R - -/* Define to 1 if you have the `getppid' function. */ -#undef HAVE_GETPPID - -/* Define to 1 if you have the `getprotobyname' function. */ -#undef HAVE_GETPROTOBYNAME - -/* Define to 1 if you have the `getpwuid' function. */ -#undef HAVE_GETPWUID - -/* Define to 1 if you have the `getrlimit' function. */ -#undef HAVE_GETRLIMIT - -/* Define to 1 if you have the getservbyport_r function. */ -#undef HAVE_GETSERVBYPORT_R - -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - -/* Define to 1 if you have a working glibc-style strerror_r function. */ -#undef HAVE_GLIBC_STRERROR_R - -/* Define to 1 if you have a working gmtime_r function. */ -#undef HAVE_GMTIME_R - -/* if you have the gssapi libraries */ -#undef HAVE_GSSAPI - -/* Define to 1 if you have the <gssapi/gssapi_generic.h> header file. */ -#undef HAVE_GSSAPI_GSSAPI_GENERIC_H - -/* Define to 1 if you have the <gssapi/gssapi.h> header file. */ -#undef HAVE_GSSAPI_GSSAPI_H - -/* Define to 1 if you have the <gssapi/gssapi_krb5.h> header file. */ -#undef HAVE_GSSAPI_GSSAPI_KRB5_H - -/* if you have the GNU gssapi libraries */ -#undef HAVE_GSSGNU - -/* if you have the Heimdal gssapi libraries */ -#undef HAVE_GSSHEIMDAL - -/* if you have the MIT gssapi libraries */ -#undef HAVE_GSSMIT - -/* Define to 1 if you have the `idna_strerror' function. */ -#undef HAVE_IDNA_STRERROR - -/* Define to 1 if you have the `idn_free' function. */ -#undef HAVE_IDN_FREE - -/* Define to 1 if you have the <idn-free.h> header file. */ -#undef HAVE_IDN_FREE_H - -/* Define to 1 if you have the <ifaddrs.h> header file. */ -#undef HAVE_IFADDRS_H - -/* Define to 1 if you have the `inet_addr' function. */ -#undef HAVE_INET_ADDR - -/* Define to 1 if you have the inet_ntoa_r function. */ -#undef HAVE_INET_NTOA_R - -/* inet_ntoa_r() takes 2 args */ -#undef HAVE_INET_NTOA_R_2 - -/* inet_ntoa_r() takes 3 args */ -#undef HAVE_INET_NTOA_R_3 - -/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ -#undef HAVE_INET_NTOP - -/* Define to 1 if you have a IPv6 capable working inet_pton function. */ -#undef HAVE_INET_PTON - -/* Define to 1 if you have the <inttypes.h> header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the ioctl function. */ -#undef HAVE_IOCTL - -/* Define to 1 if you have the ioctlsocket function. */ -#undef HAVE_IOCTLSOCKET - -/* Define to 1 if you have the IoctlSocket camel case function. */ -#undef HAVE_IOCTLSOCKET_CAMEL - -/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. - */ -#undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO - -/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ -#undef HAVE_IOCTLSOCKET_FIONBIO - -/* Define to 1 if you have a working ioctl FIONBIO function. */ -#undef HAVE_IOCTL_FIONBIO - -/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ -#undef HAVE_IOCTL_SIOCGIFADDR - -/* Define to 1 if you have the <io.h> header file. */ -#undef HAVE_IO_H - -/* if you have the Kerberos4 libraries (including -ldes) */ -#undef HAVE_KRB4 - -/* Define to 1 if you have the `krb_get_our_ip_for_realm' function. */ -#undef HAVE_KRB_GET_OUR_IP_FOR_REALM - -/* Define to 1 if you have the <krb.h> header file. */ -#undef HAVE_KRB_H - -/* Define to 1 if you have the lber.h header file. */ -#undef HAVE_LBER_H - -/* Define to 1 if you have the ldapssl.h header file. */ -#undef HAVE_LDAPSSL_H - -/* Define to 1 if you have the ldap.h header file. */ -#undef HAVE_LDAP_H - -/* Define to 1 if you have the `ldap_init_fd' function. */ -#undef HAVE_LDAP_INIT_FD - -/* Use LDAPS implementation */ -#undef HAVE_LDAP_SSL - -/* Define to 1 if you have the ldap_ssl.h header file. */ -#undef HAVE_LDAP_SSL_H - -/* Define to 1 if you have the `ldap_url_parse' function. */ -#undef HAVE_LDAP_URL_PARSE - -/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */ -#undef HAVE_LIBGCRYPT - -/* Define to 1 if you have the <libgen.h> header file. */ -#undef HAVE_LIBGEN_H - -/* Define to 1 if you have the `idn' library (-lidn). */ -#undef HAVE_LIBIDN - -/* Define to 1 if you have the `resolv' library (-lresolv). */ -#undef HAVE_LIBRESOLV - -/* Define to 1 if you have the `resolve' library (-lresolve). */ -#undef HAVE_LIBRESOLVE - -/* Define to 1 if you have the <librtmp/rtmp.h> header file. */ -#undef HAVE_LIBRTMP_RTMP_H - -/* Define to 1 if you have the `ssh2' library (-lssh2). */ -#undef HAVE_LIBSSH2 - -/* Define to 1 if you have the `libssh2_exit' function. */ -#undef HAVE_LIBSSH2_EXIT - -/* Define to 1 if you have the <libssh2.h> header file. */ -#undef HAVE_LIBSSH2_H - -/* Define to 1 if you have the `libssh2_init' function. */ -#undef HAVE_LIBSSH2_INIT - -/* Define to 1 if you have the `libssh2_scp_send64' function. */ -#undef HAVE_LIBSSH2_SCP_SEND64 - -/* Define to 1 if you have the `libssh2_version' function. */ -#undef HAVE_LIBSSH2_VERSION - -/* Define to 1 if you have the `ssl' library (-lssl). */ -#undef HAVE_LIBSSL - -/* if zlib is available */ -#undef HAVE_LIBZ - -/* Define to 1 if you have the <limits.h> header file. */ -#undef HAVE_LIMITS_H - -/* if your compiler supports LL */ -#undef HAVE_LL - -/* Define to 1 if you have the <locale.h> header file. */ -#undef HAVE_LOCALE_H - -/* Define to 1 if you have a working localtime_r function. */ -#undef HAVE_LOCALTIME_R - -/* Define to 1 if the compiler supports the 'long long' data type. */ -#undef HAVE_LONGLONG - -/* Define to 1 if you have the malloc.h header file. */ -#undef HAVE_MALLOC_H - -/* Define to 1 if you have the memory.h header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the memrchr function or macro. */ -#undef HAVE_MEMRCHR - -/* Define to 1 if you have the MSG_NOSIGNAL flag. */ -#undef HAVE_MSG_NOSIGNAL - -/* Define to 1 if you have the <netdb.h> header file. */ -#undef HAVE_NETDB_H - -/* Define to 1 if you have the <netinet/in.h> header file. */ -#undef HAVE_NETINET_IN_H - -/* Define to 1 if you have the <netinet/tcp.h> header file. */ -#undef HAVE_NETINET_TCP_H - -/* Define to 1 if you have the <net/if.h> header file. */ -#undef HAVE_NET_IF_H - -/* Define to 1 if NI_WITHSCOPEID exists and works. */ -#undef HAVE_NI_WITHSCOPEID - -/* if you have an old MIT gssapi library, lacking GSS_C_NT_HOSTBASED_SERVICE - */ -#undef HAVE_OLD_GSSMIT - -/* Define to 1 if you have the <openssl/crypto.h> header file. */ -#undef HAVE_OPENSSL_CRYPTO_H - -/* Define to 1 if you have the <openssl/engine.h> header file. */ -#undef HAVE_OPENSSL_ENGINE_H - -/* Define to 1 if you have the <openssl/err.h> header file. */ -#undef HAVE_OPENSSL_ERR_H - -/* Define to 1 if you have the <openssl/pem.h> header file. */ -#undef HAVE_OPENSSL_PEM_H - -/* Define to 1 if you have the <openssl/pkcs12.h> header file. */ -#undef HAVE_OPENSSL_PKCS12_H - -/* Define to 1 if you have the <openssl/rsa.h> header file. */ -#undef HAVE_OPENSSL_RSA_H - -/* Define to 1 if you have the <openssl/ssl.h> header file. */ -#undef HAVE_OPENSSL_SSL_H - -/* Define to 1 if you have the <openssl/x509.h> header file. */ -#undef HAVE_OPENSSL_X509_H - -/* Define to 1 if you have the <pem.h> header file. */ -#undef HAVE_PEM_H - -/* Define to 1 if you have the `perror' function. */ -#undef HAVE_PERROR - -/* Define to 1 if you have the `pipe' function. */ -#undef HAVE_PIPE - -/* if you have the function PK11_CreateGenericObject */ -#undef HAVE_PK11_CREATEGENERICOBJECT - -/* Define to 1 if you have a working poll function. */ -#undef HAVE_POLL - -/* If you have a fine poll */ -#undef HAVE_POLL_FINE - -/* Define to 1 if you have the <poll.h> header file. */ -#undef HAVE_POLL_H - -/* Define to 1 if you have a working POSIX-style strerror_r function. */ -#undef HAVE_POSIX_STRERROR_R - -/* if you have <pthread.h> */ -#undef HAVE_PTHREAD_H - -/* Define to 1 if you have the <pwd.h> header file. */ -#undef HAVE_PWD_H - -/* Define to 1 if you have the `RAND_egd' function. */ -#undef HAVE_RAND_EGD - -/* Define to 1 if you have the `RAND_screen' function. */ -#undef HAVE_RAND_SCREEN - -/* Define to 1 if you have the `RAND_status' function. */ -#undef HAVE_RAND_STATUS - -/* Define to 1 if you have the recv function. */ -#undef HAVE_RECV - -/* Define to 1 if you have the recvfrom function. */ -#undef HAVE_RECVFROM - -/* Define to 1 if you have the <rsa.h> header file. */ -#undef HAVE_RSA_H - -/* Define to 1 if you have the select function. */ -#undef HAVE_SELECT - -/* Define to 1 if you have the send function. */ -#undef HAVE_SEND - -/* Define to 1 if you have the <setjmp.h> header file. */ -#undef HAVE_SETJMP_H - -/* Define to 1 if you have the `setlocale' function. */ -#undef HAVE_SETLOCALE - -/* Define to 1 if you have the `setmode' function. */ -#undef HAVE_SETMODE - -/* Define to 1 if you have the `setrlimit' function. */ -#undef HAVE_SETRLIMIT - -/* Define to 1 if you have the setsockopt function. */ -#undef HAVE_SETSOCKOPT - -/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ -#undef HAVE_SETSOCKOPT_SO_NONBLOCK - -/* Define to 1 if you have the <sgtty.h> header file. */ -#undef HAVE_SGTTY_H - -/* Define to 1 if you have the sigaction function. */ -#undef HAVE_SIGACTION - -/* Define to 1 if you have the siginterrupt function. */ -#undef HAVE_SIGINTERRUPT - -/* Define to 1 if you have the signal function. */ -#undef HAVE_SIGNAL - -/* Define to 1 if you have the <signal.h> header file. */ -#undef HAVE_SIGNAL_H - -/* Define to 1 if you have the sigsetjmp function or macro. */ -#undef HAVE_SIGSETJMP - -/* Define to 1 if sig_atomic_t is an available typedef. */ -#undef HAVE_SIG_ATOMIC_T - -/* Define to 1 if sig_atomic_t is already defined as volatile. */ -#undef HAVE_SIG_ATOMIC_T_VOLATILE - -/* Define to 1 if struct sockaddr_in6 has the sin6_scope_id member */ -#undef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID - -/* Define to 1 if you have the socket function. */ -#undef HAVE_SOCKET - -/* Define to 1 if you have the <socket.h> header file. */ -#undef HAVE_SOCKET_H - -/* Define this if you have the SPNEGO library fbopenssl */ -#undef HAVE_SPNEGO - -/* Define to 1 if you have the `SSL_get_shutdown' function. */ -#undef HAVE_SSL_GET_SHUTDOWN - -/* Define to 1 if you have the <ssl.h> header file. */ -#undef HAVE_SSL_H - -/* Define to 1 if you have the <stdbool.h> header file. */ -#undef HAVE_STDBOOL_H - -/* Define to 1 if you have the <stdint.h> header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the <stdio.h> header file. */ -#undef HAVE_STDIO_H - -/* Define to 1 if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define to 1 if you have the strcasestr function. */ -#undef HAVE_STRCASESTR - -/* Define to 1 if you have the strcmpi function. */ -#undef HAVE_STRCMPI - -/* Define to 1 if you have the strdup function. */ -#undef HAVE_STRDUP - -/* Define to 1 if you have the strerror_r function. */ -#undef HAVE_STRERROR_R - -/* Define to 1 if you have the stricmp function. */ -#undef HAVE_STRICMP - -/* Define to 1 if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the strlcat function. */ -#undef HAVE_STRLCAT - -/* Define to 1 if you have the `strlcpy' function. */ -#undef HAVE_STRLCPY - -/* Define to 1 if you have the strncasecmp function. */ -#undef HAVE_STRNCASECMP - -/* Define to 1 if you have the strncmpi function. */ -#undef HAVE_STRNCMPI - -/* Define to 1 if you have the strnicmp function. */ -#undef HAVE_STRNICMP - -/* Define to 1 if you have the <stropts.h> header file. */ -#undef HAVE_STROPTS_H - -/* Define to 1 if you have the strstr function. */ -#undef HAVE_STRSTR - -/* Define to 1 if you have the strtok_r function. */ -#undef HAVE_STRTOK_R - -/* Define to 1 if you have the strtoll function. */ -#undef HAVE_STRTOLL - -/* if struct sockaddr_storage is defined */ -#undef HAVE_STRUCT_SOCKADDR_STORAGE - -/* Define to 1 if you have the timeval struct. */ -#undef HAVE_STRUCT_TIMEVAL - -/* Define to 1 if you have the <sys/filio.h> header file. */ -#undef HAVE_SYS_FILIO_H - -/* Define to 1 if you have the <sys/ioctl.h> header file. */ -#undef HAVE_SYS_IOCTL_H - -/* Define to 1 if you have the <sys/param.h> header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define to 1 if you have the <sys/poll.h> header file. */ -#undef HAVE_SYS_POLL_H - -/* Define to 1 if you have the <sys/resource.h> header file. */ -#undef HAVE_SYS_RESOURCE_H - -/* Define to 1 if you have the <sys/select.h> header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define to 1 if you have the <sys/socket.h> header file. */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the <sys/sockio.h> header file. */ -#undef HAVE_SYS_SOCKIO_H - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the <sys/time.h> header file. */ -#undef HAVE_SYS_TIME_H - -/* Define to 1 if you have the <sys/types.h> header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the <sys/uio.h> header file. */ -#undef HAVE_SYS_UIO_H - -/* Define to 1 if you have the <sys/un.h> header file. */ -#undef HAVE_SYS_UN_H - -/* Define to 1 if you have the <sys/utime.h> header file. */ -#undef HAVE_SYS_UTIME_H - -/* Define to 1 if you have the <termios.h> header file. */ -#undef HAVE_TERMIOS_H - -/* Define to 1 if you have the <termio.h> header file. */ -#undef HAVE_TERMIO_H - -/* Define to 1 if you have the <time.h> header file. */ -#undef HAVE_TIME_H - -/* Define to 1 if you have the <tld.h> header file. */ -#undef HAVE_TLD_H - -/* Define to 1 if you have the `tld_strerror' function. */ -#undef HAVE_TLD_STRERROR - -/* Define to 1 if you have the `uname' function. */ -#undef HAVE_UNAME - -/* Define to 1 if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H - -/* Define to 1 if you have the `utime' function. */ -#undef HAVE_UTIME - -/* Define to 1 if you have the <utime.h> header file. */ -#undef HAVE_UTIME_H - -/* Define to 1 if compiler supports C99 variadic macro style. */ -#undef HAVE_VARIADIC_MACROS_C99 - -/* Define to 1 if compiler supports old gcc variadic macro style. */ -#undef HAVE_VARIADIC_MACROS_GCC - -/* Define to 1 if you have the winber.h header file. */ -#undef HAVE_WINBER_H - -/* Define to 1 if you have the windows.h header file. */ -#undef HAVE_WINDOWS_H - -/* Define to 1 if you have the winldap.h header file. */ -#undef HAVE_WINLDAP_H - -/* Define to 1 if you have the winsock2.h header file. */ -#undef HAVE_WINSOCK2_H - -/* Define to 1 if you have the winsock.h header file. */ -#undef HAVE_WINSOCK_H - -/* Define this symbol if your OS supports changing the contents of argv */ -#undef HAVE_WRITABLE_ARGV - -/* Define to 1 if you have the writev function. */ -#undef HAVE_WRITEV - -/* Define to 1 if you have the ws2tcpip.h header file. */ -#undef HAVE_WS2TCPIP_H - -/* Define to 1 if you have the <x509.h> header file. */ -#undef HAVE_X509_H - -/* if you have the zlib.h header file */ -#undef HAVE_ZLIB_H - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to 1 if you are building a native Windows target. */ -#undef NATIVE_WINDOWS - -/* Define to 1 if you need the lber.h header file even with ldap.h */ -#undef NEED_LBER_H - -/* Define to 1 if you need the malloc.h header file even with stdlib.h */ -#undef NEED_MALLOC_H - -/* Define to 1 if you need the memory.h header file even with stdlib.h */ -#undef NEED_MEMORY_H - -/* Define to 1 if _REENTRANT preprocessor symbol must be defined. */ -#undef NEED_REENTRANT - -/* Define to 1 if _THREAD_SAFE preprocessor symbol must be defined. */ -#undef NEED_THREAD_SAFE - -/* cpu-machine-OS */ -#undef OS - -/* Name of package */ -#undef PACKAGE - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* a suitable file to read random data from */ -#undef RANDOM_FILE - -/* Define to the type of arg 1 for recvfrom. */ -#undef RECVFROM_TYPE_ARG1 - -/* Define to the type pointed by arg 2 for recvfrom. */ -#undef RECVFROM_TYPE_ARG2 - -/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ -#undef RECVFROM_TYPE_ARG2_IS_VOID - -/* Define to the type of arg 3 for recvfrom. */ -#undef RECVFROM_TYPE_ARG3 - -/* Define to the type of arg 4 for recvfrom. */ -#undef RECVFROM_TYPE_ARG4 - -/* Define to the type pointed by arg 5 for recvfrom. */ -#undef RECVFROM_TYPE_ARG5 - -/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ -#undef RECVFROM_TYPE_ARG5_IS_VOID - -/* Define to the type pointed by arg 6 for recvfrom. */ -#undef RECVFROM_TYPE_ARG6 - -/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ -#undef RECVFROM_TYPE_ARG6_IS_VOID - -/* Define to the function return type for recvfrom. */ -#undef RECVFROM_TYPE_RETV - -/* Define to the type of arg 1 for recv. */ -#undef RECV_TYPE_ARG1 - -/* Define to the type of arg 2 for recv. */ -#undef RECV_TYPE_ARG2 - -/* Define to the type of arg 3 for recv. */ -#undef RECV_TYPE_ARG3 - -/* Define to the type of arg 4 for recv. */ -#undef RECV_TYPE_ARG4 - -/* Define to the function return type for recv. */ -#undef RECV_TYPE_RETV - -/* Define as the return type of signal handlers (`int' or `void'). */ -#undef RETSIGTYPE - -/* Define to the type qualifier of arg 5 for select. */ -#undef SELECT_QUAL_ARG5 - -/* Define to the type of arg 1 for select. */ -#undef SELECT_TYPE_ARG1 - -/* Define to the type of args 2, 3 and 4 for select. */ -#undef SELECT_TYPE_ARG234 - -/* Define to the type of arg 5 for select. */ -#undef SELECT_TYPE_ARG5 - -/* Define to the function return type for select. */ -#undef SELECT_TYPE_RETV - -/* Define to the type qualifier of arg 2 for send. */ -#undef SEND_QUAL_ARG2 - -/* Define to the type of arg 1 for send. */ -#undef SEND_TYPE_ARG1 - -/* Define to the type of arg 2 for send. */ -#undef SEND_TYPE_ARG2 - -/* Define to the type of arg 3 for send. */ -#undef SEND_TYPE_ARG3 - -/* Define to the type of arg 4 for send. */ -#undef SEND_TYPE_ARG4 - -/* Define to the function return type for send. */ -#undef SEND_TYPE_RETV - -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of `off_t', as computed by sizeof. */ -#undef SIZEOF_OFF_T - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - -/* The size of `size_t', as computed by sizeof. */ -#undef SIZEOF_SIZE_T - -/* The size of `time_t', as computed by sizeof. */ -#undef SIZEOF_TIME_T - -/* The size of `void*', as computed by sizeof. */ -#undef SIZEOF_VOIDP - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to the type of arg 3 for strerror_r. */ -#undef STRERROR_R_TYPE_ARG3 - -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ -#undef TIME_WITH_SYS_TIME - -/* Define to enable c-ares support */ -#undef USE_ARES - -/* Define to disable non-blocking sockets. */ -#undef USE_BLOCKING_SOCKETS - -/* if GnuTLS is enabled */ -#undef USE_GNUTLS - -/* if librtmp is in use */ -#undef USE_LIBRTMP - -/* if libSSH2 is in use */ -#undef USE_LIBSSH2 - -/* If you want to build curl with the built-in manual */ -#undef USE_MANUAL - -/* if NSS is enabled */ -#undef USE_NSS - -/* Use OpenLDAP-specific code */ -#undef USE_OPENLDAP - -/* if OpenSSL is in use */ -#undef USE_OPENSSL - -/* if PolarSSL is enabled */ -#undef USE_POLARSSL - -/* if SSL is enabled */ -#undef USE_SSLEAY - -/* if you want POSIX threaded DNS lookup */ -#undef USE_THREADS_POSIX - -/* Define to 1 if you are building a Windows target without large file - support. */ -#undef USE_WIN32_LARGE_FILES - -/* to enable SSPI support */ -#undef USE_WINDOWS_SSPI - -/* Define to 1 if using yaSSL in OpenSSL compatibility mode. */ -#undef USE_YASSLEMUL - -/* Version number of package */ -#undef VERSION - -/* Define to avoid automatic inclusion of winsock.h */ -#undef WIN32_LEAN_AND_MEAN - -/* Define to 1 if OS is AIX. */ -#ifndef _ALL_SOURCE -# undef _ALL_SOURCE -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* Type to use in place of in_addr_t when system does not provide it. */ -#undef in_addr_t - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#undef inline -#endif - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -#undef size_t - -/* the signed version of size_t */ -#undef ssize_t diff --git a/src/curlsrc.vcproj b/src/curlsrc.vcproj deleted file mode 100755 index c453c60..0000000 --- a/src/curlsrc.vcproj +++ /dev/null @@ -1,553 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9.00"
- Name="curlsrc"
- ProjectGUID="{01F90008-9A5F-42AD-9ADB-1E2EADE41CFD}"
- RootNamespace="curlsrc"
- TargetFrameworkVersion="0"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- EnableManagedIncrementalBuild="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\lib;..\include;.;"..\..\openssl-0.9.8h\Win32\include";"..\..\zlib-1.2.3""
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;HAVE_ZLIB_H"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- EnableEnhancedInstructionSet="1"
- PrecompiledHeaderFile=""
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\include"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib ..\..\openssl-0.9.8h\Win32\static\libeay32.lib ..\..\openssl-0.9.8h\Win32\static\ssleay32.lib"
- OutputFile="$(OutDir)\curl.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="1"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- EnableManagedIncrementalBuild="0"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\lib;..\include;.;"..\..\openssl-0.9.8h\Win32\include";"..\..\zlib-1.2.3""
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;CURL_STATICLIB;USE_SSLEAY;USE_OPENSSL;HAVE_ZLIB_H"
- MinimalRebuild="true"
- RuntimeLibrary="1"
- EnableEnhancedInstructionSet="1"
- PrecompiledHeaderFile=""
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- AdditionalIncludeDirectories="..\include"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="ws2_32.lib ..\..\openssl-0.9.8h\Win32\static\libeay32.lib ..\..\openssl-0.9.8h\Win32\static\ssleay32.lib"
- OutputFile="$(OutDir)\curl.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- GenerateDebugInformation="true"
- SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- >
- <File
- RelativePath="curlutil.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="getpass.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="homedir.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="hugehelp.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="main.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\lib\nonblock.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="os-specific.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\lib\rawstr.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\lib\strtoofft.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="urlglob.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="writeenv.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="writeout.c"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- >
- <File
- RelativePath="config-win32.h"
- >
- </File>
- <File
- RelativePath="curlutil.h"
- >
- </File>
- <File
- RelativePath="getpass.h"
- >
- </File>
- <File
- RelativePath="homedir.h"
- >
- </File>
- <File
- RelativePath="hugehelp.h"
- >
- </File>
- <File
- RelativePath="..\lib\nonblock.h"
- >
- </File>
- <File
- RelativePath="os-specific.h"
- >
- </File>
- <File
- RelativePath="..\lib\rawstr.h"
- >
- </File>
- <File
- RelativePath="setup.h"
- >
- </File>
- <File
- RelativePath="..\lib\strtoofft.h"
- >
- </File>
- <File
- RelativePath="urlglob.h"
- >
- </File>
- <File
- RelativePath="version.h"
- >
- </File>
- <File
- RelativePath="writeenv.h"
- >
- </File>
- <File
- RelativePath="writeout.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- >
- <File
- RelativePath="curl.rc"
- >
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions=""
- AdditionalIncludeDirectories=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions=""
- AdditionalIncludeDirectories=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/src/hugehelp.c b/src/hugehelp.c deleted file mode 100644 index 0c1728a..0000000 --- a/src/hugehelp.c +++ /dev/null @@ -1,7061 +0,0 @@ -#include "setup.h" -#ifndef HAVE_LIBZ -/* - * NEVER EVER edit this manually, fix the mkhelp.pl script instead! - * Generation time: Wed Oct 6 19:13:33 2010 - */ -#include "setup.h" -#ifdef USE_MANUAL -#include "hugehelp.h" -#include <stdio.h> -void hugehelp(void) -{ - fputs( -" _ _ ____ _\n" -" Project ___| | | | _ \\| |\n" -" / __| | | | |_) | |\n" -" | (__| |_| | _ <| |___\n" -" \\___|\\___/|_| \\_\\_____|\n" -"\n" -"NAME\n" -" curl - transfer a URL\n" -"\n" -"SYNOPSIS\n" -" curl [options] [URL...]\n" -"\n" -"DESCRIPTION\n" -" curl is a tool to transfer data from or to a server, using one of the\n" -" supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP,\n" -, stdout); - fputs( -" IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS,\n" -" TELNET and TFTP). The command is designed to work without user inter-\n" -" action.\n" -"\n" -" curl offers a busload of useful tricks like proxy support, user authen-\n" -" tication, FTP upload, HTTP post, SSL connections, cookies, file trans-\n" -" fer resume and more. As you will see below, the number of features will\n" -" make your head spin!\n" -"\n" -, stdout); - fputs( -" curl is powered by libcurl for all transfer-related features. See\n" -" libcurl(3) for details.\n" -"\n" -"URL\n" -" The URL syntax is protocol-dependent. You'll find a detailed descrip-\n" -" tion in RFC 3986.\n" -"\n" -" You can specify multiple URLs or parts of URLs by writing part sets\n" -" within braces as in:\n" -"\n" -" http://site.{one,two,three}.com\n" -"\n" -" or you can get sequences of alphanumeric series by using [] as in:\n" -"\n" -" ftp://ftp.numericals.com/file[1-100].txt\n" -, stdout); - fputs( -" ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)\n" -" ftp://ftp.letters.com/file[a-z].txt\n" -"\n" -" Nested sequences are not supported, but you can use several ones next\n" -" to each other:\n" -"\n" -" http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html\n" -"\n" -" You can specify any amount of URLs on the command line. They will be\n" -" fetched in a sequential manner in the specified order.\n" -"\n" -, stdout); - fputs( -" You can specify a step counter for the ranges to get every Nth number\n" -" or letter:\n" -"\n" -" http://www.numericals.com/file[1-100:10].txt\n" -" http://www.letters.com/file[a-z:2].txt\n" -"\n" -" If you specify URL without protocol:// prefix, curl will attempt to\n" -" guess what protocol you might want. It will then default to HTTP but\n" -" try other protocols based on often-used host name prefixes. For exam-\n" -, stdout); - fputs( -" ple, for host names starting with \"ftp.\" curl will assume you want to\n" -" speak FTP.\n" -"\n" -" curl will do its best to use what you pass to it as a URL. It is not\n" -" trying to validate it as a syntactically correct URL by any means but\n" -" is instead very liberal with what it accepts.\n" -"\n" -" Curl will attempt to re-use connections for multiple file transfers, so\n" -" that getting many files from the same server will not do multiple con-\n" -, stdout); - fputs( -" nects / handshakes. This improves speed. Of course this is only done on\n" -" files specified on a single command line and cannot be used between\n" -" separate curl invokes.\n" -"\n" -"PROGRESS METER\n" -" curl normally displays a progress meter during operations, indicating\n" -" the amount of transferred data, transfer speeds and estimated time\n" -" left, etc.\n" -"\n" -" curl displays this data to the terminal by default, so if you invoke\n" -, stdout); - fputs( -" curl to do an operation and it is about to write data to the terminal,\n" -" it disables the progress meter as otherwise it would mess up the output\n" -" mixing progress meter and response data.\n" -"\n" -" If you want a progress meter for HTTP POST or PUT requests, you need to\n" -" redirect the response output to a file, using shell redirect (>), -o\n" -" [file] or similar.\n" -"\n" -" It is not the same case for FTP upload as that operation does not spit\n" -, stdout); - fputs( -" out any response data to the terminal.\n" -"\n" -" If you prefer a progress \"bar\" instead of the regular meter, -# is your\n" -" friend.\n" -"OPTIONS\n" -" In general, all boolean options are enabled with --option and yet again\n" -" disabled with --no-option. That is, you use the exact same option name\n" -" but prefix it with \"no-\". However, in this list we mostly only list and\n" -" show the --option version of them. (This concept with --no options was\n" -, stdout); - fputs( -" added in 7.19.0. Previously most options were toggled on/off on\n" -" repeated use of the same command line option.)\n" -"\n" -" -a/--append\n" -" (FTP/SFTP) When used in an upload, this will tell curl to append\n" -" to the target file instead of overwriting it. If the file\n" -" doesn't exist, it will be created. Note that this flag is\n" -" ignored by some SSH servers (including OpenSSH).\n" -"\n" -" -A/--user-agent <agent string>\n" -, stdout); - fputs( -" (HTTP) Specify the User-Agent string to send to the HTTP server.\n" -" Some badly done CGIs fail if this field isn't set to\n" -" \"Mozilla/4.0\". To encode blanks in the string, surround the\n" -" string with single quote marks. This can also be set with the\n" -" -H/--header option of course.\n" -"\n" -" If this option is set more than once, the last one will be the\n" -" one that's used.\n" -"\n" -" --anyauth\n" -, stdout); - fputs( -" (HTTP) Tells curl to figure out authentication method by itself,\n" -" and use the most secure one the remote site claims to support.\n" -" This is done by first doing a request and checking the response-\n" -" headers, thus possibly inducing an extra network round-trip.\n" -" This is used instead of setting a specific authentication\n" -" method, which you can do with --basic, --digest, --ntlm, and\n" -, stdout); - fputs( -" --negotiate.\n" -"\n" -" Note that using --anyauth is not recommended if you do uploads\n" -" from stdin, since it may require data to be sent twice and then\n" -" the client must be able to rewind. If the need should arise when\n" -" uploading from stdin, the upload operation will fail.\n" -"\n" -" -b/--cookie <name=data>\n" -" (HTTP) Pass the data to the HTTP server as a cookie. It is sup-\n" -, stdout); - fputs( -" posedly the data previously received from the server in a \"Set-\n" -" Cookie:\" line. The data should be in the format \"NAME1=VALUE1;\n" -" NAME2=VALUE2\".\n" -"\n" -" If no '=' symbol is used in the line, it is treated as a file-\n" -" name to use to read previously stored cookie lines from, which\n" -" should be used in this session if they match. Using this method\n" -, stdout); - fputs( -" also activates the \"cookie parser\" which will make curl record\n" -" incoming cookies too, which may be handy if you're using this in\n" -" combination with the -L/--location option. The file format of\n" -" the file to read cookies from should be plain HTTP headers or\n" -" the Netscape/Mozilla cookie file format.\n" -"\n" -" NOTE that the file specified with -b/--cookie is only used as\n" -, stdout); - fputs( -" input. No cookies will be stored in the file. To store cookies,\n" -" use the -c/--cookie-jar option or you could even save the HTTP\n" -" headers to a file using -D/--dump-header!\n" -"\n" -" If this option is set more than once, the last one will be the\n" -" one that's used.\n" -"\n" -" -B/--use-ascii\n" -" Enable ASCII transfer when using FTP or LDAP. For FTP, this can\n" -, stdout); - fputs( -" also be enforced by using an URL that ends with \";type=A\". This\n" -" option causes data sent to stdout to be in text mode for win32\n" -" systems.\n" -"\n" -" --basic\n" -" (HTTP) Tells curl to use HTTP Basic authentication. This is the\n" -" default and this option is usually pointless, unless you use it\n" -" to override a previously set option that sets a different\n" -, stdout); - fputs( -" authentication method (such as --ntlm, --digest, or --negoti-\n" -" ate).\n" -"\n" -" --ciphers <list of ciphers>\n" -" (SSL) Specifies which ciphers to use in the connection. The list\n" -" of ciphers must specify valid ciphers. Read up on SSL cipher\n" -" list details on this URL:\n" -" http://www.openssl.org/docs/apps/ciphers.html\n" -"\n" -, stdout); - fputs( -" NSS ciphers are done differently than OpenSSL and GnuTLS. The\n" -" full list of NSS ciphers is in the NSSCipherSuite entry at this\n" -" URL: http://directory.fedora.redhat.com/docs/mod_nss.html#Direc-\n" -" tives\n" -"\n" -" If this option is used several times, the last one will override\n" -" the others.\n" -"\n" -" --compressed\n" -" (HTTP) Request a compressed response using one of the algorithms\n" -, stdout); - fputs( -" libcurl supports, and return the uncompressed document. If this\n" -" option is used and the server sends an unsupported encoding,\n" -" curl will report an error.\n" -"\n" -" --connect-timeout <seconds>\n" -" Maximum time in seconds that you allow the connection to the\n" -" server to take. This only limits the connection phase, once\n" -" curl has connected this option is of no more use. See also the\n" -, stdout); - fputs( -" -m/--max-time option.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -c/--cookie-jar <file name>\n" -" Specify to which file you want curl to write all cookies after a\n" -" completed operation. Curl writes all cookies previously read\n" -" from a specified file as well as all cookies received from\n" -" remote server(s). If no cookies are known, no file will be writ-\n" -, stdout); - fputs( -" ten. The file will be written using the Netscape cookie file\n" -" format. If you set the file name to a single dash, \"-\", the\n" -" cookies will be written to stdout.\n" -"\n" -" NOTE If the cookie jar can't be created or written to, the whole\n" -" curl operation won't fail or even report an error clearly. Using\n" -" -v will get a warning displayed, but that is the only visible\n" -, stdout); - fputs( -" feedback you get about this possibly lethal situation.\n" -"\n" -" If this option is used several times, the last specified file\n" -" name will be used.\n" -"\n" -" -C/--continue-at <offset>\n" -" Continue/Resume a previous file transfer at the given offset.\n" -" The given offset is the exact number of bytes that will be\n" -" skipped, counting from the beginning of the source file before\n" -, stdout); - fputs( -" it is transferred to the destination. If used with uploads, the\n" -" FTP server command SIZE will not be used by curl.\n" -"\n" -" Use \"-C -\" to tell curl to automatically find out where/how to\n" -" resume the transfer. It then uses the given output/input files\n" -" to figure that out.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --create-dirs\n" -, stdout); - fputs( -" When used in conjunction with the -o option, curl will create\n" -" the necessary local directory hierarchy as needed. This option\n" -" creates the dirs mentioned with the -o option, nothing else. If\n" -" the -o file name uses no dir or if the dirs it mentions already\n" -" exist, no dir will be created.\n" -"\n" -" To create remote directories when using FTP or SFTP, try --ftp-\n" -" create-dirs.\n" -"\n" -, stdout); - fputs( -" --crlf (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).\n" -"\n" -" --crlfile <file>\n" -" (HTTPS/FTPS) Provide a file using PEM format with a Certificate\n" -" Revocation List that may specify peer certificates that are to\n" -" be considered revoked.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" (Added in 7.19.7)\n" -"\n" -" -d/--data <data>\n" -, stdout); - fputs( -" (HTTP) Sends the specified data in a POST request to the HTTP\n" -" server, in the same way that a browser does when a user has\n" -" filled in an HTML form and presses the submit button. This will\n" -" cause curl to pass the data to the server using the content-type\n" -" application/x-www-form-urlencoded. Compare to -F/--form.\n" -"\n" -" -d/--data is the same as --data-ascii. To post data purely\n" -, stdout); - fputs( -" binary, you should instead use the --data-binary option. To URL-\n" -" encode the value of a form field you may use --data-urlencode.\n" -"\n" -" If any of these options is used more than once on the same com-\n" -" mand line, the data pieces specified will be merged together\n" -" with a separating &-symbol. Thus, using '-d name=daniel -d\n" -" skill=lousy' would generate a post chunk that looks like\n" -, stdout); - fputs( -" 'name=daniel&skill=lousy'.\n" -"\n" -" If you start the data with the letter @, the rest should be a\n" -" file name to read the data from, or - if you want curl to read\n" -" the data from stdin. The contents of the file must already be\n" -" URL-encoded. Multiple files can also be specified. Posting data\n" -" from a file named 'foobar' would thus be done with --data @foo-\n" -" bar.\n" -"\n" -" --data-binary <data>\n" -, stdout); - fputs( -" (HTTP) This posts data exactly as specified with no extra pro-\n" -" cessing whatsoever.\n" -"\n" -" If you start the data with the letter @, the rest should be a\n" -" filename. Data is posted in a similar manner as --data-ascii\n" -" does, except that newlines are preserved and conversions are\n" -" never done.\n" -"\n" -" If this option is used several times, the ones following the\n" -, stdout); - fputs( -" first will append data as described in -d/--data.\n" -"\n" -" --data-urlencode <data>\n" -" (HTTP) This posts data, similar to the other --data options with\n" -" the exception that this performs URL-encoding. (Added in 7.18.0)\n" -" To be CGI-compliant, the <data> part should begin with a name\n" -" followed by a separator and a content specification. The <data>\n" -" part can be passed to curl using one of the following syntaxes:\n" -"\n" -, stdout); - fputs( -" content\n" -" This will make curl URL-encode the content and pass that\n" -" on. Just be careful so that the content doesn't contain\n" -" any = or @ symbols, as that will then make the syntax\n" -" match one of the other cases below!\n" -"\n" -" =content\n" -" This will make curl URL-encode the content and pass that\n" -" on. The preceding = symbol is not included in the data.\n" -"\n" -, stdout); - fputs( -" name=content\n" -" This will make curl URL-encode the content part and pass\n" -" that on. Note that the name part is expected to be URL-\n" -" encoded already.\n" -"\n" -" @filename\n" -" This will make curl load data from the given file\n" -" (including any newlines), URL-encode that data and pass\n" -" it on in the POST.\n" -"\n" -" name@filename\n" -, stdout); - fputs( -" This will make curl load data from the given file\n" -" (including any newlines), URL-encode that data and pass\n" -" it on in the POST. The name part gets an equal sign\n" -" appended, resulting in name=urlencoded-file-content. Note\n" -" that the name is expected to be URL-encoded already.\n" -"\n" -" --digest\n" -" (HTTP) Enables HTTP Digest authentication. This is a authentica-\n" -, stdout); - fputs( -" tion that prevents the password from being sent over the wire in\n" -" clear text. Use this in combination with the normal -u/--user\n" -" option to set user name and password. See also --ntlm, --negoti-\n" -" ate and --anyauth for related options.\n" -"\n" -" If this option is used several times, the following occurrences\n" -" make no difference.\n" -"\n" -" --disable-eprt\n" -, stdout); - fputs( -" (FTP) Tell curl to disable the use of the EPRT and LPRT commands\n" -" when doing active FTP transfers. Curl will normally always first\n" -" attempt to use EPRT, then LPRT before using PORT, but with this\n" -" option, it will use PORT right away. EPRT and LPRT are exten-\n" -" sions to the original FTP protocol, and may not work on all\n" -" servers, but they enable more functionality in a better way than\n" -, stdout); - fputs( -" the traditional PORT command.\n" -"\n" -" --eprt can be used to explicitly enable EPRT again and --no-eprt\n" -" is an alias for --disable-eprt.\n" -"\n" -" Disabling EPRT only changes the active behavior. If you want to\n" -" switch to passive mode you need to not use -P/--ftp-port or\n" -" force it with --ftp-pasv.\n" -"\n" -" --disable-epsv\n" -" (FTP) Tell curl to disable the use of the EPSV command when\n" -, stdout); - fputs( -" doing passive FTP transfers. Curl will normally always first\n" -" attempt to use EPSV before PASV, but with this option, it will\n" -" not try using EPSV.\n" -"\n" -" --epsv can be used to explicitly enable EPRT again and --no-epsv\n" -" is an alias for --disable-epsv.\n" -"\n" -" Disabling EPSV only changes the passive behavior. If you want to\n" -" switch to active mode you need to use -P/--ftp-port.\n" -"\n" -" -D/--dump-header <file>\n" -, stdout); - fputs( -" Write the protocol headers to the specified file.\n" -"\n" -" This option is handy to use when you want to store the headers\n" -" that a HTTP site sends to you. Cookies from the headers could\n" -" then be read in a second curl invocation by using the\n" -" -b/--cookie option! The -c/--cookie-jar option is however a bet-\n" -" ter way to store cookies.\n" -"\n" -, stdout); - fputs( -" When used in FTP, the FTP server response lines are considered\n" -" being \"headers\" and thus are saved there.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -e/--referer <URL>\n" -" (HTTP) Sends the \"Referer Page\" information to the HTTP server.\n" -" This can also be set with the -H/--header flag of course. When\n" -" used with -L/--location you can append \";auto\" to the --referer\n" -, stdout); - fputs( -" URL to make curl automatically set the previous URL when it fol-\n" -" lows a Location: header. The \";auto\" string can be used alone,\n" -" even if you don't set an initial --referer.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --engine <name>\n" -" Select the OpenSSL crypto engine to use for cipher operations.\n" -" Use --engine list to print a list of build-time supported\n" -, stdout); - fputs( -" engines. Note that not all (or none) of the engines may be\n" -" available at run-time.\n" -"\n" -" --environment\n" -" (RISC OS ONLY) Sets a range of environment variables, using the\n" -" names the -w option supports, to allow easier extraction of use-\n" -" ful information after having run curl.\n" -"\n" -" --egd-file <file>\n" -" (SSL) Specify the path name to the Entropy Gathering Daemon\n" -, stdout); - fputs( -" socket. The socket is used to seed the random engine for SSL\n" -" connections. See also the --random-file option.\n" -"\n" -" -E/--cert <certificate[:password]>\n" -" (SSL) Tells curl to use the specified certificate file when get-\n" -" ting a file with HTTPS or FTPS. The certificate must be in PEM\n" -" format. If the optional password isn't specified, it will be\n" -" queried for on the terminal. Note that this option assumes a\n" -, stdout); - fputs( -" \"certificate\" file that is the private key and the private cer-\n" -" tificate concatenated! See --cert and --key to specify them\n" -" independently.\n" -"\n" -" If curl is built against the NSS SSL library then this option\n" -" tells curl the nickname of the certificate to use within the NSS\n" -" database defined by the environment variable SSL_DIR (or by\n" -, stdout); - fputs( -" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n" -" nsspem.so) is available then PEM files may be loaded.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --cert-type <type>\n" -" (SSL) Tells curl what certificate type the provided certificate\n" -" is in. PEM, DER and ENG are recognized types. If not specified,\n" -" PEM is assumed.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" --cacert <CA certificate>\n" -" (SSL) Tells curl to use the specified certificate file to verify\n" -" the peer. The file may contain multiple CA certificates. The\n" -" certificate(s) must be in PEM format. Normally curl is built to\n" -" use a default file for this, so this option is typically used to\n" -" alter that default file.\n" -"\n" -, stdout); - fputs( -" curl recognizes the environment variable named 'CURL_CA_BUNDLE'\n" -" if it is set, and uses the given path as a path to a CA cert\n" -" bundle. This option overrides that variable.\n" -"\n" -" The windows version of curl will automatically look for a CA\n" -" certs file named 'curl-ca-bundle.crt', either in the same direc-\n" -" tory as curl.exe, or in the Current Working Directory, or in any\n" -" folder along your PATH.\n" -"\n" -, stdout); - fputs( -" If curl is built against the NSS SSL library then this option\n" -" tells curl the nickname of the CA certificate to use within the\n" -" NSS database defined by the environment variable SSL_DIR (or by\n" -" default /etc/pki/nssdb). If the NSS PEM PKCS#11 module (lib-\n" -" nsspem.so) is available then PEM files may be loaded.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -, stdout); - fputs( -" --capath <CA certificate directory>\n" -" (SSL) Tells curl to use the specified certificate directory to\n" -" verify the peer. The certificates must be in PEM format, and the\n" -" directory must have been processed using the c_rehash utility\n" -" supplied with openssl. Using --capath can allow curl to make\n" -" SSL-connections much more efficiently than using --cacert if the\n" -" --cacert file contains many CA certificates.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" -f/--fail\n" -" (HTTP) Fail silently (no output at all) on server errors. This\n" -" is mostly done to better enable scripts etc to better deal with\n" -" failed attempts. In normal cases when a HTTP server fails to\n" -" deliver a document, it returns an HTML document stating so\n" -" (which often also describes why and more). This flag will pre-\n" -, stdout); - fputs( -" vent curl from outputting that and return error 22.\n" -"\n" -" This method is not fail-safe and there are occasions where non-\n" -" successful response codes will slip through, especially when\n" -" authentication is involved (response codes 401 and 407).\n" -"\n" -" --ftp-account [data]\n" -" (FTP) When an FTP server asks for \"account data\" after user name\n" -" and password has been provided, this data is sent off using the\n" -, stdout); - fputs( -" ACCT command. (Added in 7.13.0)\n" -"\n" -" If this option is used twice, the second will override the pre-\n" -" vious use.\n" -"\n" -" --ftp-create-dirs\n" -" (FTP/SFTP) When an FTP or SFTP URL/operation uses a path that\n" -" doesn't currently exist on the server, the standard behavior of\n" -" curl is to fail. Using this option, curl will instead attempt to\n" -" create missing directories.\n" -"\n" -" --ftp-method [method]\n" -, stdout); - fputs( -" (FTP) Control what method curl should use to reach a file on a\n" -" FTP(S) server. The method argument should be one of the follow-\n" -" ing alternatives:\n" -"\n" -" multicwd\n" -" curl does a single CWD operation for each path part in\n" -" the given URL. For deep hierarchies this means very many\n" -" commands. This is how RFC1738 says it should be done.\n" -, stdout); - fputs( -" This is the default but the slowest behavior.\n" -"\n" -" nocwd curl does no CWD at all. curl will do SIZE, RETR, STOR\n" -" etc and give a full path to the server for all these com-\n" -" mands. This is the fastest behavior.\n" -"\n" -" singlecwd\n" -" curl does one CWD with the full target directory and then\n" -" operates on the file \"normally\" (like in the multicwd\n" -, stdout); - fputs( -" case). This is somewhat more standards compliant than\n" -" 'nocwd' but without the full penalty of 'multicwd'.\n" -" (Added in 7.15.1)\n" -"\n" -" --ftp-pasv\n" -" (FTP) Use passive mode for the data conection. Passive is the\n" -" internal default behavior, but using this option can be used to\n" -" override a previous -P/-ftp-port option. (Added in 7.11.0)\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the following occurrences\n" -" make no difference. Undoing an enforced passive really isn't\n" -" doable but you must then instead enforce the correct -P/--ftp-\n" -" port again.\n" -"\n" -" Passive mode means that curl will try the EPSV command first and\n" -" then PASV, unless --disable-epsv is used.\n" -"\n" -" --ftp-alternative-to-user <command>\n" -, stdout); - fputs( -" (FTP) If authenticating with the USER and PASS commands fails,\n" -" send this command. When connecting to Tumbleweed's Secure\n" -" Transport server over FTPS using a client certificate, using\n" -" \"SITE AUTH\" will tell the server to retrieve the username from\n" -" the certificate. (Added in 7.15.5)\n" -"\n" -" --ftp-skip-pasv-ip\n" -" (FTP) Tell curl to not use the IP address the server suggests in\n" -, stdout); - fputs( -" its response to curl's PASV command when curl connects the data\n" -" connection. Instead curl will re-use the same IP address it\n" -" already uses for the control connection. (Added in 7.14.2)\n" -"\n" -" This option has no effect if PORT, EPRT or EPSV is used instead\n" -" of PASV.\n" -"\n" -" --ftp-pret\n" -" (FTP) Tell curl to send a PRET command before PASV (and EPSV).\n" -, stdout); - fputs( -" Certain FTP servers, mainly drftpd, require this non-standard\n" -" command for directory listings as well as up and downloads in\n" -" PASV mode. (Added in 7.20.x)\n" -"\n" -" --ssl (FTP, POP3, IMAP, SMTP) Try to use SSL/TLS for the connection.\n" -" Reverts to a non-secure connection if the server doesn't support\n" -" SSL/TLS. See also --ftp-ssl-control and --ssl-reqd for differ-\n" -, stdout); - fputs( -" ent levels of encryption required. (Added in 7.20.0)\n" -"\n" -" This option was formerly known as --ftp-ssl (Added in 7.11.0)\n" -" and that can still be used but will be removed in a future ver-\n" -" sion.\n" -"\n" -" --ftp-ssl-control\n" -" (FTP) Require SSL/TLS for the FTP login, clear for transfer.\n" -" Allows secure authentication, but non-encrypted data transfers\n" -, stdout); - fputs( -" for efficiency. Fails the transfer if the server doesn't sup-\n" -" port SSL/TLS. (Added in 7.16.0)\n" -"\n" -" --ssl-reqd\n" -" (FTP, POP3, IMAP, SMTP) Require SSL/TLS for the connection.\n" -" Terminates the connection if the server doesn't support SSL/TLS.\n" -" (Added in 7.20.0)\n" -"\n" -" This option was formerly known as --ftp-ssl-reqd (added in\n" -" 7.15.5) and that can still be used but will be removed in a\n" -, stdout); - fputs( -" future version.\n" -"\n" -" --ftp-ssl-ccc\n" -" (FTP) Use CCC (Clear Command Channel) Shuts down the SSL/TLS\n" -" layer after authenticating. The rest of the control channel com-\n" -" munication will be unencrypted. This allows NAT routers to fol-\n" -" low the FTP transaction. The default mode is passive. See --ftp-\n" -" ssl-ccc-mode for other modes. (Added in 7.16.1)\n" -"\n" -" --ftp-ssl-ccc-mode [active/passive]\n" -, stdout); - fputs( -" (FTP) Use CCC (Clear Command Channel) Sets the CCC mode. The\n" -" passive mode will not initiate the shutdown, but instead wait\n" -" for the server to do it, and will not reply to the shutdown from\n" -" the server. The active mode initiates the shutdown and waits for\n" -" a reply from the server. (Added in 7.16.2)\n" -"\n" -" -F/--form <name=content>\n" -" (HTTP) This lets curl emulate a filled-in form in which a user\n" -, stdout); - fputs( -" has pressed the submit button. This causes curl to POST data\n" -" using the Content-Type multipart/form-data according to RFC2388.\n" -" This enables uploading of binary files etc. To force the 'con-\n" -" tent' part to be a file, prefix the file name with an @ sign. To\n" -" just get the content part from a file, prefix the file name with\n" -" the symbol <. The difference between @ and < is then that @\n" -, stdout); - fputs( -" makes a file get attached in the post as a file upload, while\n" -" the < makes a text field and just get the contents for that text\n" -" field from a file.\n" -"\n" -" Example, to send your password file to the server, where 'pass-\n" -" word' is the name of the form-field to which /etc/passwd will be\n" -" the input:\n" -"\n" -" curl -F password=@/etc/passwd www.mypasswords.com\n" -"\n" -, stdout); - fputs( -" To read the file's content from stdin instead of a file, use -\n" -" where the file name should've been. This goes for both @ and <\n" -" constructs.\n" -"\n" -" You can also tell curl what Content-Type to use by using\n" -" 'type=', in a manner similar to:\n" -"\n" -" curl -F \"web=@index.html;type=text/html\" url.com\n" -"\n" -" or\n" -"\n" -" curl -F \"name=daniel;type=text/foo\" url.com\n" -"\n" -, stdout); - fputs( -" You can also explicitly change the name field of an file upload\n" -" part by setting filename=, like this:\n" -"\n" -" curl -F \"file=@localfile;filename=nameinpost\" url.com\n" -"\n" -" See further examples and details in the MANUAL.\n" -"\n" -" This option can be used multiple times.\n" -"\n" -" --form-string <name=string>\n" -" (HTTP) Similar to --form except that the value string for the\n" -, stdout); - fputs( -" named parameter is used literally. Leading '@' and '<' charac-\n" -" ters, and the ';type=' string in the value have no special mean-\n" -" ing. Use this in preference to --form if there's any possibility\n" -" that the string value may accidentally trigger the '@' or '<'\n" -" features of --form.\n" -"\n" -" -g/--globoff\n" -" This option switches off the \"URL globbing parser\". When you set\n" -, stdout); - fputs( -" this option, you can specify URLs that contain the letters {}[]\n" -" without having them being interpreted by curl itself. Note that\n" -" these letters are not normal legal URL contents but they should\n" -" be encoded according to the URI standard.\n" -"\n" -" -G/--get\n" -" When used, this option will make all data specified with\n" -" -d/--data or --data-binary to be used in a HTTP GET request\n" -, stdout); - fputs( -" instead of the POST request that otherwise would be used. The\n" -" data will be appended to the URL with a '?' separator.\n" -"\n" -" If used in combination with -I, the POST data will instead be\n" -" appended to the URL with a HEAD request.\n" -"\n" -" If this option is used several times, the following occurrences\n" -" make no difference. This is because undoing a GET doesn't make\n" -, stdout); - fputs( -" sense, but you should then instead enforce the alternative\n" -" method you prefer.\n" -"\n" -" -h/--help\n" -" Usage help.\n" -"\n" -" -H/--header <header>\n" -" (HTTP) Extra header to use when getting a web page. You may\n" -" specify any number of extra headers. Note that if you should add\n" -" a custom header that has the same name as one of the internal\n" -, stdout); - fputs( -" ones curl would use, your externally set header will be used\n" -" instead of the internal one. This allows you to make even trick-\n" -" ier stuff than curl would normally do. You should not replace\n" -" internally set headers without knowing perfectly well what\n" -" you're doing. Remove an internal header by giving a replacement\n" -" without content on the right side of the colon, as in: -H\n" -" \"Host:\".\n" -"\n" -, stdout); - fputs( -" curl will make sure that each header you add/replace is sent\n" -" with the proper end-of-line marker, you should thus not add that\n" -" as a part of the header content: do not add newlines or carriage\n" -" returns, they will only mess things up for you.\n" -"\n" -" See also the -A/--user-agent and -e/--referer options.\n" -"\n" -" This option can be used multiple times to add/replace/remove\n" -" multiple headers.\n" -"\n" -, stdout); - fputs( -" --hostpubmd5 <md5>\n" -" Pass a string containing 32 hexadecimal digits. The string\n" -" should be the 128 bit MD5 checksum of the remote host's public\n" -" key, curl will refuse the connection with the host unless the\n" -" md5sums match. This option is only for SCP and SFTP transfers.\n" -" (Added in 7.17.1)\n" -"\n" -" --ignore-content-length\n" -" (HTTP) Ignore the Content-Length header. This is particularly\n" -, stdout); - fputs( -" useful for servers running Apache 1.x, which will report incor-\n" -" rect Content-Length for files larger than 2 gigabytes.\n" -"\n" -" -i/--include\n" -" (HTTP) Include the HTTP-header in the output. The HTTP-header\n" -" includes things like server-name, date of the document, HTTP-\n" -" version and more...\n" -"\n" -" --interface <name>\n" -" Perform an operation using a specified interface. You can enter\n" -, stdout); - fputs( -" interface name, IP address or host name. An example could look\n" -" like:\n" -"\n" -" curl --interface eth0:1 http://www.netscape.com/\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -I/--head\n" -" (HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature\n" -" the command HEAD which this uses to get nothing but the header\n" -" of a document. When used on a FTP or FILE file, curl displays\n" -, stdout); - fputs( -" the file size and last modification time only.\n" -"\n" -" -j/--junk-session-cookies\n" -" (HTTP) When curl is told to read cookies from a given file, this\n" -" option will make it discard all \"session cookies\". This will\n" -" basically have the same effect as if a new session is started.\n" -" Typical browsers always discard session cookies when they're\n" -" closed down.\n" -"\n" -" -J/--remote-header-name\n" -, stdout); - fputs( -" (HTTP) This option tells the -O/--remote-name option to use the\n" -" server-specified Content-Disposition filename instead of\n" -" extracting a filename from the URL.\n" -"\n" -" -k/--insecure\n" -" (SSL) This option explicitly allows curl to perform \"insecure\"\n" -" SSL connections and transfers. All SSL connections are attempted\n" -" to be made secure by using the CA certificate bundle installed\n" -, stdout); - fputs( -" by default. This makes all connections considered \"insecure\"\n" -" fail unless -k/--insecure is used.\n" -"\n" -" See this online resource for further details:\n" -" http://curl.haxx.se/docs/sslcerts.html\n" -"\n" -" --keepalive-time <seconds>\n" -" This option sets the time a connection needs to remain idle\n" -" before sending keepalive probes and the time between individual\n" -, stdout); - fputs( -" keepalive probes. It is currently effective on operating systems\n" -" offering the TCP_KEEPIDLE and TCP_KEEPINTVL socket options\n" -" (meaning Linux, recent AIX, HP-UX and more). This option has no\n" -" effect if --no-keepalive is used. (Added in 7.18.0)\n" -"\n" -" If this option is used multiple times, the last occurrence sets\n" -" the amount.\n" -" --key <key>\n" -, stdout); - fputs( -" (SSL/SSH) Private key file name. Allows you to provide your pri-\n" -" vate key in this separate file.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --key-type <type>\n" -" (SSL) Private key file type. Specify which type your --key pro-\n" -" vided private key is. DER, PEM, and ENG are supported. If not\n" -" specified, PEM is assumed.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" --krb <level>\n" -" (FTP) Enable Kerberos authentication and use. The level must be\n" -" entered and should be one of 'clear', 'safe', 'confidential', or\n" -" 'private'. Should you use a level that is not one of these,\n" -" 'private' will instead be used.\n" -"\n" -" This option requires a library built with kerberos4 or GSSAPI\n" -, stdout); - fputs( -" (GSS-Negotiate) support. This is not very common. Use -V/--ver-\n" -" sion to see if your curl supports it.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -K/--config <config file>\n" -" Specify which config file to read curl arguments from. The con-\n" -" fig file is a text file in which command line arguments can be\n" -" written which then will be used as if they were written on the\n" -, stdout); - fputs( -" actual command line. Options and their parameters must be speci-\n" -" fied on the same config file line, separated by whitespace,\n" -" colon, the equals sign or any combination thereof (however, the\n" -" preferred separator is the equals sign). If the parameter is to\n" -" contain whitespace, the parameter must be enclosed within\n" -" quotes. Within double quotes, the following escape sequences are\n" -, stdout); - fputs( -" available: \\\\, \\\", \\t, \\n, \\r and \\v. A backslash preceding any\n" -" other letter is ignored. If the first column of a config line is\n" -" a '#' character, the rest of the line will be treated as a com-\n" -" ment. Only write one option per physical line in the config\n" -" file.\n" -"\n" -" Specify the filename to -K/--config as '-' to make curl read the\n" -" file from stdin.\n" -"\n" -, stdout); - fputs( -" Note that to be able to specify a URL in the config file, you\n" -" need to specify it using the --url option, and not by simply\n" -" writing the URL on its own line. So, it could look similar to\n" -" this:\n" -"\n" -" url = \"http://curl.haxx.se/docs/\"\n" -"\n" -" Long option names can optionally be given in the config file\n" -" without the initial double dashes.\n" -"\n" -, stdout); - fputs( -" When curl is invoked, it always (unless -q is used) checks for a\n" -" default config file and uses it if found. The default config\n" -" file is checked for in the following places in this order:\n" -"\n" -" 1) curl tries to find the \"home dir\": It first checks for the\n" -" CURL_HOME and then the HOME environment variables. Failing that,\n" -" it uses getpwuid() on UNIX-like systems (which returns the home\n" -, stdout); - fputs( -" dir given the current user in your system). On Windows, it then\n" -" checks for the APPDATA variable, or as a last resort the '%USER-\n" -" PROFILE%\\Application Data'.\n" -"\n" -" 2) On windows, if there is no _curlrc file in the home dir, it\n" -" checks for one in the same dir the curl executable is placed. On\n" -" UNIX-like systems, it will simply try to load .curlrc from the\n" -" determined home dir.\n" -"\n" -, stdout); - fputs( -" # --- Example file ---\n" -" # this is a comment\n" -" url = \"curl.haxx.se\"\n" -" output = \"curlhere.html\"\n" -" user-agent = \"superagent/1.0\"\n" -"\n" -" # and fetch another URL too\n" -" url = \"curl.haxx.se/docs/manpage.html\"\n" -" -O\n" -" referer = \"http://nowhereatall.com/\"\n" -" # --- End of example file ---\n" -"\n" -" This option can be used multiple times to load multiple config\n" -" files.\n" -"\n" -, stdout); - fputs( -" --libcurl <file>\n" -" Append this option to any ordinary curl command line, and you\n" -" will get a libcurl-using source code written to the file that\n" -" does the equivalent of what your command-line operation does!\n" -"\n" -" NOTE: this does not properly support -F and the sending of mul-\n" -" tipart formposts, so in those cases the output program will be\n" -" missing necessary calls to curl_formadd(3), and possibly more.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last given file name\n" -" will be used. (Added in 7.16.1)\n" -"\n" -" --limit-rate <speed>\n" -" Specify the maximum transfer rate you want curl to use. This\n" -" feature is useful if you have a limited pipe and you'd like your\n" -" transfer not to use your entire bandwidth.\n" -"\n" -" The given speed is measured in bytes/second, unless a suffix is\n" -, stdout); - fputs( -" appended. Appending 'k' or 'K' will count the number as kilo-\n" -" bytes, 'm' or M' makes it megabytes, while 'g' or 'G' makes it\n" -" gigabytes. Examples: 200K, 3m and 1G.\n" -"\n" -" The given rate is the average speed counted during the entire\n" -" transfer. It means that curl might use higher transfer speeds in\n" -" short bursts, but over time it uses no more than the given rate.\n" -, stdout); - fputs( -" If you also use the -Y/--speed-limit option, that option will\n" -" take precedence and might cripple the rate-limiting slightly, to\n" -" help keeping the speed-limit logic working.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -l/--list-only\n" -" (FTP) When listing an FTP directory, this switch forces a name-\n" -" only view. Especially useful if you want to machine-parse the\n" -, stdout); - fputs( -" contents of an FTP directory since the normal directory view\n" -" doesn't use a standard look or format.\n" -"\n" -" This option causes an FTP NLST command to be sent. Some FTP\n" -" servers list only files in their response to NLST; they do not\n" -" include subdirectories and symbolic links.\n" -"\n" -" --local-port <num>[-num]\n" -" Set a preferred number or range of local port numbers to use for\n" -, stdout); - fputs( -" the connection(s). Note that port numbers by nature are a\n" -" scarce resource that will be busy at times so setting this range\n" -" to something too narrow might cause unnecessary connection setup\n" -" failures. (Added in 7.15.2)\n" -"\n" -" -L/--location\n" -" (HTTP/HTTPS) If the server reports that the requested page has\n" -" moved to a different location (indicated with a Location: header\n" -, stdout); - fputs( -" and a 3XX response code), this option will make curl redo the\n" -" request on the new place. If used together with -i/--include or\n" -" -I/--head, headers from all requested pages will be shown. When\n" -" authentication is used, curl only sends its credentials to the\n" -" initial host. If a redirect takes curl to a different host, it\n" -" won't be able to intercept the user+password. See also --loca-\n" -, stdout); - fputs( -" tion-trusted on how to change this. You can limit the amount of\n" -" redirects to follow by using the --max-redirs option.\n" -"\n" -" When curl follows a redirect and the request is not a plain GET\n" -" (for example POST or PUT), it will do the following request with\n" -" a GET if the HTTP response was 301, 302, or 303. If the response\n" -" code was any other 3xx code, curl will re-send the following\n" -, stdout); - fputs( -" request using the same unmodified method.\n" -"\n" -" --location-trusted\n" -" (HTTP/HTTPS) Like -L/--location, but will allow sending the name\n" -" + password to all hosts that the site may redirect to. This may\n" -" or may not introduce a security breach if the site redirects you\n" -" to a site to which you'll send your authentication info (which\n" -" is plaintext in the case of HTTP Basic authentication).\n" -"\n" -" --mail-rcpt <address>\n" -, stdout); - fputs( -" (SMTP) Specify a single address that the given mail should get\n" -" sent to. This option can be used multiple times to specify many\n" -" recipients.\n" -"\n" -" (Added in 7.20.0)\n" -"\n" -" --mail-from <address>\n" -" (SMTP) Specify a single address that the given mail should get\n" -" sent from.\n" -"\n" -" (Added in 7.20.0)\n" -"\n" -" --max-filesize <bytes>\n" -" Specify the maximum size (in bytes) of a file to download. If\n" -, stdout); - fputs( -" the file requested is larger than this value, the transfer will\n" -" not start and curl will return with exit code 63.\n" -"\n" -" NOTE: The file size is not always known prior to download, and\n" -" for such files this option has no effect even if the file trans-\n" -" fer ends up being larger than this given limit. This concerns\n" -" both FTP and HTTP transfers.\n" -"\n" -" -m/--max-time <seconds>\n" -, stdout); - fputs( -" Maximum time in seconds that you allow the whole operation to\n" -" take. This is useful for preventing your batch jobs from hang-\n" -" ing for hours due to slow networks or links going down. See\n" -" also the --connect-timeout option.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -M/--manual\n" -" Manual. Display the huge help text.\n" -"\n" -" -n/--netrc\n" -, stdout); - fputs( -" Makes curl scan the .netrc (_netrc on Windows) file in the\n" -" user's home directory for login name and password. This is typi-\n" -" cally used for FTP on UNIX. If used with HTTP, curl will enable\n" -" user authentication. See netrc(4) or ftp(1) for details on the\n" -" file format. Curl will not complain if that file doesn't have\n" -" the right permissions (it should not be either world- or group-\n" -, stdout); - fputs( -" readable). The environment variable \"HOME\" is used to find the\n" -" home directory.\n" -"\n" -" A quick and very simple example of how to setup a .netrc to\n" -" allow curl to FTP to the machine host.domain.com with user name\n" -" 'myself' and password 'secret' should look similar to:\n" -"\n" -" machine host.domain.com login myself password secret\n" -"\n" -" --netrc-optional\n" -, stdout); - fputs( -" Very similar to --netrc, but this option makes the .netrc usage\n" -" optional and not mandatory as the --netrc option does.\n" -"\n" -" --negotiate\n" -" (HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate\n" -" method was designed by Microsoft and is used in their web appli-\n" -" cations. It is primarily meant as a support for Kerberos5\n" -" authentication but may be also used along with another authenti-\n" -, stdout); - fputs( -" cation method. For more information see IETF draft draft-brezak-\n" -" spnego-http-04.txt.\n" -"\n" -" If you want to enable Negotiate for your proxy authentication,\n" -" then use --proxy-negotiate.\n" -"\n" -" This option requires a library built with GSSAPI support. This\n" -" is not very common. Use -V/--version to see if your version sup-\n" -" ports GSS-Negotiate.\n" -"\n" -, stdout); - fputs( -" When using this option, you must also provide a fake -u/--user\n" -" option to activate the authentication code properly. Sending a\n" -" '-u :' is enough as the user name and password from the -u\n" -" option aren't actually used.\n" -"\n" -" If this option is used several times, the following occurrences\n" -" make no difference.\n" -"\n" -" -N/--no-buffer\n" -" Disables the buffering of the output stream. In normal work sit-\n" -, stdout); - fputs( -" uations, curl will use a standard buffered output stream that\n" -" will have the effect that it will output the data in chunks, not\n" -" necessarily exactly when the data arrives. Using this option\n" -" will disable that buffering.\n" -"\n" -" Note that this is the negated option name documented. You can\n" -" thus use --buffer to enforce the buffering.\n" -"\n" -" --no-keepalive\n" -, stdout); - fputs( -" Disables the use of keepalive messages on the TCP connection, as\n" -" by default curl enables them.\n" -"\n" -" Note that this is the negated option name documented. You can\n" -" thus use --keepalive to enforce keepalive.\n" -"\n" -" --no-sessionid\n" -" (SSL) Disable curl's use of SSL session-ID caching. By default\n" -" all transfers are done using the cache. Note that while nothing\n" -, stdout); - fputs( -" should ever get hurt by attempting to reuse SSL session-IDs,\n" -" there seem to be broken SSL implementations in the wild that may\n" -" require you to disable this in order for you to succeed. (Added\n" -" in 7.16.0)\n" -"\n" -" Note that this is the negated option name documented. You can\n" -" thus use --sessionid to enforce session-ID caching.\n" -"\n" -" --noproxy <no-proxy-list>\n" -, stdout); - fputs( -" Comma-separated list of hosts which do not use a proxy, if one\n" -" is specified. The only wildcard is a single * character, which\n" -" matches all hosts, and effectively disables the proxy. Each name\n" -" in this list is matched as either a domain which contains the\n" -" hostname, or the hostname itself. For example, local.com would\n" -" match local.com, local.com:80, and www.local.com, but not\n" -, stdout); - fputs( -" www.notlocal.com. (Added in 7.19.4).\n" -"\n" -" --ntlm (HTTP) Enables NTLM authentication. The NTLM authentication\n" -" method was designed by Microsoft and is used by IIS web servers.\n" -" It is a proprietary protocol, reverse-engineered by clever peo-\n" -" ple and implemented in curl based on their efforts. This kind of\n" -" behavior should not be endorsed, you should encourage everyone\n" -, stdout); - fputs( -" who uses NTLM to switch to a public and documented authentica-\n" -" tion method instead, such as Digest.\n" -"\n" -" If you want to enable NTLM for your proxy authentication, then\n" -" use --proxy-ntlm.\n" -"\n" -" This option requires a library built with SSL support. Use\n" -" -V/--version to see if your curl supports NTLM.\n" -"\n" -" If this option is used several times, the following occurrences\n" -" make no difference.\n" -"\n" -, stdout); - fputs( -" -o/--output <file>\n" -" Write output to <file> instead of stdout. If you are using {} or\n" -" [] to fetch multiple documents, you can use '#' followed by a\n" -" number in the <file> specifier. That variable will be replaced\n" -" with the current string for the URL being fetched. Like in:\n" -"\n" -" curl http://{one,two}.site.com -o \"file_#1.txt\"\n" -"\n" -" or use several variables like:\n" -"\n" -, stdout); - fputs( -" curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n" -"\n" -" You may use this option as many times as the number of URLs you\n" -" have.\n" -"\n" -" See also the --create-dirs option to create the local directo-\n" -" ries dynamically. Specifying the output as '-' (a single dash)\n" -" will force the output to be done to stdout.\n" -"\n" -" -O/--remote-name\n" -" Write output to a local file named like the remote file we get.\n" -, stdout); - fputs( -" (Only the file part of the remote file is used, the path is cut\n" -" off.)\n" -"\n" -" The remote file name to use for saving is extracted from the\n" -" given URL, nothing else.\n" -"\n" -" You may use this option as many times as the number of URLs you\n" -" have.\n" -"\n" -" --remote-name-all\n" -" This option changes the default action for all given URLs to be\n" -, stdout); - fputs( -" dealt with as if -O/--remote-name were used for each one. So if\n" -" you want to disable that for a specific URL after --remote-name-\n" -" all has been used, you must use \"-o -\" or --no-remote-name.\n" -" (Added in 7.19.0)\n" -"\n" -" --pass <phrase>\n" -" (SSL/SSH) Passphrase for the private key\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --post301\n" -, stdout); - fputs( -" Tells curl to respect RFC 2616/10.3.2 and not convert POST\n" -" requests into GET requests when following a 301 redirection. The\n" -" non-RFC behaviour is ubiquitous in web browsers, so curl does\n" -" the conversion by default to maintain consistency. However, a\n" -" server may require a POST to remain a POST after such a redi-\n" -" rection. This option is meaningful only when using -L/--location\n" -, stdout); - fputs( -" (Added in 7.17.1)\n" -"\n" -" --post302\n" -" Tells curl to respect RFC 2616/10.3.2 and not convert POST\n" -" requests into GET requests when following a 302 redirection. The\n" -" non-RFC behaviour is ubiquitous in web browsers, so curl does\n" -" the conversion by default to maintain consistency. However, a\n" -" server may require a POST to remain a POST after such a redi-\n" -, stdout); - fputs( -" rection. This option is meaningful only when using -L/--location\n" -" (Added in 7.19.1)\n" -"\n" -" --proto <protocols>\n" -" Tells curl to use the listed protocols for its initial\n" -" retrieval. Protocols are evaluated left to right, are comma sep-\n" -" arated, and are each a protocol name or 'all', optionally pre-\n" -" fixed by zero or more modifiers. Available modifiers are:\n" -"\n" -, stdout); - fputs( -" + Permit this protocol in addition to protocols already permit-\n" -" ted (this is the default if no modifier is used).\n" -"\n" -" - Deny this protocol, removing it from the list of protocols\n" -" already permitted.\n" -"\n" -" = Permit only this protocol (ignoring the list already permit-\n" -" ted), though subject to later modification by subsequent\n" -" entries in the comma separated list.\n" -"\n" -, stdout); - fputs( -" For example:\n" -"\n" -" --proto -ftps uses the default protocols, but disables ftps\n" -"\n" -" --proto -all,https,+http\n" -" only enables http and https\n" -"\n" -" --proto =http,https\n" -" also only enables http and https\n" -"\n" -" Unknown protocols produce a warning. This allows scripts to\n" -" safely rely on being able to disable potentially dangerous pro-\n" -, stdout); - fputs( -" tocols, without relying upon support for that protocol being\n" -" built into curl to avoid an error.\n" -"\n" -" This option can be used multiple times, in which case the effect\n" -" is the same as concatenating the protocols into one instance of\n" -" the option.\n" -"\n" -" (Added in 7.20.2)\n" -"\n" -" --proto-redir <protocols>\n" -" Tells curl to use the listed protocols after a redirect. See\n" -, stdout); - fputs( -" --proto for how protocols are represented.\n" -"\n" -" (Added in 7.20.2)\n" -"\n" -" --proxy-anyauth\n" -" Tells curl to pick a suitable authentication method when commu-\n" -" nicating with the given proxy. This might cause an extra\n" -" request/response round-trip. (Added in 7.13.2)\n" -"\n" -" --proxy-basic\n" -" Tells curl to use HTTP Basic authentication when communicating\n" -, stdout); - fputs( -" with the given proxy. Use --basic for enabling HTTP Basic with a\n" -" remote host. Basic is the default authentication method curl\n" -" uses with proxies.\n" -"\n" -" --proxy-digest\n" -" Tells curl to use HTTP Digest authentication when communicating\n" -" with the given proxy. Use --digest for enabling HTTP Digest with\n" -" a remote host.\n" -"\n" -" --proxy-negotiate\n" -, stdout); - fputs( -" Tells curl to use HTTP Negotiate authentication when communicat-\n" -" ing with the given proxy. Use --negotiate for enabling HTTP\n" -" Negotiate with a remote host. (Added in 7.17.1)\n" -"\n" -" --proxy-ntlm\n" -" Tells curl to use HTTP NTLM authentication when communicating\n" -" with the given proxy. Use --ntlm for enabling NTLM with a remote\n" -" host.\n" -"\n" -" --proxy1.0 <proxyhost[:port]>\n" -, stdout); - fputs( -" Use the specified HTTP 1.0 proxy. If the port number is not\n" -" specified, it is assumed at port 1080.\n" -"\n" -" The only difference between this and the HTTP proxy option\n" -" (-x/--proxy), is that attempts to use CONNECT through the proxy\n" -" will specify an HTTP 1.0 protocol instead of the default HTTP\n" -" 1.1.\n" -"\n" -" -p/--proxytunnel\n" -" When an HTTP proxy is used (-x/--proxy), this option will cause\n" -, stdout); - fputs( -" non-HTTP protocols to attempt to tunnel through the proxy\n" -" instead of merely using it to do HTTP-like operations. The tun-\n" -" nel approach is made with the HTTP proxy CONNECT request and\n" -" requires that the proxy allows direct connect to the remote port\n" -" number curl wants to tunnel through to.\n" -"\n" -" --pubkey <key>\n" -" (SSH) Public key file name. Allows you to provide your public\n" -, stdout); - fputs( -" key in this separate file.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -P/--ftp-port <address>\n" -" (FTP) Reverses the default initiator/listener roles when con-\n" -" necting with FTP. This switch makes curl use active mode. In\n" -" practice, curl then tells the server to connect back to the\n" -" client's specified address and port, while passive mode asks the\n" -, stdout); - fputs( -" server to setup an IP address and port for it to connect to.\n" -" <address> should be one of:\n" -"\n" -" interface\n" -" i.e \"eth0\" to specify which interface's IP address you\n" -" want to use (Unix only)\n" -"\n" -" IP address\n" -" i.e \"192.168.10.1\" to specify the exact IP address\n" -"\n" -" host name\n" -" i.e \"my.host.domain\" to specify the machine\n" -"\n" -, stdout); - fputs( -" - make curl pick the same IP address that is already used\n" -" for the control connection\n" -"\n" -" If this option is used several times, the last one will be used. Dis-\n" -" able the use of PORT with --ftp-pasv. Disable the attempt to use the\n" -" EPRT command instead of PORT by using --disable-eprt. EPRT is really\n" -" PORT++.\n" -"\n" -" Starting in 7.19.5, you can append \":[start]-[end]\" to the right of the\n" -, stdout); - fputs( -" address, to tell curl what TCP port range to use. That means you spec-\n" -" ify a port range, from a lower to a higher number. A single number\n" -" works as well, but do note that it increases the risk of failure since\n" -" the port may not be available.\n" -"\n" -" -q If used as the first parameter on the command line, the curlrc\n" -" config file will not be read and used. See the -K/--config for\n" -" details on the default config file search path.\n" -"\n" -, stdout); - fputs( -" -Q/--quote <command>\n" -" (FTP/SFTP) Send an arbitrary command to the remote FTP or SFTP\n" -" server. Quote commands are sent BEFORE the transfer takes place\n" -" (just after the initial PWD command in an FTP transfer, to be\n" -" exact). To make commands take place after a successful transfer,\n" -" prefix them with a dash '-'. To make commands be sent after\n" -, stdout); - fputs( -" libcurl has changed the working directory, just before the\n" -" transfer command(s), prefix the command with a '+' (this is only\n" -" supported for FTP). You may specify any number of commands. If\n" -" the server returns failure for one of the commands, the entire\n" -" operation will be aborted. You must send syntactically correct\n" -" FTP commands as RFC959 defines to FTP servers, or one of the\n" -, stdout); - fputs( -" commands listed below to SFTP servers. This option can be used\n" -" multiple times.\n" -"\n" -" SFTP is a binary protocol. Unlike for FTP, libcurl interprets\n" -" SFTP quote commands before sending them to the server. Follow-\n" -" ing is the list of all supported SFTP quote commands:\n" -"\n" -" chgrp group file\n" -" The chgrp command sets the group ID of the file named by\n" -, stdout); - fputs( -" the file operand to the group ID specified by the group\n" -" operand. The group operand is a decimal integer group ID.\n" -"\n" -" chmod mode file\n" -" The chmod command modifies the file mode bits of the\n" -" specified file. The mode operand is an octal integer mode\n" -" number.\n" -"\n" -" chown user file\n" -" The chown command sets the owner of the file named by the\n" -, stdout); - fputs( -" file operand to the user ID specified by the user oper-\n" -" and. The user operand is a decimal integer user ID.\n" -"\n" -" ln source_file target_file\n" -" The ln and symlink commands create a symbolic link at the\n" -" target_file location pointing to the source_file loca-\n" -" tion.\n" -"\n" -" mkdir directory_name\n" -" The mkdir command creates the directory named by the\n" -, stdout); - fputs( -" directory_name operand.\n" -"\n" -" pwd The pwd command returns the absolute pathname of the cur-\n" -" rent working directory.\n" -"\n" -" rename source target\n" -" The rename command renames the file or directory named by\n" -" the source operand to the destination path named by the\n" -" target operand.\n" -"\n" -" rm file\n" -, stdout); - fputs( -" The rm command removes the file specified by the file op-\n" -" erand.\n" -"\n" -" rmdir directory\n" -" The rmdir command removes the directory entry specified\n" -" by the directory operand, provided it is empty.\n" -"\n" -" symlink source_file target_file\n" -" See ln.\n" -"\n" -" --random-file <file>\n" -" (SSL) Specify the path name to file containing what will be con-\n" -, stdout); - fputs( -" sidered as random data. The data is used to seed the random\n" -" engine for SSL connections. See also the --egd-file option.\n" -"\n" -" -r/--range <range>\n" -" (HTTP/FTP/SFTP/FILE) Retrieve a byte range (i.e a partial docu-\n" -" ment) from a HTTP/1.1, FTP or SFTP server or a local FILE.\n" -" Ranges can be specified in a number of ways.\n" -"\n" -" 0-499 specifies the first 500 bytes\n" -"\n" -, stdout); - fputs( -" 500-999 specifies the second 500 bytes\n" -"\n" -" -500 specifies the last 500 bytes\n" -"\n" -" 9500- specifies the bytes from offset 9500 and forward\n" -"\n" -" 0-0,-1 specifies the first and last byte only(*)(H)\n" -"\n" -" 500-700,600-799\n" -" specifies 300 bytes from offset 500(H)\n" -"\n" -" 100-199,500-599\n" -" specifies two separate 100-byte ranges(*)(H)\n" -"\n" -, stdout); - fputs( -" (*) = NOTE that this will cause the server to reply with a multipart\n" -" response!\n" -"\n" -" Only digit characters (0-9) are valid in the 'start' and 'stop' fields\n" -" of the 'start-stop' range syntax. If a non-digit character is given in\n" -" the range, the server's response will be unspecified, depending on the\n" -" server's configuration.\n" -"\n" -" You should also be aware that many HTTP/1.1 servers do not have this\n" -, stdout); - fputs( -" feature enabled, so that when you attempt to get a range, you'll\n" -" instead get the whole document.\n" -"\n" -" FTP and SFTP range downloads only support the simple 'start-stop' syn-\n" -" tax (optionally with one of the numbers omitted). FTP use depends on\n" -" the extended FTP command SIZE.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --raw When used, it disables all internal HTTP decoding of content or\n" -, stdout); - fputs( -" transfer encodings and instead makes them passed on unaltered,\n" -" raw. (Added in 7.16.2)\n" -"\n" -" -R/--remote-time\n" -" When used, this will make libcurl attempt to figure out the\n" -" timestamp of the remote file, and if that is available make the\n" -" local file get that same timestamp.\n" -"\n" -" --retry <num>\n" -" If a transient error is returned when curl tries to perform a\n" -, stdout); - fputs( -" transfer, it will retry this number of times before giving up.\n" -" Setting the number to 0 makes curl do no retries (which is the\n" -" default). Transient error means either: a timeout, an FTP 4xx\n" -" response code or an HTTP 5xx response code.\n" -"\n" -" When curl is about to retry a transfer, it will first wait one\n" -" second and then for all forthcoming retries it will double the\n" -, stdout); - fputs( -" waiting time until it reaches 10 minutes which then will be the\n" -" delay between the rest of the retries. By using --retry-delay\n" -" you disable this exponential backoff algorithm. See also\n" -" --retry-max-time to limit the total time allowed for retries.\n" -" (Added in 7.12.3)\n" -"\n" -" If this option is used multiple times, the last occurrence\n" -" decide the amount.\n" -"\n" -" --retry-delay <seconds>\n" -, stdout); - fputs( -" Make curl sleep this amount of time before each retry when a\n" -" transfer has failed with a transient error (it changes the\n" -" default backoff time algorithm between retries). This option is\n" -" only interesting if --retry is also used. Setting this delay to\n" -" zero will make curl use the default backoff time. (Added in\n" -" 7.12.3)\n" -"\n" -" If this option is used multiple times, the last occurrence\n" -, stdout); - fputs( -" determines the amount.\n" -"\n" -" --retry-max-time <seconds>\n" -" The retry timer is reset before the first transfer attempt.\n" -" Retries will be done as usual (see --retry) as long as the timer\n" -" hasn't reached this given limit. Notice that if the timer hasn't\n" -" reached the limit, the request will be made and while perform-\n" -" ing, it may take longer than this given time period. To limit a\n" -, stdout); - fputs( -" single request's maximum time, use -m/--max-time. Set this\n" -" option to zero to not timeout retries. (Added in 7.12.3)\n" -"\n" -" If this option is used multiple times, the last occurrence\n" -" determines the amount.\n" -"\n" -" -s/--silent\n" -" Silent or quiet mode. Don't show progress meter or error mes-\n" -" sages. Makes Curl mute.\n" -"\n" -" -S/--show-error\n" -, stdout); - fputs( -" When used with -s it makes curl show an error message if it\n" -" fails.\n" -"\n" -" --socks4 <host[:port]>\n" -" Use the specified SOCKS4 proxy. If the port number is not speci-\n" -" fied, it is assumed at port 1080. (Added in 7.15.2)\n" -"\n" -" This option overrides any previous use of -x/--proxy, as they\n" -" are mutually exclusive.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -, stdout); - fputs( -" --socks4a <host[:port]>\n" -" Use the specified SOCKS4a proxy. If the port number is not spec-\n" -" ified, it is assumed at port 1080. (Added in 7.18.0)\n" -"\n" -" This option overrides any previous use of -x/--proxy, as they\n" -" are mutually exclusive.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --socks5-hostname <host[:port]>\n" -" Use the specified SOCKS5 proxy (and let the proxy resolve the\n" -, stdout); - fputs( -" host name). If the port number is not specified, it is assumed\n" -" at port 1080. (Added in 7.18.0)\n" -"\n" -" This option overrides any previous use of -x/--proxy, as they\n" -" are mutually exclusive.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -" (This option was previously wrongly documented and used as\n" -" --socks without the number appended.)\n" -"\n" -" --socks5 <host[:port]>\n" -, stdout); - fputs( -" Use the specified SOCKS5 proxy - but resolve the host name\n" -" locally. If the port number is not specified, it is assumed at\n" -" port 1080.\n" -"\n" -" This option overrides any previous use of -x/--proxy, as they\n" -" are mutually exclusive.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -" (This option was previously wrongly documented and used as\n" -, stdout); - fputs( -" --socks without the number appended.)\n" -"\n" -" This option (as well as --socks4) does not work with IPV6, FTPS\n" -" or LDAP.\n" -"\n" -" --socks5-gssapi-service <servicename>\n" -" The default service name for a socks server is rcmd/server-fqdn.\n" -" This option allows you to change it.\n" -"\n" -" Examples:\n" -" --socks5 proxy-name --socks5-gssapi-service sockd would use\n" -" sockd/proxy-name\n" -, stdout); - fputs( -" --socks5 proxy-name --socks5-gssapi-service sockd/real-name\n" -" would use sockd/real-name for cases where the proxy-name does\n" -" not match the princpal name.\n" -" (Added in 7.19.4).\n" -"\n" -" --socks5-gssapi-nec\n" -" As part of the gssapi negotiation a protection mode is negoti-\n" -" ated. The rfc1961 says in section 4.3/4.4 it should be pro-\n" -" tected, but the NEC reference implementation does not. The\n" -, stdout); - fputs( -" option --socks5-gssapi-nec allows the unprotected exchange of\n" -" the protection mode negotiation. (Added in 7.19.4).\n" -"\n" -" --stderr <file>\n" -" Redirect all writes to stderr to the specified file instead. If\n" -" the file name is a plain '-', it is instead written to stdout.\n" -" This option has no point when you're using a shell with decent\n" -" redirecting capabilities.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" --tcp-nodelay\n" -" Turn on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n" -" page for details about this option. (Added in 7.11.2)\n" -"\n" -" -t/--telnet-option <OPT=val>\n" -" Pass options to the telnet protocol. Supported options are:\n" -"\n" -" TTYPE=<term> Sets the terminal type.\n" -"\n" -" XDISPLOC=<X display> Sets the X display location.\n" -"\n" -, stdout); - fputs( -" NEW_ENV=<var,val> Sets an environment variable.\n" -"\n" -" --tftp-blksize <value>\n" -" (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n" -" size that curl will try to use when tranferring data to or from\n" -" a TFTP server. By default 512 bytes will be used.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" (Added in 7.20.0)\n" -"\n" -" -T/--upload-file <file>\n" -, stdout); - fputs( -" This transfers the specified local file to the remote URL. If\n" -" there is no file part in the specified URL, Curl will append the\n" -" local file name. NOTE that you must use a trailing / on the last\n" -" directory to really prove to Curl that there is no file name or\n" -" curl will think that your last directory name is the remote file\n" -" name to use. That will most likely cause the upload operation to\n" -, stdout); - fputs( -" fail. If this is used on a HTTP(S) server, the PUT command will\n" -" be used.\n" -"\n" -" Use the file name \"-\" (a single dash) to use stdin instead of a\n" -" given file. Alternately, the file name \".\" (a single period)\n" -" may be specified instead of \"-\" to use stdin in non-blocking\n" -" mode to allow reading server output while stdin is being\n" -" uploaded.\n" -"\n" -, stdout); - fputs( -" You can specify one -T for each URL on the command line. Each -T\n" -" + URL pair specifies what to upload and to where. curl also sup-\n" -" ports \"globbing\" of the -T argument, meaning that you can upload\n" -" multiple files to a single URL by using the same URL globbing\n" -" style supported in the URL, like this:\n" -"\n" -" curl -T \"{file1,file2}\" http://www.uploadtothissite.com\n" -"\n" -" or even\n" -"\n" -, stdout); - fputs( -" curl -T \"img[1-1000].png\" ftp://ftp.picturemania.com/upload/\n" -"\n" -" --trace <file>\n" -" Enables a full trace dump of all incoming and outgoing data,\n" -" including descriptive information, to the given output file. Use\n" -" \"-\" as filename to have the output sent to stdout.\n" -"\n" -" This option overrides previous uses of -v/--verbose or --trace-\n" -" ascii.\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" --trace-ascii <file>\n" -" Enables a full trace dump of all incoming and outgoing data,\n" -" including descriptive information, to the given output file. Use\n" -" \"-\" as filename to have the output sent to stdout.\n" -"\n" -" This is very similar to --trace, but leaves out the hex part and\n" -" only shows the ASCII part of the dump. It makes smaller output\n" -, stdout); - fputs( -" that might be easier to read for untrained humans.\n" -"\n" -" This option overrides previous uses of -v/--verbose or --trace.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --trace-time\n" -" Prepends a time stamp to each trace or verbose line that curl\n" -" displays. (Added in 7.14.0)\n" -"\n" -" -u/--user <user:password>\n" -" Specify the user name and password to use for server authentica-\n" -, stdout); - fputs( -" tion. Overrides -n/--netrc and --netrc-optional.\n" -"\n" -" If you just give the user name (without entering a colon) curl\n" -" will prompt for a password.\n" -"\n" -" If you use an SSPI-enabled curl binary and do NTLM authentica-\n" -" tion, you can force curl to pick up the user name and password\n" -" from your environment by simply specifying a single colon with\n" -" this option: \"-u :\".\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" -U/--proxy-user <user:password>\n" -" Specify the user name and password to use for proxy authentica-\n" -" tion.\n" -"\n" -" If you use an SSPI-enabled curl binary and do NTLM authentica-\n" -" tion, you can force curl to pick up the user name and password\n" -" from your environment by simply specifying a single colon with\n" -" this option: \"-U :\".\n" -"\n" -, stdout); - fputs( -" If this option is used several times, the last one will be used.\n" -"\n" -" --url <URL>\n" -" Specify a URL to fetch. This option is mostly handy when you\n" -" want to specify URL(s) in a config file.\n" -"\n" -" This option may be used any number of times. To control where\n" -" this URL is written, use the -o/--output or the -O/--remote-name\n" -" options.\n" -"\n" -" -v/--verbose\n" -, stdout); - fputs( -" Makes the fetching more verbose/talkative. Mostly useful for\n" -" debugging. A line starting with '>' means \"header data\" sent by\n" -" curl, '<' means \"header data\" received by curl that is hidden in\n" -" normal cases, and a line starting with '*' means additional info\n" -" provided by curl.\n" -"\n" -" Note that if you only want HTTP headers in the output,\n" -" -i/--include might be the option you're looking for.\n" -"\n" -, stdout); - fputs( -" If you think this option still doesn't give you enough details,\n" -" consider using --trace or --trace-ascii instead.\n" -"\n" -" This option overrides previous uses of --trace-ascii or --trace.\n" -"\n" -" Use -S/--silent to make curl quiet.\n" -"\n" -" -V/--version\n" -" Displays information about curl and the libcurl version it uses.\n" -" The first line includes the full version of curl, libcurl and\n" -, stdout); - fputs( -" other 3rd party libraries linked with the executable.\n" -"\n" -" The second line (starts with \"Protocols:\") shows all protocols\n" -" that libcurl reports to support.\n" -"\n" -" The third line (starts with \"Features:\") shows specific features\n" -" libcurl reports to offer. Available features include:\n" -"\n" -" IPv6 You can use IPv6 with this.\n" -"\n" -" krb4 Krb4 for FTP is supported.\n" -"\n" -" SSL HTTPS and FTPS are supported.\n" -"\n" -, stdout); - fputs( -" libz Automatic decompression of compressed files over HTTP is\n" -" supported.\n" -"\n" -" NTLM NTLM authentication is supported.\n" -"\n" -" GSS-Negotiate\n" -" Negotiate authentication and krb5 for FTP is supported.\n" -"\n" -" Debug This curl uses a libcurl built with Debug. This enables\n" -" more error-tracking and memory debugging etc. For curl-\n" -" developers only!\n" -"\n" -" AsynchDNS\n" -, stdout); - fputs( -" This curl uses asynchronous name resolves.\n" -"\n" -" SPNEGO SPNEGO Negotiate authentication is supported.\n" -"\n" -" Largefile\n" -" This curl supports transfers of large files, files larger\n" -" than 2GB.\n" -"\n" -" IDN This curl supports IDN - international domain names.\n" -"\n" -" SSPI SSPI is supported. If you use NTLM and set a blank user\n" -, stdout); - fputs( -" name, curl will authenticate with your current user and\n" -" password.\n" -"\n" -" -w/--write-out <format>\n" -" Defines what to display on stdout after a completed and success-\n" -" ful operation. The format is a string that may contain plain\n" -" text mixed with any number of variables. The string can be spec-\n" -" ified as \"string\", to get read from a particular file you spec-\n" -, stdout); - fputs( -" ify it \"@filename\" and to tell curl to read the format from\n" -" stdin you write \"@-\".\n" -"\n" -" The variables present in the output format will be substituted\n" -" by the value or text that curl thinks fit, as described below.\n" -" All variables are specified as %{variable_name} and to output a\n" -" normal % you just write them as %%. You can output a newline by\n" -, stdout); - fputs( -" using \\n, a carriage return with \\r and a tab space with \\t.\n" -"\n" -" NOTE: The %-symbol is a special symbol in the win32-environment,\n" -" where all occurrences of % must be doubled when using this\n" -" option.\n" -"\n" -" The variables available at this point are:\n" -"\n" -" url_effective The URL that was fetched last. This is most mean-\n" -" ingful if you've told curl to follow location:\n" -, stdout); - fputs( -" headers.\n" -"\n" -" http_code The numerical response code that was found in the\n" -" last retrieved HTTP(S) or FTP(s) transfer. In\n" -" 7.18.2 the alias response_code was added to show\n" -" the same info.\n" -"\n" -" http_connect The numerical code that was found in the last\n" -" response (from a proxy) to a curl CONNECT\n" -, stdout); - fputs( -" request. (Added in 7.12.4)\n" -"\n" -" time_total The total time, in seconds, that the full opera-\n" -" tion lasted. The time will be displayed with mil-\n" -" lisecond resolution.\n" -"\n" -" time_namelookup\n" -" The time, in seconds, it took from the start\n" -" until the name resolving was completed.\n" -"\n" -, stdout); - fputs( -" time_connect The time, in seconds, it took from the start\n" -" until the TCP connect to the remote host (or\n" -" proxy) was completed.\n" -"\n" -" time_appconnect\n" -" The time, in seconds, it took from the start\n" -" until the SSL/SSH/etc connect/handshake to the\n" -" remote host was completed. (Added in 7.19.0)\n" -"\n" -, stdout); - fputs( -" time_pretransfer\n" -" The time, in seconds, it took from the start\n" -" until the file transfer was just about to begin.\n" -" This includes all pre-transfer commands and nego-\n" -" tiations that are specific to the particular pro-\n" -" tocol(s) involved.\n" -"\n" -" time_redirect The time, in seconds, it took for all redirection\n" -, stdout); - fputs( -" steps include name lookup, connect, pretransfer\n" -" and transfer before the final transaction was\n" -" started. time_redirect shows the complete execu-\n" -" tion time for multiple redirections. (Added in\n" -" 7.12.3)\n" -"\n" -" time_starttransfer\n" -" The time, in seconds, it took from the start\n" -, stdout); - fputs( -" until the first byte was just about to be trans-\n" -" ferred. This includes time_pretransfer and also\n" -" the time the server needed to calculate the\n" -" result.\n" -"\n" -" size_download The total amount of bytes that were downloaded.\n" -"\n" -" size_upload The total amount of bytes that were uploaded.\n" -"\n" -, stdout); - fputs( -" size_header The total amount of bytes of the downloaded head-\n" -" ers.\n" -"\n" -" size_request The total amount of bytes that were sent in the\n" -" HTTP request.\n" -"\n" -" speed_download The average download speed that curl measured for\n" -" the complete download. Bytes per second.\n" -"\n" -" speed_upload The average upload speed that curl measured for\n" -, stdout); - fputs( -" the complete upload. Bytes per second.\n" -"\n" -" content_type The Content-Type of the requested document, if\n" -" there was any.\n" -"\n" -" num_connects Number of new connects made in the recent trans-\n" -" fer. (Added in 7.12.3)\n" -"\n" -" num_redirects Number of redirects that were followed in the\n" -" request. (Added in 7.12.3)\n" -"\n" -, stdout); - fputs( -" redirect_url When a HTTP request was made without -L to follow\n" -" redirects, this variable will show the actual URL\n" -" a redirect would take you to. (Added in 7.18.2)\n" -"\n" -" ftp_entry_path The initial path libcurl ended up in when logging\n" -" on to the remote FTP server. (Added in 7.15.4)\n" -"\n" -" ssl_verify_result\n" -, stdout); - fputs( -" The result of the SSL peer certificate verifica-\n" -" tion that was requested. 0 means the verification\n" -" was successful. (Added in 7.19.0)\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -x/--proxy <proxyhost[:port]>\n" -" Use the specified HTTP proxy. If the port number is not speci-\n" -" fied, it is assumed at port 1080.\n" -"\n" -, stdout); - fputs( -" This option overrides existing environment variables that set\n" -" the proxy to use. If there's an environment variable setting a\n" -" proxy, you can set proxy to \"\" to override it.\n" -"\n" -" Note that all operations that are performed over a HTTP proxy\n" -" will transparently be converted to HTTP. It means that certain\n" -" protocol specific operations might not be available. This is not\n" -, stdout); - fputs( -" the case if you can tunnel through the proxy, as done with the\n" -" -p/--proxytunnel option.\n" -"\n" -" Starting with 7.14.1, the proxy host can be specified the exact\n" -" same way as the proxy environment variables, including the pro-\n" -" tocol prefix (http://) and the embedded user + password.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -X/--request <command>\n" -, stdout); - fputs( -" (HTTP) Specifies a custom request method to use when communicat-\n" -" ing with the HTTP server. The specified request will be used\n" -" instead of the method otherwise used (which defaults to GET).\n" -" Read the HTTP 1.1 specification for details and explanations.\n" -" Common additional HTTP requests include PUT and DELETE, but\n" -" related technologies like WebDAV offers PROPFIND, COPY, MOVE and\n" -" more.\n" -"\n" -, stdout); - fputs( -" (FTP) Specifies a custom FTP command to use instead of LIST when\n" -" doing file lists with FTP.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -y/--speed-time <time>\n" -" If a download is slower than speed-limit bytes per second during\n" -" a speed-time period, the download gets aborted. If speed-time is\n" -" used, the default speed-limit will be 1 unless set with -Y.\n" -"\n" -, stdout); - fputs( -" This option controls transfers and thus will not affect slow\n" -" connects etc. If this is a concern for you, try the --connect-\n" -" timeout option.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -Y/--speed-limit <speed>\n" -" If a download is slower than this given speed (in bytes per sec-\n" -" ond) for speed-time seconds it gets aborted. speed-time is set\n" -, stdout); - fputs( -" with -y and is 30 if not set.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -z/--time-cond <date expression>\n" -" (HTTP/FTP) Request a file that has been modified later than the\n" -" given time and date, or one that has been modified before that\n" -" time. The date expression can be all sorts of date strings or if\n" -" it doesn't match any internal ones, it tries to get the time\n" -, stdout); - fputs( -" from a given file name instead! See the curl_getdate(3) man\n" -" pages for date expression details.\n" -"\n" -" Start the date expression with a dash (-) to make it request for\n" -" a document that is older than the given date/time, default is a\n" -" document that is newer than the specified date/time.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" --max-redirs <num>\n" -, stdout); - fputs( -" Set maximum number of redirection-followings allowed. If\n" -" -L/--location is used, this option can be used to prevent curl\n" -" from following redirections \"in absurdum\". By default, the limit\n" -" is set to 50 redirections. Set this option to -1 to make it lim-\n" -" itless.\n" -"\n" -" If this option is used several times, the last one will be used.\n" -"\n" -" -0/--http1.0\n" -, stdout); - fputs( -" (HTTP) Forces curl to issue its requests using HTTP 1.0 instead\n" -" of using its internally preferred: HTTP 1.1.\n" -"\n" -" -1/--tlsv1\n" -" (SSL) Forces curl to use TLS version 1 when negotiating with a\n" -" remote TLS server.\n" -"\n" -" -2/--sslv2\n" -" (SSL) Forces curl to use SSL version 2 when negotiating with a\n" -" remote SSL server.\n" -"\n" -" -3/--sslv3\n" -" (SSL) Forces curl to use SSL version 3 when negotiating with a\n" -, stdout); - fputs( -" remote SSL server.\n" -"\n" -" -4/--ipv4\n" -" If libcurl is capable of resolving an address to multiple IP\n" -" versions (which it is if it is IPv6-capable), this option tells\n" -" libcurl to resolve names to IPv4 addresses only.\n" -"\n" -" -6/--ipv6\n" -" If libcurl is capable of resolving an address to multiple IP\n" -" versions (which it is if it is IPv6-capable), this option tells\n" -, stdout); - fputs( -" libcurl to resolve names to IPv6 addresses only.\n" -"\n" -" -#/--progress-bar\n" -" Make curl display progress information as a progress bar instead\n" -" of the default statistics.\n" -"\n" -"FILES\n" -" ~/.curlrc\n" -" Default config file, see -K/--config for details.\n" -"\n" -"ENVIRONMENT\n" -" The environment variables can be specified in lower case or upper case.\n" -" The lower case version has precedence. http_proxy is an exception as it\n" -, stdout); - fputs( -" is only available in lower case.\n" -"\n" -" http_proxy [protocol://]<host>[:port]\n" -" Sets the proxy server to use for HTTP.\n" -" HTTPS_PROXY [protocol://]<host>[:port]\n" -" Sets the proxy server to use for HTTPS.\n" -"\n" -" FTP_PROXY [protocol://]<host>[:port]\n" -" Sets the proxy server to use for FTP.\n" -"\n" -" ALL_PROXY [protocol://]<host>[:port]\n" -" Sets the proxy server to use if no protocol-specific proxy is\n" -" set.\n" -"\n" -, stdout); - fputs( -" NO_PROXY <comma-separated list of hosts>\n" -" list of host names that shouldn't go through any proxy. If set\n" -" to a asterisk '*' only, it matches all hosts.\n" -"\n" -"EXIT CODES\n" -" There are a bunch of different error codes and their corresponding\n" -" error messages that may appear during bad conditions. At the time of\n" -" this writing, the exit codes are:\n" -"\n" -" 1 Unsupported protocol. This build of curl has no support for this\n" -, stdout); - fputs( -" protocol.\n" -"\n" -" 2 Failed to initialize.\n" -"\n" -" 3 URL malformed. The syntax was not correct.\n" -"\n" -" 5 Couldn't resolve proxy. The given proxy host could not be\n" -" resolved.\n" -"\n" -" 6 Couldn't resolve host. The given remote host was not resolved.\n" -"\n" -" 7 Failed to connect to host.\n" -"\n" -" 8 FTP weird server reply. The server sent data curl couldn't\n" -" parse.\n" -"\n" -, stdout); - fputs( -" 9 FTP access denied. The server denied login or denied access to\n" -" the particular resource or directory you wanted to reach. Most\n" -" often you tried to change to a directory that doesn't exist on\n" -" the server.\n" -"\n" -" 11 FTP weird PASS reply. Curl couldn't parse the reply sent to the\n" -" PASS request.\n" -"\n" -" 13 FTP weird PASV reply, Curl couldn't parse the reply sent to the\n" -" PASV request.\n" -"\n" -, stdout); - fputs( -" 14 FTP weird 227 format. Curl couldn't parse the 227-line the\n" -" server sent.\n" -"\n" -" 15 FTP can't get host. Couldn't resolve the host IP we got in the\n" -" 227-line.\n" -"\n" -" 17 FTP couldn't set binary. Couldn't change transfer method to\n" -" binary.\n" -"\n" -" 18 Partial file. Only a part of the file was transferred.\n" -"\n" -" 19 FTP couldn't download/access the given file, the RETR (or simi-\n" -" lar) command failed.\n" -"\n" -, stdout); - fputs( -" 21 FTP quote error. A quote command returned error from the server.\n" -" 22 HTTP page not retrieved. The requested url was not found or\n" -" returned another error with the HTTP error code being 400 or\n" -" above. This return code only appears if -f/--fail is used.\n" -"\n" -" 23 Write error. Curl couldn't write data to a local filesystem or\n" -" similar.\n" -"\n" -" 25 FTP couldn't STOR file. The server denied the STOR operation,\n" -, stdout); - fputs( -" used for FTP uploading.\n" -"\n" -" 26 Read error. Various reading problems.\n" -"\n" -" 27 Out of memory. A memory allocation request failed.\n" -"\n" -" 28 Operation timeout. The specified time-out period was reached\n" -" according to the conditions.\n" -"\n" -" 30 FTP PORT failed. The PORT command failed. Not all FTP servers\n" -" support the PORT command, try doing a transfer using PASV\n" -" instead!\n" -"\n" -, stdout); - fputs( -" 31 FTP couldn't use REST. The REST command failed. This command is\n" -" used for resumed FTP transfers.\n" -"\n" -" 33 HTTP range error. The range \"command\" didn't work.\n" -"\n" -" 34 HTTP post error. Internal post-request generation error.\n" -"\n" -" 35 SSL connect error. The SSL handshaking failed.\n" -"\n" -" 36 FTP bad download resume. Couldn't continue an earlier aborted\n" -" download.\n" -"\n" -, stdout); - fputs( -" 37 FILE couldn't read file. Failed to open the file. Permissions?\n" -"\n" -" 38 LDAP cannot bind. LDAP bind operation failed.\n" -"\n" -" 39 LDAP search failed.\n" -"\n" -" 41 Function not found. A required LDAP function was not found.\n" -"\n" -" 42 Aborted by callback. An application told curl to abort the oper-\n" -" ation.\n" -"\n" -" 43 Internal error. A function was called with a bad parameter.\n" -"\n" -, stdout); - fputs( -" 45 Interface error. A specified outgoing interface could not be\n" -" used.\n" -"\n" -" 47 Too many redirects. When following redirects, curl hit the maxi-\n" -" mum amount.\n" -"\n" -" 48 Unknown TELNET option specified.\n" -"\n" -" 49 Malformed telnet option.\n" -"\n" -" 51 The peer's SSL certificate or SSH MD5 fingerprint was not ok.\n" -"\n" -" 52 The server didn't reply anything, which here is considered an\n" -" error.\n" -"\n" -, stdout); - fputs( -" 53 SSL crypto engine not found.\n" -"\n" -" 54 Cannot set SSL crypto engine as default.\n" -"\n" -" 55 Failed sending network data.\n" -"\n" -" 56 Failure in receiving network data.\n" -"\n" -" 58 Problem with the local certificate.\n" -"\n" -" 59 Couldn't use specified SSL cipher.\n" -"\n" -" 60 Peer certificate cannot be authenticated with known CA certifi-\n" -" cates.\n" -"\n" -" 61 Unrecognized transfer encoding.\n" -"\n" -" 62 Invalid LDAP URL.\n" -"\n" -, stdout); - fputs( -" 63 Maximum file size exceeded.\n" -"\n" -" 64 Requested FTP SSL level failed.\n" -"\n" -" 65 Sending the data requires a rewind that failed.\n" -"\n" -" 66 Failed to initialise SSL Engine.\n" -"\n" -" 67 The user name, password, or similar was not accepted and curl\n" -" failed to log in.\n" -"\n" -" 68 File not found on TFTP server.\n" -"\n" -" 69 Permission problem on TFTP server.\n" -"\n" -" 70 Out of disk space on TFTP server.\n" -"\n" -" 71 Illegal TFTP operation.\n" -"\n" -, stdout); - fputs( -" 72 Unknown TFTP transfer ID.\n" -"\n" -" 73 File already exists (TFTP).\n" -"\n" -" 74 No such user (TFTP).\n" -"\n" -" 75 Character conversion failed.\n" -"\n" -" 76 Character conversion functions required.\n" -"\n" -" 77 Problem with reading the SSL CA cert (path? access rights?).\n" -"\n" -" 78 The resource referenced in the URL does not exist.\n" -"\n" -" 79 An unspecified error occurred during the SSH session.\n" -"\n" -" 80 Failed to shut down the SSL connection.\n" -"\n" -, stdout); - fputs( -" 82 Could not load CRL file, missing or wrong format (added in\n" -" 7.19.0).\n" -"\n" -" 83 Issuer check failed (added in 7.19.0).\n" -"\n" -" XX More error codes will appear here in future releases. The exist-\n" -" ing ones are meant to never change.\n" -"\n" -"AUTHORS / CONTRIBUTORS\n" -" Daniel Stenberg is the main author, but the whole list of contributors\n" -" is found in the separate THANKS file.\n" -"\n" -"WWW\n" -" http://curl.haxx.se\n" -"\n" -"FTP\n" -, stdout); - fputs( -" ftp://ftp.sunet.se/pub/www/utilities/curl/\n" -"\n" -"SEE ALSO\n" -" ftp(1), wget(1)\n" -"\n" -"LATEST VERSION\n" -"\n" -" You always find news about what's going on as well as the latest versions\n" -" from the curl web pages, located at:\n" -"\n" -" http://curl.haxx.se\n" -"\n" -"SIMPLE USAGE\n" -"\n" -" Get the main page from Netscape's web-server:\n" -"\n" -" curl http://www.netscape.com/\n" -"\n" -" Get the README file the user's home directory at funet's ftp-server:\n" -"\n" -" curl ftp://ftp.funet.fi/README\n" -"\n" -, stdout); - fputs( -" Get a web page from a server using port 8000:\n" -"\n" -" curl http://www.weirdserver.com:8000/\n" -"\n" -" Get a list of a directory of an FTP site:\n" -"\n" -" curl ftp://cool.haxx.se/\n" -"\n" -" Get the definition of curl from a dictionary:\n" -"\n" -" curl dict://dict.org/m:curl\n" -"\n" -" Fetch two documents at once:\n" -"\n" -" curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/\n" -"\n" -" Get a file off an FTPS server:\n" -"\n" -" curl ftps://files.are.secure.com/secrets.txt\n" -"\n" -, stdout); - fputs( -" or use the more appropriate FTPS way to get the same file:\n" -"\n" -" curl --ftp-ssl ftp://files.are.secure.com/secrets.txt\n" -"\n" -" Get a file from an SSH server using SFTP:\n" -"\n" -" curl -u username sftp://shell.example.com/etc/issue\n" -"\n" -" Get a file from an SSH server using SCP using a private key to authenticate:\n" -"\n" -" curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \\\n" -" scp://shell.example.com/~/personal.txt\n" -"\n" -" Get the main page from an IPv6 web server:\n" -"\n" -, stdout); - fputs( -" curl -g \"http://[2001:1890:1112:1::20]/\"\n" -"\n" -"DOWNLOAD TO A FILE\n" -"\n" -" Get a web page and store in a local file:\n" -"\n" -" curl -o thatpage.html http://www.netscape.com/\n" -"\n" -" Get a web page and store in a local file, make the local file get the name\n" -" of the remote document (if no file name part is specified in the URL, this\n" -" will fail):\n" -"\n" -" curl -O http://www.netscape.com/index.html\n" -"\n" -" Fetch two files and store them with their remote names:\n" -"\n" -, stdout); - fputs( -" curl -O www.haxx.se/index.html -O curl.haxx.se/download.html\n" -"\n" -"USING PASSWORDS\n" -"\n" -" FTP\n" -"\n" -" To ftp files using name+passwd, include them in the URL like:\n" -"\n" -" curl ftp://name:passwd@machine.domain:port/full/path/to/file\n" -"\n" -" or specify them with the -u flag like\n" -"\n" -" curl -u name:passwd ftp://machine.domain:port/full/path/to/file\n" -"\n" -" FTPS\n" -"\n" -" It is just like for FTP, but you may also want to specify and use\n" -" SSL-specific options for certificates etc.\n" -"\n" -, stdout); - fputs( -" Note that using FTPS:// as prefix is the \"implicit\" way as described in the\n" -" standards while the recommended \"explicit\" way is done by using FTP:// and\n" -" the --ftp-ssl option.\n" -"\n" -" SFTP / SCP\n" -"\n" -" This is similar to FTP, but you can specify a private key to use instead of\n" -" a password. Note that the private key may itself be protected by a password\n" -" that is unrelated to the login password of the remote system. If you\n" -" provide a private key file you must also provide a public key file.\n" -, stdout); - fputs( -"\n" -" HTTP\n" -"\n" -" Curl also supports user and password in HTTP URLs, thus you can pick a file\n" -" like:\n" -"\n" -" curl http://name:passwd@machine.domain/full/path/to/file\n" -"\n" -" or specify user and password separately like in\n" -"\n" -" curl -u name:passwd http://machine.domain/full/path/to/file\n" -"\n" -" HTTP offers many different methods of authentication and curl supports\n" -" several: Basic, Digest, NTLM and Negotiate. Without telling which method to\n" -, stdout); - fputs( -" use, curl defaults to Basic. You can also ask curl to pick the most secure\n" -" ones out of the ones that the server accepts for the given URL, by using\n" -" --anyauth.\n" -"\n" -" NOTE! Since HTTP URLs don't support user and password, you can't use that\n" -" style when using Curl via a proxy. You _must_ use the -u style fetch\n" -" during such circumstances.\n" -"\n" -" HTTPS\n" -"\n" -" Probably most commonly used with private certificates, as explained below.\n" -"\n" -"PROXY\n" -"\n" -, stdout); - fputs( -" Get an ftp file using a proxy named my-proxy that uses port 888:\n" -"\n" -" curl -x my-proxy:888 ftp://ftp.leachsite.com/README\n" -"\n" -" Get a file from a HTTP server that requires user and password, using the\n" -" same proxy as above:\n" -"\n" -" curl -u user:passwd -x my-proxy:888 http://www.get.this/\n" -"\n" -" Some proxies require special authentication. Specify by using -U as above:\n" -"\n" -" curl -U user:passwd -x my-proxy:888 http://www.get.this/\n" -"\n" -, stdout); - fputs( -" A comma-separated list of hosts and domains which do not use the proxy can\n" -" be specified as:\n" -"\n" -" curl --noproxy localhost,get.this -x my-proxy:888 http://www.get.this/\n" -"\n" -" If the proxy is specified with --proxy1.0 instead of --proxy or -x, then\n" -" curl will use HTTP/1.0 instead of HTTP/1.1 for any CONNECT attempts.\n" -"\n" -" curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.\n" -"\n" -" See also the environment variables Curl support that offer further proxy\n" -" control.\n" -"\n" -"RANGES\n" -"\n" -, stdout); - fputs( -" With HTTP 1.1 byte-ranges were introduced. Using this, a client can request\n" -" to get only one or more subparts of a specified document. Curl supports\n" -" this with the -r flag.\n" -"\n" -" Get the first 100 bytes of a document:\n" -"\n" -" curl -r 0-99 http://www.get.this/\n" -"\n" -" Get the last 500 bytes of a document:\n" -"\n" -" curl -r -500 http://www.get.this/\n" -"\n" -" Curl also supports simple ranges for FTP files as well. Then you can only\n" -" specify start and stop position.\n" -"\n" -, stdout); - fputs( -" Get the first 100 bytes of a document using FTP:\n" -"\n" -" curl -r 0-99 ftp://www.get.this/README\n" -"\n" -"UPLOADING\n" -"\n" -" FTP / FTPS / SFTP / SCP\n" -"\n" -" Upload all data on stdin to a specified server:\n" -"\n" -" curl -T - ftp://ftp.upload.com/myfile\n" -"\n" -" Upload data from a specified file, login with user and password:\n" -"\n" -" curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile\n" -"\n" -" Upload a local file to the remote site, and use the local file name remote\n" -" too:\n" -"\n" -, stdout); - fputs( -" curl -T uploadfile -u user:passwd ftp://ftp.upload.com/\n" -"\n" -" Upload a local file to get appended to the remote file:\n" -"\n" -" curl -T localfile -a ftp://ftp.upload.com/remotefile\n" -"\n" -" Curl also supports ftp upload through a proxy, but only if the proxy is\n" -" configured to allow that kind of tunneling. If it does, you can run curl in\n" -" a fashion similar to:\n" -"\n" -" curl --proxytunnel -x proxy:port -T localfile ftp.upload.com\n" -"\n" -" HTTP\n" -"\n" -" Upload all data on stdin to a specified http site:\n" -"\n" -, stdout); - fputs( -" curl -T - http://www.upload.com/myfile\n" -"\n" -" Note that the http server must have been configured to accept PUT before\n" -" this can be done successfully.\n" -"\n" -" For other ways to do http data upload, see the POST section below.\n" -"\n" -"VERBOSE / DEBUG\n" -"\n" -" If curl fails where it isn't supposed to, if the servers don't let you in,\n" -" if you can't understand the responses: use the -v flag to get verbose\n" -" fetching. Curl will output lots of info and what it sends and receives in\n" -, stdout); - fputs( -" order to let the user see all client-server interaction (but it won't show\n" -" you the actual data).\n" -"\n" -" curl -v ftp://ftp.upload.com/\n" -"\n" -" To get even more details and information on what curl does, try using the\n" -" --trace or --trace-ascii options with a given file name to log to, like\n" -" this:\n" -"\n" -" curl --trace trace.txt www.haxx.se\n" -"\n" -"\n" -"DETAILED INFORMATION\n" -"\n" -" Different protocols provide different ways of getting detailed information\n" -, stdout); - fputs( -" about specific files/documents. To get curl to show detailed information\n" -" about a single file, you should use -I/--head option. It displays all\n" -" available info on a single file for HTTP and FTP. The HTTP information is a\n" -" lot more extensive.\n" -"\n" -" For HTTP, you can get the header information (the same as -I would show)\n" -" shown before the data by using -i/--include. Curl understands the\n" -" -D/--dump-header option when getting files from both FTP and HTTP, and it\n" -, stdout); - fputs( -" will then store the headers in the specified file.\n" -"\n" -" Store the HTTP headers in a separate file (headers.txt in the example):\n" -"\n" -" curl --dump-header headers.txt curl.haxx.se\n" -"\n" -" Note that headers stored in a separate file can be very useful at a later\n" -" time if you want curl to use cookies sent by the server. More about that in\n" -" the cookies section.\n" -"\n" -"POST (HTTP)\n" -"\n" -" It's easy to post data using curl. This is done using the -d <data>\n" -" option. The post data must be urlencoded.\n" -"\n" -, stdout); - fputs( -" Post a simple \"name\" and \"phone\" guestbook.\n" -"\n" -" curl -d \"name=Rafael%20Sagula&phone=3320780\" \\\n" -" http://www.where.com/guest.cgi\n" -"\n" -" How to post a form with curl, lesson #1:\n" -"\n" -" Dig out all the <input> tags in the form that you want to fill in. (There's\n" -" a perl program called formfind.pl on the curl site that helps with this).\n" -"\n" -" If there's a \"normal\" post, you use -d to post. -d takes a full \"post\n" -" string\", which is in the format\n" -"\n" -, stdout); - fputs( -" <variable1>=<data1>&<variable2>=<data2>&...\n" -"\n" -" The 'variable' names are the names set with \"name=\" in the <input> tags, and\n" -" the data is the contents you want to fill in for the inputs. The data *must*\n" -" be properly URL encoded. That means you replace space with + and that you\n" -" write weird letters with %XX where XX is the hexadecimal representation of\n" -" the letter's ASCII code.\n" -"\n" -" Example:\n" -"\n" -" (page located at http://www.formpost.com/getthis/\n" -"\n" -, stdout); - fputs( -" <form action=\"post.cgi\" method=\"post\">\n" -" <input name=user size=10>\n" -" <input name=pass type=password size=10>\n" -" <input name=id type=hidden value=\"blablabla\">\n" -" <input name=ding value=\"submit\">\n" -" </form>\n" -"\n" -" We want to enter user 'foobar' with password '12345'.\n" -"\n" -" To post to this, you enter a curl command line like:\n" -"\n" -" curl -d \"user=foobar&pass=12345&id=blablabla&ding=submit\" (continues)\n" -" http://www.formpost.com/getthis/post.cgi\n" -"\n" -"\n" -, stdout); - fputs( -" While -d uses the application/x-www-form-urlencoded mime-type, generally\n" -" understood by CGI's and similar, curl also supports the more capable\n" -" multipart/form-data type. This latter type supports things like file upload.\n" -"\n" -" -F accepts parameters like -F \"name=contents\". If you want the contents to\n" -" be read from a file, use <@filename> as contents. When specifying a file,\n" -" you can also specify the file content type by appending ';type=<mime type>'\n" -, stdout); - fputs( -" to the file name. You can also post the contents of several files in one\n" -" field. For example, the field name 'coolfiles' is used to send three files,\n" -" with different content types using the following syntax:\n" -"\n" -" curl -F \"coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html\" \\\n" -" http://www.post.com/postit.cgi\n" -"\n" -" If the content-type is not specified, curl will try to guess from the file\n" -" extension (it only knows a few), or use the previously specified type (from\n" -, stdout); - fputs( -" an earlier file if several files are specified in a list) or else it will\n" -" using the default type 'text/plain'.\n" -"\n" -" Emulate a fill-in form with -F. Let's say you fill in three fields in a\n" -" form. One field is a file name which to post, one field is your name and one\n" -" field is a file description. We want to post the file we have written named\n" -" \"cooltext.txt\". To let curl do the posting of this data instead of your\n" -" favourite browser, you have to read the HTML source of the form page and\n" -, stdout); - fputs( -" find the names of the input fields. In our example, the input field names\n" -" are 'file', 'yourname' and 'filedescription'.\n" -"\n" -" curl -F \"file=@cooltext.txt\" -F \"yourname=Daniel\" \\\n" -" -F \"filedescription=Cool text file with cool text inside\" \\\n" -" http://www.post.com/postit.cgi\n" -"\n" -" To send two files in one post you can do it in two ways:\n" -"\n" -" 1. Send multiple files in a single \"field\" with a single field name:\n" -"\n" -" curl -F \"pictures=@dog.gif,cat.gif\"\n" -"\n" -, stdout); - fputs( -" 2. Send two fields with two field names:\n" -"\n" -" curl -F \"docpicture=@dog.gif\" -F \"catpicture=@cat.gif\"\n" -"\n" -" To send a field value literally without interpreting a leading '@'\n" -" or '<', or an embedded ';type=', use --form-string instead of\n" -" -F. This is recommended when the value is obtained from a user or\n" -" some other unpredictable source. Under these circumstances, using\n" -" -F instead of --form-string would allow a user to trick curl into\n" -" uploading a file.\n" -"\n" -"REFERRER\n" -"\n" -, stdout); - fputs( -" A HTTP request has the option to include information about which address\n" -" that referred to actual page. Curl allows you to specify the\n" -" referrer to be used on the command line. It is especially useful to\n" -" fool or trick stupid servers or CGI scripts that rely on that information\n" -" being available or contain certain data.\n" -"\n" -" curl -e www.coolsite.com http://www.showme.com/\n" -"\n" -" NOTE: The Referer: [sic] field is defined in the HTTP spec to be a full URL.\n" -"\n" -"USER AGENT\n" -"\n" -, stdout); - fputs( -" A HTTP request has the option to include information about the browser\n" -" that generated the request. Curl allows it to be specified on the command\n" -" line. It is especially useful to fool or trick stupid servers or CGI\n" -" scripts that only accept certain browsers.\n" -"\n" -" Example:\n" -"\n" -" curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/\n" -"\n" -" Other common strings:\n" -" 'Mozilla/3.0 (Win95; I)' Netscape Version 3 for Windows 95\n" -" 'Mozilla/3.04 (Win95; U)' Netscape Version 3 for Windows 95\n" -, stdout); - fputs( -" 'Mozilla/2.02 (OS/2; U)' Netscape Version 2 for OS/2\n" -" 'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)' NS for AIX\n" -" 'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)' NS for Linux\n" -"\n" -" Note that Internet Explorer tries hard to be compatible in every way:\n" -" 'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)' MSIE for W95\n" -"\n" -" Mozilla is not the only possible User-Agent name:\n" -" 'Konqueror/1.0' KDE File Manager desktop client\n" -, stdout); - fputs( -" 'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser\n" -"\n" -"COOKIES\n" -"\n" -" Cookies are generally used by web servers to keep state information at the\n" -" client's side. The server sets cookies by sending a response line in the\n" -" headers that looks like 'Set-Cookie: <data>' where the data part then\n" -" typically contains a set of NAME=VALUE pairs (separated by semicolons ';'\n" -" like \"NAME1=VALUE1; NAME2=VALUE2;\"). The server can also specify for what\n" -, stdout); - fputs( -" path the \"cookie\" should be used for (by specifying \"path=value\"), when the\n" -" cookie should expire (\"expire=DATE\"), for what domain to use it\n" -" (\"domain=NAME\") and if it should be used on secure connections only\n" -" (\"secure\").\n" -"\n" -" If you've received a page from a server that contains a header like:\n" -" Set-Cookie: sessionid=boo123; path=\"/foo\";\n" -"\n" -" it means the server wants that first pair passed on when we get anything in\n" -" a path beginning with \"/foo\".\n" -"\n" -, stdout); - fputs( -" Example, get a page that wants my name passed in a cookie:\n" -"\n" -" curl -b \"name=Daniel\" www.sillypage.com\n" -"\n" -" Curl also has the ability to use previously received cookies in following\n" -" sessions. If you get cookies from a server and store them in a file in a\n" -" manner similar to:\n" -"\n" -" curl --dump-header headers www.example.com\n" -"\n" -" ... you can then in a second connect to that (or another) site, use the\n" -" cookies from the 'headers' file like:\n" -"\n" -" curl -b headers www.example.com\n" -"\n" -, stdout); - fputs( -" While saving headers to a file is a working way to store cookies, it is\n" -" however error-prone and not the preferred way to do this. Instead, make curl\n" -" save the incoming cookies using the well-known netscape cookie format like\n" -" this:\n" -"\n" -" curl -c cookies.txt www.example.com\n" -"\n" -" Note that by specifying -b you enable the \"cookie awareness\" and with -L\n" -" you can make curl follow a location: (which often is used in combination\n" -, stdout); - fputs( -" with cookies). So that if a site sends cookies and a location, you can\n" -" use a non-existing file to trigger the cookie awareness like:\n" -"\n" -" curl -L -b empty.txt www.example.com\n" -"\n" -" The file to read cookies from must be formatted using plain HTTP headers OR\n" -" as netscape's cookie file. Curl will determine what kind it is based on the\n" -" file contents. In the above command, curl will parse the header and store\n" -" the cookies received from www.example.com. curl will send to the server the\n" -, stdout); - fputs( -" stored cookies which match the request as it follows the location. The\n" -" file \"empty.txt\" may be a nonexistent file.\n" -"\n" -" Alas, to both read and write cookies from a netscape cookie file, you can\n" -" set both -b and -c to use the same file:\n" -"\n" -" curl -b cookies.txt -c cookies.txt www.example.com\n" -"\n" -"PROGRESS METER\n" -"\n" -" The progress meter exists to show a user that something actually is\n" -" happening. The different fields in the output have the following meaning:\n" -"\n" -, stdout); - fputs( -" % Total % Received % Xferd Average Speed Time Curr.\n" -" Dload Upload Total Current Left Speed\n" -" 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287\n" -"\n" -" From left-to-right:\n" -" % - percentage completed of the whole transfer\n" -" Total - total size of the whole expected transfer\n" -" % - percentage completed of the download\n" -" Received - currently downloaded amount of bytes\n" -, stdout); - fputs( -" % - percentage completed of the upload\n" -" Xferd - currently uploaded amount of bytes\n" -" Average Speed\n" -" Dload - the average transfer speed of the download\n" -" Average Speed\n" -" Upload - the average transfer speed of the upload\n" -" Time Total - expected time to complete the operation\n" -" Time Current - time passed since the invoke\n" -" Time Left - expected time left to completion\n" -" Curr.Speed - the average transfer speed the last 5 seconds (the first\n" -, stdout); - fputs( -" 5 seconds of a transfer is based on less time of course.)\n" -"\n" -" The -# option will display a totally different progress bar that doesn't\n" -" need much explanation!\n" -"\n" -"SPEED LIMIT\n" -"\n" -" Curl allows the user to set the transfer speed conditions that must be met\n" -" to let the transfer keep going. By using the switch -y and -Y you\n" -" can make curl abort transfers if the transfer speed is below the specified\n" -" lowest limit for a specified time.\n" -"\n" -, stdout); - fputs( -" To have curl abort the download if the speed is slower than 3000 bytes per\n" -" second for 1 minute, run:\n" -"\n" -" curl -Y 3000 -y 60 www.far-away-site.com\n" -"\n" -" This can very well be used in combination with the overall time limit, so\n" -" that the above operation must be completed in whole within 30 minutes:\n" -"\n" -" curl -m 1800 -Y 3000 -y 60 www.far-away-site.com\n" -"\n" -" Forcing curl not to transfer data faster than a given rate is also possible,\n" -, stdout); - fputs( -" which might be useful if you're using a limited bandwidth connection and you\n" -" don't want your transfer to use all of it (sometimes referred to as\n" -" \"bandwidth throttle\").\n" -"\n" -" Make curl transfer data no faster than 10 kilobytes per second:\n" -"\n" -" curl --limit-rate 10K www.far-away-site.com\n" -"\n" -" or\n" -"\n" -" curl --limit-rate 10240 www.far-away-site.com\n" -"\n" -" Or prevent curl from uploading data faster than 1 megabyte per second:\n" -"\n" -" curl -T upload --limit-rate 1M ftp://uploadshereplease.com\n" -"\n" -, stdout); - fputs( -" When using the --limit-rate option, the transfer rate is regulated on a\n" -" per-second basis, which will cause the total transfer speed to become lower\n" -" than the given number. Sometimes of course substantially lower, if your\n" -" transfer stalls during periods.\n" -"\n" -"CONFIG FILE\n" -"\n" -" Curl automatically tries to read the .curlrc file (or _curlrc file on win32\n" -" systems) from the user's home dir on startup.\n" -"\n" -" The config file could be made up with normal command line switches, but you\n" -, stdout); - fputs( -" can also specify the long options without the dashes to make it more\n" -" readable. You can separate the options and the parameter with spaces, or\n" -" with = or :. Comments can be used within the file. If the first letter on a\n" -" line is a '#'-symbol the rest of the line is treated as a comment.\n" -"\n" -" If you want the parameter to contain spaces, you must enclose the entire\n" -" parameter within double quotes (\"). Within those quotes, you specify a\n" -" quote as \\\".\n" -"\n" -, stdout); - fputs( -" NOTE: You must specify options and their arguments on the same line.\n" -"\n" -" Example, set default time out and proxy in a config file:\n" -"\n" -" # We want a 30 minute timeout:\n" -" -m 1800\n" -" # ... and we use a proxy for all accesses:\n" -" proxy = proxy.our.domain.com:8080\n" -"\n" -" White spaces ARE significant at the end of lines, but all white spaces\n" -" leading up to the first characters of each line are ignored.\n" -"\n" -" Prevent curl from reading the default file by using -q as the first command\n" -, stdout); - fputs( -" line parameter, like:\n" -"\n" -" curl -q www.thatsite.com\n" -"\n" -" Force curl to get and display a local help page in case it is invoked\n" -" without URL by making a config file similar to:\n" -"\n" -" # default url to get\n" -" url = \"http://help.with.curl.com/curlhelp.html\"\n" -"\n" -" You can specify another config file to be read by using the -K/--config\n" -" flag. If you set config file name to \"-\" it'll read the config from stdin,\n" -" which can be handy if you want to hide options from being visible in process\n" -, stdout); - fputs( -" tables etc:\n" -"\n" -" echo \"user = user:passwd\" | curl -K - http://that.secret.site.com\n" -"\n" -"EXTRA HEADERS\n" -"\n" -" When using curl in your own very special programs, you may end up needing\n" -" to pass on your own custom headers when getting a web page. You can do\n" -" this by using the -H flag.\n" -"\n" -" Example, send the header \"X-you-and-me: yes\" to the server when getting a\n" -" page:\n" -"\n" -" curl -H \"X-you-and-me: yes\" www.love.com\n" -"\n" -" This can also be useful in case you want curl to send a different text in a\n" -, stdout); - fputs( -" header than it normally does. The -H header you specify then replaces the\n" -" header curl would normally send. If you replace an internal header with an\n" -" empty one, you prevent that header from being sent. To prevent the Host:\n" -" header from being used:\n" -"\n" -" curl -H \"Host:\" www.server.com\n" -"\n" -"FTP and PATH NAMES\n" -"\n" -" Do note that when getting files with the ftp:// URL, the given path is\n" -" relative the directory you enter. To get the file 'README' from your home\n" -" directory at your ftp site, do:\n" -"\n" -, stdout); - fputs( -" curl ftp://user:passwd@my.site.com/README\n" -"\n" -" But if you want the README file from the root directory of that very same\n" -" site, you need to specify the absolute file name:\n" -"\n" -" curl ftp://user:passwd@my.site.com//README\n" -"\n" -" (I.e with an extra slash in front of the file name.)\n" -"\n" -"SFTP and SCP and PATH NAMES\n" -"\n" -" With sftp: and scp: URLs, the path name given is the absolute name on the\n" -" server. To access a file relative to the remote user's home directory,\n" -, stdout); - fputs( -" prefix the file with /~/ , such as:\n" -"\n" -" curl -u $USER sftp://home.example.com/~/.bashrc\n" -"\n" -"FTP and firewalls\n" -"\n" -" The FTP protocol requires one of the involved parties to open a second\n" -" connection as soon as data is about to get transfered. There are two ways to\n" -" do this.\n" -"\n" -" The default way for curl is to issue the PASV command which causes the\n" -" server to open another port and await another connection performed by the\n" -, stdout); - fputs( -" client. This is good if the client is behind a firewall that don't allow\n" -" incoming connections.\n" -"\n" -" curl ftp.download.com\n" -"\n" -" If the server for example, is behind a firewall that don't allow connections\n" -" on other ports than 21 (or if it just doesn't support the PASV command), the\n" -" other way to do it is to use the PORT command and instruct the server to\n" -" connect to the client on the given (as parameters to the PORT command) IP\n" -" number and port.\n" -"\n" -, stdout); - fputs( -" The -P flag to curl supports a few different options. Your machine may have\n" -" several IP-addresses and/or network interfaces and curl allows you to select\n" -" which of them to use. Default address can also be used:\n" -"\n" -" curl -P - ftp.download.com\n" -"\n" -" Download with PORT but use the IP address of our 'le0' interface (this does\n" -" not work on windows):\n" -"\n" -" curl -P le0 ftp.download.com\n" -"\n" -" Download with PORT but use 192.168.0.10 as our IP address to use:\n" -"\n" -, stdout); - fputs( -" curl -P 192.168.0.10 ftp.download.com\n" -"\n" -"NETWORK INTERFACE\n" -"\n" -" Get a web page from a server using a specified port for the interface:\n" -"\n" -" curl --interface eth0:1 http://www.netscape.com/\n" -"\n" -" or\n" -"\n" -" curl --interface 192.168.1.10 http://www.netscape.com/\n" -"\n" -"HTTPS\n" -"\n" -" Secure HTTP requires SSL libraries to be installed and used when curl is\n" -" built. If that is done, curl is capable of retrieving and posting documents\n" -" using the HTTPS protocol.\n" -"\n" -" Example:\n" -"\n" -, stdout); - fputs( -" curl https://www.secure-site.com\n" -"\n" -" Curl is also capable of using your personal certificates to get/post files\n" -" from sites that require valid certificates. The only drawback is that the\n" -" certificate needs to be in PEM-format. PEM is a standard and open format to\n" -" store certificates with, but it is not used by the most commonly used\n" -" browsers (Netscape and MSIE both use the so called PKCS#12 format). If you\n" -, stdout); - fputs( -" want curl to use the certificates you use with your (favourite) browser, you\n" -" may need to download/compile a converter that can convert your browser's\n" -" formatted certificates to PEM formatted ones. This kind of converter is\n" -" included in recent versions of OpenSSL, and for older versions Dr Stephen\n" -" N. Henson has written a patch for SSLeay that adds this functionality. You\n" -" can get his patch (that requires an SSLeay installation) from his site at:\n" -" http://www.drh-consultancy.demon.co.uk/\n" -, stdout); - fputs( -"\n" -" Example on how to automatically retrieve a document using a certificate with\n" -" a personal password:\n" -"\n" -" curl -E /path/to/cert.pem:password https://secure.site.com/\n" -"\n" -" If you neglect to specify the password on the command line, you will be\n" -" prompted for the correct password before any data can be received.\n" -"\n" -" Many older SSL-servers have problems with SSLv3 or TLS, that newer versions\n" -" of OpenSSL etc is using, therefore it is sometimes useful to specify what\n" -, stdout); - fputs( -" SSL-version curl should use. Use -3, -2 or -1 to specify that exact SSL\n" -" version to use (for SSLv3, SSLv2 or TLSv1 respectively):\n" -"\n" -" curl -2 https://secure.site.com/\n" -"\n" -" Otherwise, curl will first attempt to use v3 and then v2.\n" -"\n" -" To use OpenSSL to convert your favourite browser's certificate into a PEM\n" -" formatted one that curl can use, do something like this (assuming netscape,\n" -" but IE is likely to work similarly):\n" -"\n" -" You start with hitting the 'security' menu button in netscape.\n" -"\n" -, stdout); - fputs( -" Select 'certificates->yours' and then pick a certificate in the list\n" -"\n" -" Press the 'export' button\n" -"\n" -" enter your PIN code for the certs\n" -"\n" -" select a proper place to save it\n" -"\n" -" Run the 'openssl' application to convert the certificate. If you cd to the\n" -" openssl installation, you can do it like:\n" -"\n" -" # ./apps/openssl pkcs12 -in [file you saved] -clcerts -out [PEMfile]\n" -"\n" -"\n" -"RESUMING FILE TRANSFERS\n" -"\n" -" To continue a file transfer where it was previously aborted, curl supports\n" -, stdout); - fputs( -" resume on http(s) downloads as well as ftp uploads and downloads.\n" -"\n" -" Continue downloading a document:\n" -"\n" -" curl -C - -o file ftp://ftp.server.com/path/file\n" -"\n" -" Continue uploading a document(*1):\n" -"\n" -" curl -C - -T file ftp://ftp.server.com/path/file\n" -"\n" -" Continue downloading a document from a web server(*2):\n" -"\n" -" curl -C - -o file http://www.server.com/\n" -"\n" -" (*1) = This requires that the ftp server supports the non-standard command\n" -" SIZE. If it doesn't, curl will say so.\n" -"\n" -, stdout); - fputs( -" (*2) = This requires that the web server supports at least HTTP/1.1. If it\n" -" doesn't, curl will say so.\n" -"\n" -"TIME CONDITIONS\n" -"\n" -" HTTP allows a client to specify a time condition for the document it\n" -" requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to\n" -" specify them with the -z/--time-cond flag.\n" -"\n" -" For example, you can easily make a download that only gets performed if the\n" -" remote file is newer than a local copy. It would be made like:\n" -"\n" -, stdout); - fputs( -" curl -z local.html http://remote.server.com/remote.html\n" -"\n" -" Or you can download a file only if the local file is newer than the remote\n" -" one. Do this by prepending the date string with a '-', as in:\n" -"\n" -" curl -z -local.html http://remote.server.com/remote.html\n" -"\n" -" You can specify a \"free text\" date as condition. Tell curl to only download\n" -" the file if it was updated since January 12, 2012:\n" -"\n" -" curl -z \"Jan 12 2012\" http://remote.server.com/remote.html\n" -"\n" -, stdout); - fputs( -" Curl will then accept a wide range of date formats. You always make the date\n" -" check the other way around by prepending it with a dash '-'.\n" -"\n" -"DICT\n" -"\n" -" For fun try\n" -"\n" -" curl dict://dict.org/m:curl\n" -" curl dict://dict.org/d:heisenbug:jargon\n" -" curl dict://dict.org/d:daniel:web1913\n" -"\n" -" Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'\n" -" and 'lookup'. For example,\n" -"\n" -" curl dict://dict.org/find:curl\n" -"\n" -, stdout); - fputs( -" Commands that break the URL description of the RFC (but not the DICT\n" -" protocol) are\n" -"\n" -" curl dict://dict.org/show:db\n" -" curl dict://dict.org/show:strat\n" -"\n" -" Authentication is still missing (but this is not required by the RFC)\n" -"\n" -"LDAP\n" -"\n" -" If you have installed the OpenLDAP library, curl can take advantage of it\n" -" and offer ldap:// support.\n" -"\n" -" LDAP is a complex thing and writing an LDAP query is not an easy task. I do\n" -, stdout); - fputs( -" advice you to dig up the syntax description for that elsewhere. Two places\n" -" that might suit you are:\n" -"\n" -" Netscape's \"Netscape Directory SDK 3.0 for C Programmer's Guide Chapter 10:\n" -" Working with LDAP URLs\":\n" -" http://developer.netscape.com/docs/manuals/dirsdk/csdk30/url.htm\n" -"\n" -" RFC 2255, \"The LDAP URL Format\" http://curl.haxx.se/rfc/rfc2255.txt\n" -"\n" -" To show you an example, this is now I can get all people from my local LDAP\n" -" server that has a certain sub-domain in their email address:\n" -"\n" -, stdout); - fputs( -" curl -B \"ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se\"\n" -"\n" -" If I want the same info in HTML format, I can get it by not using the -B\n" -" (enforce ASCII) flag.\n" -"\n" -"ENVIRONMENT VARIABLES\n" -"\n" -" Curl reads and understands the following environment variables:\n" -"\n" -" http_proxy, HTTPS_PROXY, FTP_PROXY\n" -"\n" -" They should be set for protocol-specific proxies. General proxy should be\n" -" set with\n" -"\n" -" ALL_PROXY\n" -"\n" -" A comma-separated list of host names that shouldn't go through any proxy is\n" -, stdout); - fputs( -" set in (only an asterisk, '*' matches all hosts)\n" -"\n" -" NO_PROXY\n" -"\n" -" If the host name matches one of these strings, or the host is within the\n" -" domain of one of these strings, transactions with that node will not be\n" -" proxied.\n" -"\n" -"\n" -" The usage of the -x/--proxy flag overrides the environment variables.\n" -"\n" -"NETRC\n" -"\n" -" Unix introduced the .netrc concept a long time ago. It is a way for a user\n" -" to specify name and password for commonly visited ftp sites in a file so\n" -, stdout); - fputs( -" that you don't have to type them in each time you visit those sites. You\n" -" realize this is a big security risk if someone else gets hold of your\n" -" passwords, so therefore most unix programs won't read this file unless it is\n" -" only readable by yourself (curl doesn't care though).\n" -"\n" -" Curl supports .netrc files if told so (using the -n/--netrc and\n" -" --netrc-optional options). This is not restricted to only ftp,\n" -" but curl can use it for all protocols where authentication is used.\n" -"\n" -, stdout); - fputs( -" A very simple .netrc file could look something like:\n" -"\n" -" machine curl.haxx.se login iamdaniel password mysecret\n" -"\n" -"CUSTOM OUTPUT\n" -"\n" -" To better allow script programmers to get to know about the progress of\n" -" curl, the -w/--write-out option was introduced. Using this, you can specify\n" -" what information from the previous transfer you want to extract.\n" -"\n" -" To display the amount of bytes downloaded together with some text and an\n" -" ending newline:\n" -"\n" -, stdout); - fputs( -" curl -w 'We downloaded %{size_download} bytes\\n' www.download.com\n" -"\n" -"KERBEROS FTP TRANSFER\n" -"\n" -" Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need\n" -" the kerberos package installed and used at curl build time for it to be\n" -" used.\n" -"\n" -" First, get the krb-ticket the normal way, like with the kinit/kauth tool.\n" -" Then use curl in way similar to:\n" -"\n" -" curl --krb private ftp://krb4site.com -u username:fakepwd\n" -"\n" -, stdout); - fputs( -" There's no use for a password on the -u switch, but a blank one will make\n" -" curl ask for one and you already entered the real password to kinit/kauth.\n" -"\n" -"TELNET\n" -"\n" -" The curl telnet support is basic and very easy to use. Curl passes all data\n" -" passed to it on stdin to the remote server. Connect to a remote telnet\n" -" server using a command line similar to:\n" -"\n" -" curl telnet://remote.server.com\n" -"\n" -" And enter the data to pass to the server on stdin. The result will be sent\n" -, stdout); - fputs( -" to stdout or to the file you specify with -o.\n" -"\n" -" You might want the -N/--no-buffer option to switch off the buffered output\n" -" for slow connections or similar.\n" -"\n" -" Pass options to the telnet protocol negotiation, by using the -t option. To\n" -" tell the server we use a vt100 terminal, try something like:\n" -"\n" -" curl -tTTYPE=vt100 telnet://remote.server.com\n" -"\n" -" Other interesting options for it -t include:\n" -"\n" -" - XDISPLOC=<X display> Sets the X display location.\n" -"\n" -, stdout); - fputs( -" - NEW_ENV=<var,val> Sets an environment variable.\n" -"\n" -" NOTE: the telnet protocol does not specify any way to login with a specified\n" -" user and password so curl can't do that automatically. To do that, you need\n" -" to track when the login prompt is received and send the username and\n" -" password accordingly.\n" -"\n" -"PERSISTENT CONNECTIONS\n" -"\n" -" Specifying multiple files on a single command line will make curl transfer\n" -" all of them, one after the other in the specified order.\n" -"\n" -, stdout); - fputs( -" libcurl will attempt to use persistent connections for the transfers so that\n" -" the second transfer to the same host can use the same connection that was\n" -" already initiated and was left open in the previous transfer. This greatly\n" -" decreases connection time for all but the first transfer and it makes a far\n" -" better use of the network.\n" -"\n" -" Note that curl cannot use persistent connections for transfers that are used\n" -" in subsequence curl invokes. Try to stuff as many URLs as possible on the\n" -, stdout); - fputs( -" same command line if they are using the same host, as that'll make the\n" -" transfers faster. If you use a http proxy for file transfers, practically\n" -" all transfers will be persistent.\n" -"\n" -"MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE\n" -"\n" -" As is mentioned above, you can download multiple files with one command line\n" -" by simply adding more URLs. If you want those to get saved to a local file\n" -" instead of just printed to stdout, you need to add one save option for each\n" -, stdout); - fputs( -" URL you specify. Note that this also goes for the -O option (but not\n" -" --remote-name-all).\n" -"\n" -" For example: get two files and use -O for the first and a custom file\n" -" name for the second:\n" -"\n" -" curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg\n" -"\n" -" You can also upload multiple files in a similar fashion:\n" -"\n" -" curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt\n" -"\n" -"IPv6\n" -"\n" -" curl will connect to a server with IPv6 when a host lookup returns an IPv6\n" -, stdout); - fputs( -" address and fall back to IPv4 if the connection fails. The --ipv4 and --ipv6\n" -" options can specify which address to use when both are available. IPv6\n" -" addresses can also be specified directly in URLs using the syntax:\n" -"\n" -" http://[2001:1890:1112:1::20]/overview.html\n" -"\n" -" When this style is used, the -g option must be given to stop curl from\n" -" interpreting the square brackets as special globbing characters. Link local\n" -, stdout); - fputs( -" and site local addresses including a scope identifier, such as fe80::1234%1,\n" -" may also be used, but the scope portion must be numeric and the percent\n" -" character must be URL escaped. The previous example in an SFTP URL might\n" -" look like:\n" -"\n" -" sftp://[fe80::1234%251]/\n" -"\n" -" IPv6 addresses provided other than in URLs (e.g. to the --proxy, --interface\n" -" or --ftp-port options) should not be URL encoded.\n" -"\n" -"\n" -"MAILING LISTS\n" -"\n" -" For your convenience, we have several open mailing lists to discuss curl,\n" -, stdout); - fputs( -" its development and things relevant to this. Get all info at\n" -" http://curl.haxx.se/mail/. Some of the lists available are:\n" -"\n" -" curl-users\n" -"\n" -" Users of the command line tool. How to use it, what doesn't work, new\n" -" features, related tools, questions, news, installations, compilations,\n" -" running, porting etc.\n" -"\n" -" curl-library\n" -"\n" -" Developers using or developing libcurl. Bugs, extensions, improvements.\n" -"\n" -" curl-announce\n" -"\n" -, stdout); - fputs( -" Low-traffic. Only receives announcements of new public versions. At worst,\n" -" that makes something like one or two mails per month, but usually only one\n" -" mail every second month.\n" -"\n" -" curl-and-php\n" -"\n" -" Using the curl functions in PHP. Everything curl with a PHP angle. Or PHP\n" -" with a curl angle.\n" -"\n" -" curl-and-python\n" -"\n" -" Python hackers using curl with or without the python binding pycurl.\n" -"\n" -" Please direct curl questions, feature requests and trouble reports to one of\n" -, stdout); - fputs( -" these mailing lists instead of mailing any individual.\n" -, stdout) ; -} -#endif /* USE_MANUAL */ -#else -/* - * NEVER EVER edit this manually, fix the mkhelp.pl script instead! - * Generation time: Wed Oct 6 19:13:33 2010 - */ -#include "setup.h" -#ifdef USE_MANUAL -#include "hugehelp.h" -#include <stdio.h> -#include <stdlib.h> -#include <zlib.h> -static const unsigned char hugehelpgz[] = { - /* This mumbo-jumbo is the huge help text compressed with gzip. - Thanks to this operation, the size of this data shrunk from 132605 - to 40864 bytes. You can disable the use of compressed help - texts by NOT passing -c to the mkhelp.pl tool. */ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd, - 0x69, 0x7b, 0x23, 0xc7, 0x91, 0x2e, 0xfa, 0x9d, 0xbf, 0xa2, 0x0c, 0x5d, - 0x1b, 0xa4, 0x0d, 0x80, 0x4b, 0x2f, 0x52, 0xd3, 0xdd, 0x1a, 0x51, 0x24, - 0x5b, 0xe2, 0x88, 0xdd, 0xe4, 0x21, 0xd8, 0x5a, 0x8e, 0xac, 0xa7, 0x9f, - 0x02, 0x50, 0x24, 0xcb, 0x04, 0x50, 0x70, 0x55, 0x81, 0x24, 0xe4, 0xf1, - 0xfc, 0xf6, 0x1b, 0xf1, 0x46, 0x44, 0x66, 0xd6, 0x02, 0x76, 0xcb, 0x96, - 0x3c, 0xf7, 0x9c, 0xe7, 0x7a, 0x46, 0x4d, 0x12, 0xa8, 0xca, 0x35, 0x32, - 0x32, 0xd6, 0x37, 0xa2, 0xe8, 0x43, 0xff, 0x7b, 0x8f, 0xff, 0xde, 0xd3, - 0xff, 0xe8, 0xe7, 0x46, 0x14, 0x9d, 0xe7, 0xd9, 0x5f, 0x93, 0x71, 0xd9, - 0xfe, 0xec, 0xfb, 0xf7, 0xff, 0x15, 0xc9, 0xff, 0xd1, 0x3b, 0x7f, 0xa1, - 0x9f, 0x1b, 0x8f, 0xb6, 0xbd, 0x1d, 0xf9, 0x17, 0xfe, 0xeb, 0xfd, 0x56, - 0xf4, 0xa1, 0x17, 0xfe, 0x2b, 0xda, 0xc4, 0x0b, 0xef, 0xb5, 0x87, 0x97, - 0xfc, 0xfb, 0xfb, 0xf7, 0x8f, 0x77, 0xf2, 0x17, 0x1e, 0x15, 0xff, 0xb3, - 0xcd, 0xef, 0xfd, 0xe5, 0x3d, 0xff, 0x4a, 0x9f, 0x6c, 0x6c, 0xbc, 0x3d, - 0x78, 0x73, 0x6c, 0xaf, 0x8e, 0x97, 0xf9, 0x34, 0xea, 0x47, 0x65, 0x1e, - 0xcf, 0x8b, 0xab, 0x24, 0x8f, 0xe2, 0xe8, 0xdd, 0xc5, 0xe9, 0xc6, 0xc6, - 0xf0, 0x87, 0xb7, 0x67, 0xe7, 0xc3, 0x93, 0x61, 0xe5, 0xb1, 0x1f, 0xb3, - 0x45, 0x99, 0x66, 0xf3, 0xe2, 0xa7, 0xe8, 0x47, 0x7a, 0x68, 0x30, 0x18, - 0xfc, 0xb4, 0xb1, 0x71, 0x74, 0x3c, 0x3c, 0xbc, 0x38, 0x39, 0xbf, 0x3c, - 0x39, 0x7b, 0x5b, 0x79, 0x36, 0x4a, 0x8b, 0x88, 0x1a, 0x2b, 0xb3, 0x6c, - 0x4a, 0xff, 0xf8, 0xf6, 0x27, 0x71, 0x19, 0x47, 0x57, 0x79, 0x36, 0x8b, - 0xb2, 0x9c, 0xbf, 0x88, 0xa3, 0x22, 0xc9, 0xef, 0x92, 0xbc, 0x17, 0x2d, - 0x8b, 0x74, 0x7e, 0x1d, 0x65, 0xf3, 0x24, 0xca, 0xae, 0xa2, 0xf2, 0x26, - 0xb1, 0xe6, 0x8a, 0xe5, 0x62, 0x91, 0xe5, 0x65, 0x32, 0x89, 0x16, 0x79, - 0x56, 0x66, 0xe3, 0x6c, 0x5a, 0x44, 0x9b, 0x47, 0x27, 0x87, 0x97, 0xbd, - 0xe8, 0xf5, 0xc9, 0xe9, 0x31, 0xfd, 0x7b, 0x79, 0x8e, 0x7f, 0x86, 0xbd, - 0xe8, 0xab, 0xb3, 0xf3, 0xaf, 0x8f, 0x2f, 0x7a, 0xd1, 0xd7, 0x97, 0xfc, - 0x19, 0xff, 0x4b, 0x1f, 0x46, 0x27, 0x6f, 0x0e, 0xce, 0x7b, 0xd6, 0x1c, - 0xff, 0xc1, 0x1f, 0x9e, 0x1e, 0xd1, 0x87, 0xf2, 0x83, 0xff, 0x3c, 0x3f, - 0x3b, 0x7f, 0xd2, 0xc3, 0xbf, 0xf4, 0xd7, 0xc5, 0xe5, 0x9b, 0x73, 0xfe, - 0x77, 0x48, 0xff, 0x0e, 0x0f, 0xf9, 0x1f, 0xf4, 0x31, 0x7c, 0x63, 0xff, - 0x0e, 0x5d, 0x73, 0x97, 0xc7, 0xa7, 0x6f, 0x8f, 0x2f, 0xa3, 0x78, 0x3e, - 0x89, 0x2e, 0xe9, 0xa1, 0xad, 0x01, 0x7d, 0x74, 0x93, 0x44, 0xe3, 0x6c, - 0x36, 0xe3, 0xcf, 0x68, 0x15, 0x26, 0x49, 0x91, 0x5e, 0xcf, 0x69, 0xf8, - 0x34, 0xdb, 0xfb, 0x2c, 0xbf, 0x8d, 0xee, 0xd3, 0xf2, 0x26, 0x5b, 0x96, - 0x34, 0x61, 0x5a, 0x8f, 0x28, 0x9d, 0x97, 0x49, 0xde, 0xb7, 0xe6, 0xe2, - 0x31, 0xaf, 0xf0, 0x60, 0xa3, 0xb2, 0x96, 0xd9, 0x15, 0xad, 0x5c, 0x41, - 0x4b, 0x35, 0x5a, 0x16, 0xd3, 0x2c, 0x9e, 0xf0, 0x02, 0xd1, 0xcb, 0x57, - 0x4b, 0x5a, 0xda, 0x3c, 0x1d, 0xdf, 0x16, 0xd1, 0x34, 0xbd, 0x4d, 0x78, - 0x79, 0x1e, 0x56, 0xb6, 0x5c, 0x3d, 0x69, 0x3e, 0x5e, 0xd2, 0x4a, 0xce, - 0x5d, 0xf3, 0x65, 0x3a, 0x8e, 0xb9, 0x03, 0xac, 0x57, 0xb4, 0x5c, 0x70, - 0x6b, 0xb2, 0x4e, 0xd1, 0x22, 0x2b, 0xe8, 0xa5, 0xe1, 0xf0, 0x94, 0xc6, - 0x3e, 0x9f, 0x27, 0x18, 0x47, 0xd1, 0xa3, 0x3f, 0xb2, 0xdb, 0x34, 0xa1, - 0x5f, 0xae, 0xd2, 0x69, 0x12, 0xc9, 0x3e, 0xba, 0xe6, 0x78, 0x43, 0xf3, - 0xa4, 0x58, 0xce, 0x12, 0x2c, 0xc0, 0x2c, 0xcb, 0x93, 0x41, 0x74, 0x50, - 0x44, 0xab, 0x6c, 0x49, 0xb3, 0x9c, 0x4e, 0x69, 0x6f, 0x93, 0x68, 0x94, - 0x4c, 0xb3, 0xfb, 0x1e, 0xef, 0x68, 0x34, 0x5f, 0xce, 0x46, 0xf4, 0x0a, - 0x0d, 0xff, 0x2a, 0x89, 0xcb, 0x25, 0xbd, 0x8a, 0xc7, 0xac, 0xb9, 0x59, - 0x4c, 0xb3, 0xa0, 0x77, 0xf3, 0xe8, 0x26, 0xa1, 0x59, 0x16, 0x8b, 0x74, - 0xfe, 0xbb, 0xea, 0x4a, 0xd0, 0x72, 0x2e, 0xb2, 0xfb, 0x24, 0xa7, 0xd5, - 0x1c, 0xad, 0x22, 0x9a, 0xf6, 0x48, 0x88, 0xed, 0x8a, 0x88, 0x29, 0x8a, - 0xa9, 0x43, 0x47, 0x68, 0xfd, 0x3c, 0x99, 0xc6, 0x4c, 0x34, 0xae, 0x2b, - 0xda, 0x99, 0x61, 0xe2, 0xa8, 0x4a, 0x5f, 0xdd, 0x7c, 0xb2, 0x85, 0x97, - 0x27, 0x49, 0x19, 0xa7, 0xd3, 0x82, 0x16, 0x9e, 0xc9, 0xdf, 0xf6, 0x96, - 0x86, 0xcc, 0xc7, 0x81, 0x68, 0x70, 0x35, 0x2f, 0xe3, 0x07, 0x74, 0xaf, - 0x34, 0xd8, 0x9f, 0x24, 0x8b, 0x64, 0x3e, 0x49, 0xe6, 0xe5, 0x20, 0xfa, - 0x21, 0x5b, 0x76, 0xa9, 0xef, 0xab, 0x94, 0xd6, 0x20, 0xd6, 0xa6, 0xa8, - 0x67, 0xda, 0xf8, 0x71, 0x9e, 0x2e, 0x82, 0xc5, 0xcf, 0xe6, 0xb4, 0xdd, - 0xd1, 0xc5, 0xeb, 0xc3, 0xe8, 0xc9, 0x8b, 0xcf, 0x9e, 0xfb, 0x5d, 0xa6, - 0x06, 0xa2, 0x71, 0x3c, 0xa7, 0x19, 0x27, 0xe3, 0xf4, 0x6a, 0x15, 0xcd, - 0x96, 0xd3, 0x32, 0x5d, 0xd0, 0x7a, 0x53, 0xe7, 0x05, 0x1f, 0x94, 0x45, - 0x9c, 0x97, 0x05, 0xaf, 0x1b, 0x3e, 0xc0, 0xdc, 0xef, 0xf3, 0xb4, 0xe4, - 0x03, 0x83, 0xef, 0x68, 0x84, 0x49, 0x59, 0x58, 0x73, 0x4c, 0x60, 0xd4, - 0xcf, 0x28, 0x8f, 0xc7, 0xb4, 0xc2, 0x71, 0x41, 0x9d, 0xee, 0xbb, 0xbe, - 0xa2, 0x9b, 0xb2, 0x5c, 0xec, 0x6f, 0x6f, 0x17, 0x69, 0x99, 0x0c, 0xfe, - 0x4e, 0xc7, 0xad, 0x57, 0xde, 0x67, 0xbd, 0xf2, 0x26, 0x4f, 0x92, 0x7f, - 0x0c, 0x88, 0x6c, 0xdd, 0x83, 0xd4, 0xed, 0x4a, 0xc7, 0x75, 0x9d, 0x94, - 0xd4, 0xc1, 0xdf, 0x96, 0xc9, 0x9c, 0x1b, 0xa4, 0x61, 0xc4, 0xd3, 0xc5, - 0x4d, 0x4c, 0xbb, 0x99, 0x10, 0xf9, 0xf1, 0x01, 0x26, 0x0a, 0xe1, 0x41, - 0xc9, 0x11, 0xfe, 0xf1, 0xa7, 0x46, 0x9f, 0x57, 0xe8, 0x92, 0xfe, 0x1d, - 0xe8, 0x4b, 0x31, 0xad, 0x35, 0x75, 0xb6, 0xcd, 0x54, 0xf5, 0xe3, 0x6e, - 0x7f, 0x77, 0x67, 0xe7, 0xa7, 0x41, 0xf9, 0x50, 0x7e, 0xe4, 0x0b, 0x3b, - 0x3b, 0xfe, 0x15, 0x7e, 0x7a, 0x93, 0x67, 0x1c, 0x4d, 0x89, 0x68, 0xb8, - 0xff, 0x9f, 0x93, 0x3c, 0x2b, 0xb6, 0x5a, 0x9a, 0x9a, 0x26, 0x25, 0x9d, - 0xb5, 0xa0, 0x9d, 0xb8, 0xff, 0xb3, 0x74, 0x6b, 0x0f, 0xbf, 0x4d, 0x0a, - 0xd0, 0x8c, 0x9f, 0x6c, 0x14, 0xe7, 0x44, 0xb7, 0x59, 0xe9, 0xd9, 0x50, - 0x8f, 0x8e, 0x61, 0xe9, 0x96, 0x86, 0x4e, 0x19, 0x3d, 0x4d, 0x0c, 0x2c, - 0x9e, 0x32, 0xef, 0x2a, 0xa2, 0x79, 0xe2, 0xa7, 0x41, 0x27, 0x3e, 0x89, - 0xc7, 0x37, 0x51, 0x46, 0xc4, 0x9f, 0x37, 0xb7, 0x20, 0x9e, 0xaf, 0x06, - 0x59, 0x7e, 0xbd, 0x1d, 0xe7, 0xe3, 0x9b, 0xf4, 0x8e, 0xd6, 0xe1, 0xc5, - 0x8b, 0xe7, 0x7d, 0xfa, 0xe7, 0xc5, 0x4f, 0xdb, 0x77, 0xd9, 0x94, 0x96, - 0xe5, 0xe9, 0x4f, 0xdb, 0xbc, 0xbb, 0x7f, 0x8f, 0x7b, 0xa3, 0xde, 0xf8, - 0x1f, 0x83, 0x9b, 0x72, 0x36, 0x5d, 0x4b, 0x33, 0xd4, 0x58, 0x14, 0xcf, - 0xb2, 0xe5, 0xbc, 0x74, 0x74, 0x42, 0xe4, 0x56, 0x06, 0xbc, 0x68, 0x9a, - 0xce, 0x13, 0x61, 0x4f, 0x4c, 0x3e, 0x7c, 0x3c, 0xe9, 0x6c, 0xfa, 0xa3, - 0x5c, 0x8e, 0x6f, 0x68, 0xea, 0x44, 0x37, 0xb1, 0x4e, 0xbf, 0x4c, 0x69, - 0x4e, 0xf4, 0xe6, 0x9c, 0x8e, 0x6c, 0x2a, 0x4d, 0x49, 0x67, 0x29, 0x3d, - 0x97, 0xe5, 0x93, 0x24, 0xaf, 0x52, 0x30, 0x86, 0xe3, 0xc7, 0x13, 0xd1, - 0x52, 0x2e, 0xa8, 0xf3, 0x25, 0x33, 0x38, 0x1c, 0x32, 0x6e, 0x81, 0x8e, - 0xe7, 0x35, 0xad, 0x12, 0xad, 0x0c, 0x13, 0x15, 0x2f, 0xdc, 0x2a, 0x7a, - 0x4b, 0x9b, 0x27, 0xac, 0x21, 0xa0, 0x3d, 0xd9, 0xac, 0xe6, 0xa2, 0xdd, - 0xdf, 0xdf, 0xaf, 0x27, 0xa2, 0xfd, 0xdd, 0x1a, 0x1d, 0x05, 0x2f, 0xb5, - 0xed, 0xfe, 0xfe, 0x5e, 0x75, 0xff, 0x4f, 0xae, 0xb0, 0xb1, 0x36, 0x07, - 0x3e, 0xfb, 0xc6, 0xad, 0xed, 0xe0, 0x53, 0x6b, 0xf4, 0x7b, 0x72, 0x95, - 0x3e, 0xf4, 0xec, 0xaa, 0x93, 0xb5, 0x8c, 0xa9, 0xf9, 0xd9, 0xa2, 0xe4, - 0x5d, 0xb7, 0xe6, 0xae, 0x97, 0x49, 0x41, 0x24, 0x74, 0x7f, 0x13, 0xd3, - 0xc7, 0xd6, 0x40, 0x84, 0x2e, 0x66, 0xe9, 0xf5, 0x4d, 0x19, 0xdd, 0xc7, - 0xcc, 0x3f, 0x4e, 0x4a, 0x69, 0x82, 0x59, 0x35, 0x71, 0x8d, 0xab, 0x98, - 0x8e, 0x3f, 0xaf, 0x10, 0xf8, 0x32, 0x11, 0x9b, 0x23, 0x27, 0x5a, 0x2b, - 0x90, 0x52, 0x70, 0x13, 0x8e, 0xe2, 0x82, 0x77, 0x63, 0x4e, 0x9b, 0x5e, - 0x12, 0xa3, 0x5f, 0xf2, 0x5f, 0x37, 0xc4, 0xca, 0xa3, 0x79, 0x3c, 0x4b, - 0x74, 0xa0, 0xe0, 0x7d, 0xaf, 0x99, 0x45, 0x26, 0x0f, 0xf1, 0xcc, 0xf1, - 0x23, 0x62, 0x30, 0x3d, 0x65, 0x9d, 0xee, 0x8d, 0x82, 0x76, 0x8d, 0x28, - 0x8e, 0x8f, 0x11, 0xce, 0x54, 0x87, 0xcf, 0x4d, 0x47, 0xe6, 0x89, 0x31, - 0xc6, 0x05, 0xd8, 0x3d, 0x38, 0x3c, 0x0d, 0x3e, 0x98, 0x2c, 0x2d, 0x5a, - 0x7c, 0xcb, 0xf7, 0x4a, 0xed, 0xf6, 0xc2, 0x6b, 0x93, 0x2c, 0x4a, 0x89, - 0x83, 0x8d, 0xe8, 0x7c, 0xf1, 0xcc, 0xf8, 0xd4, 0x60, 0x55, 0xb8, 0x9d, - 0x05, 0xb5, 0xc9, 0x1f, 0xa6, 0x25, 0xf3, 0x0d, 0x08, 0x20, 0x34, 0x5e, - 0x5a, 0x14, 0xc8, 0x10, 0x74, 0xf6, 0x82, 0xf9, 0x83, 0xe3, 0xd1, 0xb3, - 0xd1, 0x5d, 0x3c, 0x4d, 0x49, 0x96, 0x48, 0xdc, 0x5b, 0x60, 0xd1, 0x63, - 0xbe, 0xe0, 0xa6, 0xd3, 0x15, 0x91, 0x5d, 0x9e, 0xb3, 0xb0, 0xc6, 0x3b, - 0x38, 0x92, 0xc3, 0x31, 0x4b, 0xe8, 0x66, 0x08, 0x97, 0x33, 0x65, 0x26, - 0x45, 0x44, 0x4a, 0x57, 0x0d, 0xc8, 0x90, 0xae, 0x04, 0x1c, 0x63, 0x4c, - 0x1c, 0xa3, 0xe3, 0xb6, 0xc7, 0xe3, 0x64, 0x51, 0x16, 0x7e, 0x4e, 0x87, - 0x7e, 0x29, 0x74, 0xc3, 0x69, 0x38, 0x79, 0xc2, 0x2b, 0x1f, 0xde, 0x9c, - 0x58, 0x57, 0xc7, 0xc7, 0x71, 0x79, 0xda, 0xd5, 0x44, 0x97, 0x69, 0xe1, - 0x56, 0xad, 0x04, 0x6d, 0xd0, 0x59, 0xc0, 0x9a, 0xcf, 0x78, 0xa0, 0xfc, - 0x70, 0x21, 0x32, 0x12, 0xce, 0x1c, 0x6f, 0xa4, 0x08, 0x49, 0xd2, 0x2f, - 0x73, 0x23, 0x5a, 0x4f, 0xd7, 0x38, 0xf5, 0xea, 0xf6, 0x94, 0xbb, 0x2f, - 0x48, 0xbc, 0x24, 0xee, 0x3c, 0x29, 0x6e, 0xe8, 0x3e, 0xa5, 0xad, 0xbf, - 0xbc, 0xe1, 0x99, 0xce, 0x88, 0x66, 0xee, 0x78, 0x7f, 0x17, 0x49, 0x32, - 0x19, 0x44, 0x67, 0x57, 0x7c, 0x34, 0x73, 0x1a, 0x74, 0x89, 0xaf, 0x99, - 0x5b, 0xd0, 0xba, 0x4d, 0x20, 0x7f, 0xcd, 0x1d, 0x57, 0xc0, 0x50, 0x82, - 0x63, 0xcf, 0x94, 0x46, 0x8b, 0x1d, 0x31, 0xa3, 0x9f, 0x56, 0x59, 0x0b, - 0x44, 0x00, 0x62, 0x01, 0x3c, 0xbc, 0x51, 0x12, 0x81, 0x12, 0x47, 0x49, - 0x79, 0x9f, 0x24, 0xae, 0xb9, 0x22, 0x21, 0x76, 0xc6, 0x9b, 0x26, 0x97, - 0xf9, 0xfc, 0x2e, 0xe3, 0x01, 0x6e, 0x6c, 0x9c, 0x5f, 0x9c, 0x7d, 0x75, - 0x71, 0x3c, 0x1c, 0x46, 0x6f, 0x8e, 0x2f, 0x8f, 0x2f, 0x2a, 0xd4, 0x33, - 0xcf, 0xf2, 0x19, 0x76, 0x74, 0x92, 0x16, 0x8b, 0x69, 0xbc, 0xe2, 0xad, - 0xa6, 0x99, 0x5c, 0xe7, 0x7c, 0xb2, 0x66, 0x09, 0xb3, 0x96, 0xc9, 0x32, - 0x07, 0x59, 0x64, 0x0b, 0xda, 0x3e, 0x15, 0x5b, 0xa8, 0xf1, 0x09, 0x64, - 0x9d, 0xf9, 0xb5, 0x5f, 0x69, 0xba, 0xcd, 0x95, 0x43, 0x32, 0x8b, 0x74, - 0xfb, 0xc1, 0xd2, 0x04, 0xe4, 0xd2, 0x9e, 0xff, 0x4c, 0x96, 0xa9, 0xc0, - 0x9c, 0x88, 0x66, 0xd3, 0x19, 0x64, 0x09, 0xfa, 0xe9, 0x05, 0x88, 0xe4, - 0x8a, 0xe4, 0x25, 0xe2, 0x9a, 0x35, 0x72, 0x77, 0xe3, 0xc4, 0xba, 0x42, - 0xdc, 0x65, 0xf9, 0x97, 0x3a, 0xa7, 0xb1, 0xce, 0xd2, 0x39, 0x11, 0x18, - 0x11, 0xa4, 0x9e, 0x72, 0xa6, 0x04, 0x1a, 0xeb, 0x95, 0xf0, 0x04, 0x5d, - 0x91, 0xaa, 0x1c, 0x4d, 0x2f, 0xd3, 0x66, 0x13, 0x67, 0x75, 0xd3, 0xc3, - 0xa0, 0x88, 0x34, 0xa9, 0xf9, 0x78, 0xc4, 0xac, 0x89, 0x05, 0x4b, 0x92, - 0x06, 0x92, 0xd6, 0xde, 0x9c, 0xa4, 0x4a, 0x6f, 0xd0, 0xd8, 0xe2, 0x11, - 0xef, 0x28, 0x3f, 0x50, 0x5b, 0x45, 0x3a, 0x44, 0xe0, 0x2d, 0xf7, 0x69, - 0x81, 0x43, 0x75, 0x9f, 0x2d, 0xa7, 0x24, 0xd2, 0xf1, 0x03, 0xcb, 0x05, - 0x5e, 0xa0, 0xae, 0x16, 0xfe, 0xf4, 0xcc, 0xd2, 0x07, 0x5e, 0xf5, 0x7a, - 0x2b, 0x34, 0x34, 0xfa, 0x73, 0x41, 0x9b, 0x20, 0xc3, 0x19, 0xd4, 0x79, - 0x2b, 0xb8, 0x46, 0x63, 0x0f, 0xf9, 0xb4, 0x80, 0xdd, 0x9d, 0x9f, 0x0d, - 0x2f, 0x99, 0xfd, 0x9f, 0xbf, 0xbb, 0xa4, 0x86, 0xe8, 0x1a, 0x2a, 0x4a, - 0xda, 0x4e, 0x7e, 0x71, 0x9e, 0x40, 0x86, 0xb6, 0xe6, 0x68, 0xd7, 0x52, - 0x1c, 0x71, 0xdc, 0x2a, 0xd6, 0xa5, 0x8c, 0x51, 0x14, 0x0b, 0x26, 0x5e, - 0x53, 0x2b, 0x8a, 0x9b, 0x84, 0x79, 0xb4, 0x7b, 0x29, 0xda, 0xfc, 0x7c, - 0x8b, 0xb6, 0xbb, 0xef, 0x9a, 0xfb, 0x91, 0x9f, 0xfe, 0x89, 0x7b, 0x2e, - 0xd2, 0x59, 0x3a, 0x8d, 0x83, 0xbb, 0x4d, 0x39, 0x11, 0xd3, 0xb5, 0x3b, - 0x8f, 0x63, 0x62, 0xbb, 0x18, 0xb4, 0x97, 0xa3, 0x79, 0x05, 0x71, 0x9a, - 0xfd, 0x46, 0x4d, 0xb2, 0x44, 0xde, 0x23, 0x51, 0xd6, 0x2d, 0x1c, 0xef, - 0x18, 0x1f, 0xf3, 0xca, 0x32, 0xd5, 0x77, 0xad, 0xb1, 0x6c, 0xcc, 0xc9, - 0xa1, 0x9e, 0xb9, 0x85, 0xeb, 0x8c, 0xe2, 0xbc, 0xe3, 0x38, 0x98, 0xe8, - 0x4c, 0xd4, 0xe8, 0xf5, 0x92, 0x06, 0x2f, 0xab, 0xda, 0x8b, 0xfa, 0x9f, - 0xf0, 0xc8, 0x59, 0xa4, 0x76, 0x27, 0x9a, 0x64, 0xb5, 0xf9, 0x64, 0xb0, - 0x71, 0x06, 0x95, 0xcd, 0xe9, 0x77, 0x27, 0x2c, 0xe4, 0xcd, 0x99, 0xfd, - 0xf5, 0x20, 0x47, 0x8f, 0x48, 0x6f, 0x4b, 0x40, 0x74, 0xc2, 0xcd, 0x58, - 0x0a, 0x4a, 0xe6, 0x4c, 0x3c, 0x13, 0xe1, 0x8f, 0xfd, 0xbe, 0x7c, 0x85, - 0x1d, 0x5f, 0xd1, 0x55, 0x1e, 0x5f, 0xc7, 0xa9, 0x3b, 0xe8, 0x4a, 0x68, - 0xee, 0xd9, 0x79, 0xa6, 0x8f, 0x33, 0x37, 0x62, 0xc6, 0xaa, 0x7b, 0xba, - 0x04, 0xff, 0x49, 0xf8, 0x5e, 0xa2, 0x4d, 0xc1, 0xca, 0x6a, 0xb3, 0xb8, - 0x8d, 0xac, 0xb9, 0x11, 0xee, 0x5f, 0xbe, 0xca, 0x40, 0x99, 0xb8, 0x98, - 0xa8, 0xc9, 0xce, 0x20, 0xfa, 0x9a, 0xb4, 0x01, 0x68, 0x8f, 0x10, 0x50, - 0x52, 0xd6, 0x84, 0xe8, 0x86, 0xb9, 0x4f, 0x48, 0x17, 0x29, 0x4a, 0xe2, - 0x1a, 0x60, 0x6a, 0xf8, 0x8c, 0xc6, 0xe9, 0xd8, 0xd0, 0x4d, 0x76, 0x8f, - 0x6e, 0xdd, 0x24, 0xa8, 0x89, 0x22, 0xc5, 0x25, 0xca, 0x9f, 0xcf, 0x06, - 0xd1, 0x26, 0x98, 0x26, 0x71, 0x56, 0xe6, 0xfe, 0x7e, 0x16, 0x6e, 0x3d, - 0x88, 0x8c, 0x9d, 0xb8, 0x1d, 0x4f, 0x26, 0xcc, 0x41, 0x68, 0x04, 0xd1, - 0xa7, 0x83, 0xdd, 0x17, 0x83, 0x9d, 0x01, 0x1b, 0x0b, 0x92, 0xbb, 0x34, - 0x23, 0x75, 0x8d, 0x44, 0x2d, 0x1e, 0x4a, 0x14, 0xbc, 0x49, 0xea, 0x0b, - 0x1f, 0xeb, 0xeb, 0xeb, 0xa9, 0x30, 0xd4, 0x6d, 0xd2, 0xef, 0x02, 0x9e, - 0x9b, 0x93, 0x62, 0x01, 0x6e, 0xc3, 0x8b, 0xa3, 0xdb, 0x2a, 0x34, 0x17, - 0x32, 0x5b, 0x5d, 0xce, 0x2d, 0x47, 0x27, 0xfd, 0x78, 0xbb, 0xdf, 0x8f, - 0x17, 0xac, 0x94, 0xd4, 0xcc, 0x02, 0x9b, 0x44, 0xa3, 0xdb, 0xac, 0xc1, - 0x6e, 0x45, 0xdf, 0xb1, 0x84, 0x01, 0xce, 0xcc, 0x72, 0xde, 0xdc, 0x69, - 0x80, 0x58, 0x3a, 0x91, 0x41, 0xf8, 0x9c, 0x80, 0xf3, 0xf0, 0x19, 0x6a, - 0x6b, 0x8e, 0x6f, 0x5f, 0xf0, 0x52, 0x12, 0x14, 0x58, 0x86, 0x53, 0xcd, - 0xd0, 0x08, 0x11, 0xac, 0x95, 0x6e, 0x9a, 0xdc, 0x29, 0x28, 0x29, 0x8b, - 0x38, 0x32, 0x0f, 0x7e, 0xb4, 0xd6, 0x1c, 0x9f, 0x91, 0x79, 0x97, 0x44, - 0xc1, 0x87, 0x94, 0x15, 0xd0, 0x54, 0x65, 0x21, 0xba, 0x41, 0xa2, 0x71, - 0x8e, 0x85, 0x18, 0xb0, 0x60, 0x9e, 0x95, 0x89, 0x5d, 0x96, 0x18, 0x6c, - 0x74, 0x35, 0x8d, 0xb9, 0xed, 0xa2, 0xd6, 0x1c, 0xa9, 0xda, 0x99, 0xaa, - 0x87, 0x45, 0x46, 0x8b, 0x36, 0x1c, 0x7e, 0xad, 0x97, 0x67, 0x11, 0x6d, - 0xa6, 0xf3, 0xf1, 0x74, 0x09, 0x1d, 0xe1, 0x8c, 0x26, 0x46, 0x5f, 0x6d, - 0xf9, 0x73, 0xd6, 0x3f, 0xa0, 0xf5, 0x63, 0x9d, 0xb9, 0x1f, 0xd3, 0x49, - 0x28, 0xa3, 0x97, 0xf2, 0xa3, 0x28, 0xf9, 0x72, 0xf9, 0xbc, 0xbe, 0xa4, - 0xcc, 0xab, 0xb6, 0xa2, 0xa1, 0xca, 0x89, 0x3c, 0xb5, 0x77, 0xfc, 0xea, - 0x41, 0xf0, 0x0e, 0x2f, 0x54, 0x41, 0xcb, 0x67, 0x47, 0x1b, 0xec, 0x4d, - 0x86, 0x32, 0xa8, 0x35, 0x37, 0xe4, 0x91, 0x92, 0x28, 0x37, 0x61, 0x72, - 0xc1, 0x15, 0x1c, 0x1d, 0x7e, 0x75, 0xc2, 0x93, 0x24, 0x4d, 0x52, 0xee, - 0x07, 0x9d, 0x74, 0x9a, 0x4c, 0x99, 0xd4, 0xb0, 0x62, 0x50, 0xfa, 0xa2, - 0x50, 0xde, 0xd4, 0xff, 0x75, 0xde, 0x64, 0x3f, 0xd3, 0x1a, 0xc6, 0xdb, - 0x4f, 0x07, 0x3b, 0x1d, 0x96, 0xf8, 0x69, 0xc7, 0x48, 0x9b, 0xc9, 0x26, - 0xdc, 0xc9, 0x34, 0x9e, 0xdf, 0x16, 0x42, 0xad, 0xa0, 0x2c, 0x8c, 0x95, - 0xee, 0xa1, 0x65, 0x9e, 0xd3, 0xd5, 0x38, 0x09, 0x2d, 0x2f, 0x76, 0x5c, - 0x64, 0x3a, 0x38, 0x04, 0x7a, 0xef, 0xff, 0x6d, 0xc9, 0xfb, 0x31, 0x8b, - 0xf3, 0x5b, 0x93, 0x2f, 0x58, 0xf6, 0x27, 0x79, 0x3c, 0xc3, 0xc6, 0x61, - 0x5c, 0x78, 0xbe, 0xa5, 0xb9, 0xfe, 0xd7, 0xb4, 0xd0, 0xac, 0xe0, 0xb3, - 0x25, 0x40, 0x8e, 0x5f, 0x66, 0xc2, 0x88, 0xdf, 0x0e, 0xcf, 0xfd, 0x74, - 0xea, 0xfa, 0x28, 0xfd, 0xca, 0xad, 0xb3, 0xa9, 0x81, 0xc9, 0x81, 0xde, - 0xa5, 0x23, 0x2a, 0xd6, 0x85, 0x69, 0x4c, 0xe7, 0x8c, 0x17, 0xcf, 0x08, - 0xa8, 0xd9, 0x37, 0x7f, 0xcb, 0x44, 0xd4, 0x2d, 0x70, 0x0a, 0x82, 0xdd, - 0xef, 0x13, 0x4b, 0x66, 0x63, 0x49, 0xfb, 0x46, 0x5f, 0xd2, 0xa9, 0x28, - 0xdc, 0xb1, 0xb8, 0x4a, 0xaf, 0x97, 0x79, 0x22, 0x8c, 0x1c, 0xf6, 0x15, - 0x33, 0xab, 0x30, 0xdb, 0xbd, 0xc9, 0x40, 0x7c, 0x24, 0xed, 0x26, 0xd3, - 0xab, 0x5e, 0xad, 0x39, 0x3e, 0xbe, 0x38, 0xd7, 0x18, 0x30, 0x18, 0x43, - 0x91, 0x8c, 0xd1, 0xd8, 0x3c, 0x51, 0x06, 0x3e, 0xe3, 0xa5, 0x65, 0xed, - 0x3c, 0x1a, 0x4f, 0xe3, 0x74, 0x06, 0xd1, 0x58, 0x95, 0xcf, 0x3a, 0xdd, - 0x5c, 0xaa, 0xe8, 0x06, 0x92, 0x19, 0xb1, 0xe4, 0x98, 0x17, 0x2c, 0x1b, - 0xf2, 0x76, 0xc5, 0x76, 0x7d, 0x8a, 0x5c, 0x76, 0x93, 0x8c, 0x6f, 0x41, - 0x94, 0xc1, 0x6d, 0xd9, 0xaf, 0x35, 0x27, 0x9b, 0xc2, 0xd2, 0x53, 0x79, - 0xb3, 0xa4, 0x25, 0x5f, 0x64, 0x45, 0x91, 0x8e, 0x98, 0x26, 0x49, 0x9a, - 0x5a, 0x8e, 0x71, 0x98, 0x69, 0xc5, 0x49, 0xc1, 0xcd, 0x63, 0xba, 0x8e, - 0x4b, 0x58, 0xb3, 0x40, 0x35, 0x7d, 0x22, 0x91, 0xc5, 0xba, 0xd1, 0x09, - 0xc3, 0xa9, 0x32, 0x88, 0x42, 0x05, 0x5e, 0xc8, 0x92, 0x22, 0x5d, 0x8e, - 0xa3, 0xda, 0x6a, 0xd6, 0x9a, 0x93, 0xb5, 0xed, 0xb1, 0x3a, 0x95, 0x92, - 0x4e, 0x2d, 0x12, 0x13, 0x54, 0x4e, 0x92, 0x8f, 0x94, 0x43, 0x93, 0x36, - 0x94, 0x8e, 0xe9, 0xda, 0xeb, 0x4f, 0x52, 0xd2, 0x32, 0x4b, 0xfe, 0x6d, - 0x5e, 0x4e, 0x67, 0xbd, 0x90, 0xfb, 0xbb, 0x1d, 0x9f, 0x27, 0xd7, 0x19, - 0xe9, 0xb8, 0x65, 0x93, 0xea, 0xc0, 0x6d, 0xc0, 0x6c, 0x44, 0x7a, 0x70, - 0xd4, 0x61, 0x72, 0x00, 0xc9, 0x10, 0xc4, 0x8c, 0xd9, 0xfe, 0x33, 0xe1, - 0xd3, 0x89, 0xa1, 0xd0, 0x28, 0x94, 0x9f, 0xd6, 0x79, 0x12, 0x44, 0x79, - 0x3a, 0x46, 0xc4, 0x79, 0x7a, 0x7c, 0x82, 0xc6, 0x10, 0xb0, 0x66, 0xf1, - 0x0a, 0x5b, 0x44, 0x02, 0x89, 0x13, 0x01, 0x46, 0x2c, 0xe9, 0xb3, 0x56, - 0x75, 0x9f, 0x8e, 0x45, 0xa0, 0xe6, 0x05, 0xa9, 0x33, 0x60, 0xd6, 0xe9, - 0xa7, 0x29, 0x3f, 0x37, 0x5b, 0x16, 0x10, 0xb6, 0xf9, 0xb2, 0x15, 0x3d, - 0xe4, 0x9e, 0xb6, 0xca, 0xb1, 0x5b, 0x88, 0x4c, 0x74, 0xdb, 0xb1, 0x24, - 0x17, 0xe7, 0x29, 0x94, 0xae, 0x46, 0x73, 0x32, 0x66, 0x9e, 0x26, 0xc6, - 0xa9, 0xc3, 0xe4, 0xd7, 0x55, 0xae, 0xf1, 0xf2, 0x0c, 0x0e, 0x16, 0xf3, - 0xa4, 0xe0, 0xe0, 0x8c, 0xe8, 0x34, 0x8b, 0x91, 0x30, 0x7a, 0xc9, 0x77, - 0xf6, 0x2b, 0x9e, 0xcb, 0x1a, 0x7e, 0x19, 0x9d, 0x43, 0xd5, 0xbb, 0xa9, - 0xca, 0x3c, 0x01, 0x63, 0x14, 0x55, 0x4e, 0x9a, 0x83, 0x5e, 0xcc, 0xc7, - 0x7d, 0xb9, 0xa8, 0x13, 0x2a, 0x11, 0x66, 0xc2, 0xbc, 0xd2, 0xb5, 0xb4, - 0xf0, 0xd7, 0x2d, 0x6d, 0x4d, 0x92, 0xde, 0xd1, 0xbc, 0xbd, 0x02, 0x25, - 0x4d, 0xc3, 0xb2, 0x11, 0x75, 0x86, 0x49, 0x59, 0x6f, 0xee, 0x10, 0xfd, - 0xed, 0x77, 0xa2, 0xc0, 0x44, 0x22, 0xed, 0xea, 0xda, 0xd1, 0x0a, 0xab, - 0x01, 0xe4, 0x8a, 0xd5, 0x91, 0x32, 0xea, 0xb0, 0x09, 0x7d, 0xf7, 0xd5, - 0xb7, 0x07, 0xa7, 0xef, 0x8e, 0x77, 0xff, 0x5c, 0xa7, 0x1e, 0xfa, 0x6e, - 0x4f, 0xbe, 0xdb, 0xeb, 0xb4, 0x71, 0x34, 0x92, 0x23, 0xba, 0xaf, 0xba, - 0xa4, 0xb1, 0xce, 0x46, 0x19, 0x6c, 0x9a, 0x76, 0x23, 0x83, 0x8b, 0xd1, - 0x10, 0x7a, 0x2a, 0xde, 0x97, 0x72, 0x01, 0xf2, 0xaa, 0xf0, 0xd8, 0xf9, - 0xf6, 0xac, 0x8f, 0x1d, 0x6a, 0x3e, 0xee, 0x64, 0xc8, 0x52, 0x4c, 0x02, - 0xf1, 0x24, 0x5c, 0x8f, 0xa2, 0xc4, 0x7d, 0xa8, 0x5b, 0xc4, 0xad, 0x8b, - 0x6e, 0xd9, 0x93, 0x73, 0x54, 0xe7, 0xf5, 0x6e, 0xc2, 0x7e, 0x4c, 0x60, - 0xb9, 0x05, 0xe4, 0xa3, 0x14, 0x74, 0x45, 0xba, 0x74, 0x5c, 0x8e, 0x6f, - 0x06, 0x74, 0xe7, 0x09, 0x4b, 0xe1, 0x43, 0x2e, 0xc7, 0xb3, 0xce, 0xef, - 0xf8, 0x46, 0x80, 0x51, 0xfb, 0x8e, 0x26, 0x52, 0x08, 0xed, 0x76, 0x74, - 0x2c, 0xa4, 0x0b, 0xd2, 0xd6, 0x74, 0xf4, 0x3c, 0x83, 0xb6, 0x60, 0x01, - 0x06, 0x9b, 0xe5, 0x13, 0x96, 0xd7, 0x9b, 0xa3, 0xa3, 0x93, 0xcd, 0xb8, - 0x4b, 0xb5, 0x4a, 0xb3, 0x7b, 0x41, 0xe7, 0x81, 0xe3, 0x44, 0xc3, 0x66, - 0xc5, 0x77, 0xa5, 0x67, 0xb2, 0x9b, 0x27, 0x7a, 0x80, 0x45, 0xc7, 0xad, - 0x53, 0x3e, 0x35, 0x36, 0x22, 0x61, 0x5b, 0xe4, 0x4d, 0x77, 0x5d, 0x11, - 0x4d, 0x9f, 0x12, 0x4d, 0x4f, 0x33, 0xe5, 0xe9, 0x5e, 0x70, 0x55, 0x3d, - 0x5e, 0x69, 0x20, 0xbb, 0x6a, 0x39, 0x97, 0xa2, 0xe8, 0xeb, 0x2e, 0xd8, - 0x28, 0xe5, 0x5c, 0xb9, 0x95, 0x25, 0xf5, 0x90, 0x6f, 0x5f, 0x90, 0xbd, - 0xf1, 0x5c, 0x36, 0x79, 0xb5, 0x34, 0xf7, 0x36, 0x29, 0x8b, 0x71, 0xbc, - 0x48, 0xb6, 0xf5, 0x46, 0xb7, 0x6d, 0x0c, 0xc6, 0xd1, 0x64, 0x5e, 0x67, - 0x97, 0xc7, 0x5e, 0x54, 0x4a, 0x54, 0x3e, 0xf3, 0x2a, 0xbc, 0xb0, 0xca, - 0xe0, 0xd8, 0x9a, 0xee, 0x8f, 0x1d, 0x8f, 0x1b, 0x02, 0xd5, 0x9c, 0x14, - 0xaa, 0x01, 0xb1, 0x44, 0x37, 0x1d, 0xbb, 0x5e, 0x95, 0xb2, 0xec, 0x64, - 0x50, 0x2f, 0x03, 0x16, 0x35, 0xf0, 0x71, 0xe4, 0x1c, 0x07, 0x75, 0x6e, - 0x63, 0x97, 0x5f, 0xd4, 0x1f, 0xbb, 0x21, 0xf4, 0xff, 0x1a, 0x7b, 0x59, - 0x40, 0xcd, 0xce, 0x58, 0x2d, 0x92, 0xed, 0xe7, 0x24, 0xfc, 0xde, 0x25, - 0x8e, 0x51, 0xb4, 0x5f, 0x59, 0x5e, 0xe1, 0x33, 0x8e, 0x7d, 0x44, 0x8d, - 0x4f, 0x96, 0xb3, 0x85, 0x4a, 0x1a, 0xbf, 0x6b, 0x39, 0x86, 0x20, 0x8a, - 0x5f, 0x2a, 0x56, 0x40, 0xbe, 0xf9, 0x25, 0x82, 0xc5, 0x97, 0x22, 0x56, - 0xf6, 0xe3, 0x62, 0x9c, 0xa6, 0xb5, 0xb7, 0x8e, 0xa1, 0x51, 0x45, 0xd1, - 0xc1, 0xf0, 0xf0, 0xe4, 0xc4, 0xdb, 0x1e, 0xee, 0x45, 0x4a, 0xe7, 0x79, - 0xb0, 0x7a, 0x49, 0x2b, 0xc2, 0x5e, 0xaa, 0x01, 0x4c, 0x78, 0x70, 0x44, - 0x95, 0x2a, 0x71, 0xb5, 0x9d, 0xb6, 0x11, 0x2b, 0x6a, 0x44, 0x1a, 0x63, - 0x11, 0x82, 0xa5, 0x19, 0x9a, 0x10, 0x5b, 0xc2, 0x40, 0x14, 0x74, 0x6b, - 0x15, 0xaa, 0x43, 0xfd, 0xb9, 0x5c, 0x2d, 0x92, 0x57, 0x07, 0x90, 0x11, - 0x6f, 0x1a, 0xa2, 0xb4, 0x69, 0x62, 0xe3, 0x98, 0xc6, 0x5f, 0x44, 0xca, - 0x11, 0x71, 0x3d, 0xf1, 0x2e, 0x4f, 0xd4, 0xf4, 0xa0, 0xcc, 0x91, 0xa4, - 0x02, 0x5a, 0xbe, 0x89, 0x68, 0xc5, 0x74, 0x0b, 0x3d, 0xd9, 0xab, 0xb3, - 0x96, 0x15, 0xdd, 0xff, 0xb3, 0x22, 0x94, 0xb9, 0x70, 0x5d, 0x7f, 0x8c, - 0xc4, 0xc5, 0x54, 0x83, 0xf3, 0xf2, 0x25, 0xbf, 0x51, 0x93, 0x13, 0x06, - 0x5e, 0xd2, 0x68, 0x6e, 0x8c, 0x99, 0x53, 0xf5, 0x32, 0xad, 0xec, 0xf8, - 0xb2, 0x58, 0xc2, 0xb4, 0xb4, 0x20, 0x81, 0xa9, 0x9c, 0x12, 0x8b, 0xeb, - 0x45, 0xcb, 0x39, 0xff, 0x74, 0xba, 0xa9, 0xd7, 0xda, 0xbd, 0xf2, 0xc3, - 0xba, 0x4d, 0x9e, 0xd2, 0x44, 0xe3, 0x28, 0xe4, 0xb3, 0x22, 0xf4, 0xda, - 0x9a, 0xc9, 0xf1, 0x63, 0xa7, 0x0c, 0x38, 0xf7, 0x24, 0x65, 0x17, 0x1e, - 0x0d, 0xb9, 0xbe, 0x63, 0x55, 0xf1, 0xd1, 0xe4, 0xc7, 0x68, 0xb3, 0x58, - 0xb2, 0x88, 0x43, 0x7c, 0xdf, 0x04, 0x18, 0x2f, 0xd2, 0xd0, 0xf2, 0x9a, - 0xec, 0x52, 0xbf, 0x0c, 0x88, 0xc7, 0x86, 0x1a, 0x4d, 0x7f, 0x9c, 0x2e, - 0x6e, 0xf8, 0x74, 0xbc, 0x84, 0x06, 0xcc, 0x52, 0xb6, 0x7c, 0xd0, 0xb8, - 0x9e, 0x87, 0xc3, 0x53, 0xd3, 0x66, 0x70, 0xc2, 0xc1, 0x51, 0xed, 0x6d, - 0x5d, 0xff, 0xd4, 0xbc, 0x09, 0x66, 0xe3, 0x14, 0x96, 0xc8, 0x4d, 0xd7, - 0x09, 0x87, 0x04, 0x3c, 0x7b, 0x59, 0x44, 0x14, 0x67, 0x51, 0x17, 0xbb, - 0xad, 0x7d, 0x3b, 0x88, 0x2e, 0x98, 0x4f, 0x2e, 0x17, 0x6c, 0x56, 0x84, - 0xeb, 0x11, 0x9f, 0xd7, 0x9a, 0xc3, 0xe0, 0x83, 0x0d, 0x85, 0xa7, 0xae, - 0x72, 0xf6, 0x2a, 0x5c, 0x33, 0x0d, 0xbf, 0x23, 0xaa, 0xdf, 0xaf, 0xb3, - 0x0c, 0xef, 0x12, 0x20, 0xc9, 0x66, 0x5e, 0x14, 0x53, 0x38, 0x61, 0x26, - 0xd9, 0xb8, 0xd8, 0x26, 0x85, 0xb7, 0xd8, 0xb6, 0xc1, 0x55, 0xdc, 0x2d, - 0xc6, 0x5c, 0x87, 0xc3, 0x60, 0x6e, 0x6c, 0x15, 0x11, 0xe1, 0xdb, 0x6d, - 0x30, 0xa4, 0x12, 0x3a, 0x6e, 0xa2, 0x60, 0x9e, 0x82, 0xec, 0xbe, 0x9a, - 0x2f, 0x2f, 0x4f, 0x87, 0x58, 0xae, 0xba, 0x64, 0xb8, 0x24, 0x96, 0x62, - 0x9b, 0xc3, 0x6d, 0x5b, 0xd3, 0xb8, 0xae, 0xe4, 0x0a, 0x18, 0x0e, 0x0f, - 0xf1, 0xe1, 0x70, 0xc9, 0x3a, 0x01, 0x75, 0x91, 0xaf, 0x22, 0x53, 0x83, - 0x6b, 0xcd, 0xf1, 0x6c, 0x6d, 0x7e, 0x62, 0xe8, 0xca, 0xf2, 0xd5, 0xe0, - 0x2a, 0x99, 0x64, 0x79, 0x3c, 0x20, 0x5e, 0x4d, 0x44, 0x09, 0xf7, 0x07, - 0xe6, 0x4a, 0x87, 0xf5, 0x3d, 0xcd, 0x1e, 0xd3, 0xfc, 0xe4, 0x88, 0x9f, - 0xae, 0x93, 0x13, 0xdd, 0xda, 0x49, 0xf1, 0x61, 0xc6, 0x89, 0x7b, 0xc3, - 0x7c, 0x60, 0x6c, 0x22, 0x2d, 0xda, 0x18, 0xa7, 0x1d, 0x9b, 0x96, 0x5b, - 0x0e, 0x76, 0xc7, 0x0a, 0x63, 0xa0, 0x41, 0x2e, 0xd8, 0xc8, 0x95, 0x4c, - 0xda, 0xb9, 0xc3, 0x85, 0xa9, 0x36, 0x91, 0x7f, 0xd2, 0x1b, 0xd4, 0xea, - 0x91, 0x04, 0xc4, 0x18, 0xaf, 0xb3, 0x9c, 0x38, 0xde, 0xac, 0x68, 0x90, - 0x96, 0x38, 0x90, 0x55, 0xbf, 0x2a, 0x7a, 0x6a, 0xc0, 0x2c, 0x97, 0xb9, - 0xac, 0xfe, 0x72, 0x1e, 0x74, 0x40, 0xcb, 0xb6, 0x9c, 0xc1, 0xe3, 0x6b, - 0xab, 0xb0, 0x86, 0x63, 0x7a, 0xa5, 0x07, 0x0a, 0x5f, 0x20, 0x84, 0x16, - 0xe0, 0xbe, 0x6c, 0x79, 0x99, 0xfb, 0xb8, 0x06, 0xe8, 0xe6, 0xac, 0x85, - 0xd7, 0xe5, 0x13, 0xe7, 0x6a, 0xc8, 0x13, 0x7e, 0x14, 0xca, 0x17, 0xa9, - 0xe9, 0x79, 0x75, 0xa9, 0x70, 0x1e, 0xfb, 0xbc, 0xf0, 0xcc, 0x91, 0x5f, - 0x92, 0x42, 0x99, 0x51, 0x27, 0xf5, 0x33, 0xfe, 0x26, 0x7e, 0x48, 0x67, - 0xcb, 0x19, 0x36, 0x88, 0x69, 0x4b, 0x1f, 0x13, 0x4e, 0xc5, 0xfc, 0x8e, - 0x58, 0x61, 0x76, 0xaf, 0x77, 0xb3, 0x3f, 0xe4, 0xce, 0xde, 0x53, 0xe7, - 0xe6, 0x32, 0x1f, 0xf9, 0x96, 0xa4, 0xb6, 0x81, 0x29, 0x7c, 0x66, 0x72, - 0x9b, 0xb1, 0xbf, 0xa7, 0xca, 0x30, 0xa2, 0xc5, 0x4d, 0x5c, 0xd0, 0xad, - 0xca, 0x77, 0x6b, 0xdb, 0x54, 0xe9, 0x5b, 0x7b, 0x3a, 0x69, 0x30, 0xeb, - 0x0c, 0x72, 0x33, 0x2e, 0x68, 0x5a, 0xda, 0x01, 0xfb, 0xf2, 0x4d, 0xbe, - 0x6c, 0xb1, 0x31, 0xcc, 0xe8, 0xd6, 0x9d, 0xc5, 0x0f, 0x58, 0x15, 0x93, - 0xe0, 0x7e, 0x2d, 0x4a, 0x56, 0xe1, 0x38, 0xd8, 0x84, 0x9a, 0x24, 0xf3, - 0x12, 0x82, 0x08, 0x4b, 0xe6, 0xf5, 0x4d, 0x70, 0x06, 0xa3, 0x4c, 0x79, - 0x2c, 0x9e, 0x74, 0x66, 0x71, 0xbb, 0xee, 0xc4, 0x9a, 0xcf, 0x76, 0x58, - 0x93, 0xb9, 0xe2, 0x2b, 0x58, 0xd7, 0x9b, 0x02, 0xec, 0x62, 0x9a, 0xf0, - 0x62, 0x39, 0x1d, 0x6d, 0xa0, 0x0e, 0x2a, 0x6e, 0xa1, 0xd0, 0x98, 0x08, - 0x6b, 0xa4, 0x72, 0x5d, 0xb1, 0x84, 0xda, 0xaa, 0xa7, 0xc6, 0x15, 0x7f, - 0x8f, 0x18, 0xf7, 0x62, 0xd8, 0x2d, 0xe1, 0xe5, 0x2c, 0x2a, 0xe3, 0xaa, - 0x68, 0x5b, 0xb5, 0xe6, 0xcc, 0x94, 0x01, 0x4a, 0xd9, 0x2c, 0xb6, 0x06, - 0xaa, 0xfb, 0xb8, 0x39, 0xd1, 0x56, 0xde, 0xce, 0xb3, 0x7b, 0xd2, 0x36, - 0xe7, 0x99, 0x74, 0x64, 0xeb, 0xcb, 0xc3, 0x6f, 0x70, 0xa3, 0x64, 0xae, - 0xaa, 0x99, 0x0e, 0xca, 0xc9, 0x63, 0xfc, 0x74, 0xe9, 0x44, 0xa6, 0x50, - 0x6e, 0x0e, 0xe5, 0xe5, 0xfa, 0x64, 0x45, 0x7a, 0x76, 0x2e, 0xdf, 0xa4, - 0xf4, 0x02, 0x3c, 0x94, 0x2a, 0xa6, 0x6c, 0xef, 0xe9, 0x22, 0xe9, 0xa7, - 0xb8, 0xe9, 0x91, 0xfe, 0xd8, 0xef, 0xf4, 0xda, 0x28, 0xae, 0x2e, 0x1c, - 0xdb, 0x98, 0x9c, 0xa8, 0xd4, 0x2e, 0xa7, 0xab, 0xa2, 0xae, 0xc3, 0x64, - 0xe2, 0x21, 0xb1, 0xae, 0x0b, 0x9d, 0x5e, 0xad, 0x9f, 0x7c, 0xdf, 0xfb, - 0xc6, 0x84, 0x1e, 0xef, 0x6f, 0xb2, 0x69, 0xeb, 0x09, 0x0a, 0x54, 0xf5, - 0x8c, 0x9b, 0x81, 0xfd, 0x90, 0x1a, 0x80, 0x1c, 0x5d, 0x63, 0x22, 0xd1, - 0x78, 0x9a, 0xc4, 0xf9, 0x74, 0xa5, 0x6a, 0x5c, 0xfd, 0x04, 0xdd, 0xd9, - 0x02, 0xc3, 0xc6, 0x1b, 0x13, 0x81, 0xe6, 0x73, 0x5e, 0x5e, 0xf5, 0x6f, - 0x59, 0x1c, 0x44, 0x29, 0xe6, 0x7c, 0xe1, 0xe3, 0x7c, 0xf2, 0xef, 0x52, - 0xb6, 0x19, 0x35, 0x56, 0x3b, 0x49, 0x26, 0xa3, 0x78, 0x7c, 0x8b, 0xb5, - 0xe6, 0x16, 0xd5, 0x73, 0x75, 0x83, 0x88, 0x1e, 0x35, 0x33, 0x11, 0x29, - 0xdf, 0xd0, 0xc1, 0x2b, 0xd2, 0x72, 0x19, 0xff, 0x8b, 0x27, 0x56, 0x8e, - 0x6c, 0x9d, 0x90, 0xdb, 0x74, 0xe7, 0x35, 0x47, 0xfa, 0x10, 0x47, 0x9a, - 0x44, 0xb3, 0xf9, 0x92, 0x64, 0x77, 0x62, 0xab, 0xd9, 0xd5, 0x15, 0xd1, - 0xc8, 0xe7, 0x0d, 0xd3, 0x81, 0x3c, 0xb2, 0x7d, 0x21, 0x61, 0x50, 0xa1, - 0x50, 0x18, 0x55, 0xdd, 0xbe, 0x7c, 0x69, 0xf3, 0xd0, 0xae, 0x53, 0xde, - 0x0c, 0x69, 0xae, 0x69, 0x32, 0xab, 0x7e, 0x6f, 0x2b, 0x2b, 0xfe, 0x11, - 0x8b, 0x9f, 0x82, 0x80, 0x35, 0x5a, 0xa9, 0x42, 0x1d, 0x97, 0xcd, 0x68, - 0x0e, 0x63, 0xd2, 0xb7, 0xe9, 0x62, 0xc1, 0x3b, 0x25, 0x61, 0x18, 0x30, - 0xb8, 0x39, 0xb3, 0xc8, 0x28, 0xb9, 0x4e, 0xe7, 0xd8, 0x52, 0x73, 0x32, - 0x64, 0x4b, 0xd2, 0x1a, 0x64, 0xd0, 0xa3, 0x84, 0xce, 0x47, 0xbd, 0x39, - 0x33, 0x4a, 0x78, 0xb7, 0xa9, 0x5a, 0x70, 0x26, 0xec, 0x22, 0x9d, 0x2b, - 0xff, 0xe1, 0x5d, 0xc2, 0xb6, 0x40, 0xc7, 0x50, 0x8b, 0x58, 0xaf, 0xe5, - 0xc8, 0xbc, 0xf6, 0x66, 0x1f, 0x73, 0x6d, 0x0c, 0x4f, 0xfe, 0xf7, 0xb1, - 0x77, 0x72, 0x3b, 0x2f, 0xf2, 0x0a, 0xd4, 0xdd, 0x20, 0x87, 0x77, 0xac, - 0x4b, 0x76, 0xfa, 0x87, 0xb4, 0x5d, 0x1d, 0x0c, 0xa5, 0xe2, 0xbb, 0x58, - 0x96, 0x19, 0x1d, 0x70, 0x8d, 0x07, 0x40, 0x6c, 0x16, 0x53, 0x1c, 0xe9, - 0x56, 0x79, 0xb2, 0x0d, 0x07, 0x50, 0xd6, 0xe0, 0x57, 0xd8, 0x42, 0xb8, - 0xe1, 0x74, 0x8e, 0xb0, 0x41, 0x95, 0xea, 0x34, 0x29, 0x82, 0xed, 0x53, - 0x47, 0xe3, 0x36, 0xb4, 0x63, 0xf5, 0x93, 0x37, 0x55, 0x05, 0x35, 0x14, - 0x8b, 0x57, 0xb0, 0x85, 0x05, 0xfc, 0x7a, 0x37, 0x50, 0x5f, 0xb8, 0x05, - 0x29, 0x09, 0x79, 0x7d, 0x1c, 0xf0, 0xf9, 0x38, 0x1b, 0x2c, 0xee, 0xf6, - 0xbf, 0x92, 0x58, 0xa3, 0x06, 0x3d, 0xda, 0x22, 0x78, 0xc2, 0xcc, 0xb5, - 0xd5, 0x0b, 0xa4, 0x0e, 0x69, 0xb3, 0x45, 0x60, 0xa3, 0x1b, 0x9a, 0x24, - 0xa2, 0x98, 0x63, 0x26, 0x32, 0x5a, 0xdf, 0xc8, 0xc9, 0x9a, 0xd1, 0x4d, - 0x4a, 0x23, 0xcf, 0xc7, 0x37, 0x2b, 0xbe, 0x28, 0xd8, 0xfc, 0x08, 0xf7, - 0xcd, 0x65, 0x60, 0xc1, 0xaf, 0xb3, 0x2d, 0xf4, 0xa1, 0x96, 0x21, 0x1e, - 0x7d, 0xc4, 0x12, 0x16, 0x3d, 0x67, 0x04, 0x54, 0x1b, 0x1d, 0xd1, 0xc5, - 0x0d, 0xd3, 0x6c, 0x32, 0x65, 0x21, 0xe0, 0xa4, 0xcd, 0x06, 0xd3, 0xcf, - 0x02, 0x2e, 0x8e, 0x7d, 0xa3, 0xeb, 0x85, 0x9a, 0x66, 0x46, 0x28, 0x06, - 0x2c, 0xe9, 0x88, 0x6d, 0xb0, 0xd2, 0x17, 0x2e, 0x4a, 0xbe, 0x10, 0x57, - 0xb5, 0xe6, 0xd4, 0x29, 0xa5, 0xef, 0xdb, 0xda, 0x9b, 0x5f, 0xaa, 0xbe, - 0x9d, 0xec, 0x67, 0x91, 0xef, 0xec, 0xee, 0xb3, 0x85, 0x11, 0xa5, 0xaa, - 0xae, 0xd5, 0x4b, 0x54, 0x29, 0xcb, 0xf3, 0xfd, 0xfe, 0x55, 0xd9, 0xb0, - 0x72, 0x06, 0x5b, 0x5a, 0xdd, 0xe9, 0xe9, 0x15, 0x7c, 0x7a, 0x5b, 0xcc, - 0x7d, 0x88, 0x52, 0xca, 0xe8, 0xf4, 0x35, 0x53, 0xdb, 0xe1, 0x05, 0xfd, - 0x4c, 0xcd, 0xa9, 0xc7, 0x6c, 0x1d, 0x21, 0xa2, 0xac, 0x8f, 0xbf, 0xf9, - 0x76, 0x18, 0x6d, 0x9e, 0x0d, 0xb7, 0x9f, 0xbc, 0xd8, 0xd9, 0xaa, 0xb7, - 0xc5, 0x4b, 0x05, 0x89, 0xa5, 0xd5, 0x68, 0x3b, 0xdc, 0xe6, 0xc8, 0xda, - 0x2d, 0x8e, 0x7e, 0xbe, 0x13, 0xa5, 0x37, 0xb0, 0xb2, 0x9c, 0x1f, 0xbf, - 0x31, 0x6b, 0x18, 0xf6, 0x8a, 0x98, 0xdf, 0x21, 0x8d, 0x87, 0x8d, 0xf9, - 0x4d, 0xc2, 0xb9, 0x48, 0xee, 0xcc, 0xa4, 0x16, 0x9d, 0x42, 0xa5, 0xc3, - 0xb9, 0x60, 0xbb, 0x9d, 0x69, 0x87, 0x8b, 0x84, 0x79, 0x81, 0x6f, 0x41, - 0xa5, 0x53, 0x16, 0x14, 0x1a, 0xa7, 0x75, 0x04, 0xc9, 0xb2, 0xa0, 0x31, - 0xe5, 0x90, 0xfd, 0x39, 0x72, 0x62, 0xf2, 0xdb, 0x9d, 0x30, 0x5b, 0x93, - 0x03, 0x38, 0x7b, 0x69, 0x95, 0xe1, 0xea, 0xfd, 0x34, 0xf0, 0xbf, 0x4e, - 0xd8, 0xe2, 0xc4, 0x26, 0x92, 0x97, 0x8f, 0x58, 0xc0, 0x87, 0x89, 0xc8, - 0xdc, 0xa1, 0x41, 0x0e, 0x2f, 0xc1, 0x3a, 0x8d, 0xe0, 0x07, 0x73, 0xdb, - 0x78, 0x47, 0x6b, 0x8b, 0xdd, 0xcb, 0x82, 0xa6, 0x9d, 0x1f, 0x4f, 0x5c, - 0xc4, 0x74, 0x4b, 0xaf, 0x74, 0x5d, 0xe3, 0x68, 0x94, 0x67, 0xf7, 0x1c, - 0x03, 0x8c, 0x28, 0x04, 0x50, 0x5f, 0x2c, 0x41, 0xc1, 0x37, 0x0d, 0x23, - 0x1f, 0xed, 0xe9, 0xd4, 0x39, 0x85, 0xbf, 0xbe, 0x7c, 0x73, 0x8a, 0x6d, - 0x85, 0xf6, 0x22, 0xca, 0x8f, 0x8e, 0x79, 0x39, 0x22, 0xb1, 0x9e, 0xef, - 0xfd, 0xd2, 0x99, 0x5d, 0x2a, 0x11, 0xbc, 0x46, 0xb9, 0x31, 0xa2, 0xa1, - 0x94, 0x13, 0x2f, 0xda, 0x8c, 0xfe, 0xca, 0xf8, 0xbd, 0xc8, 0xc6, 0x97, - 0x2d, 0x9d, 0xc6, 0x3e, 0x9b, 0xa4, 0xea, 0x66, 0x8d, 0xc5, 0x62, 0xaa, - 0x26, 0x92, 0xed, 0x87, 0x3e, 0x29, 0xee, 0x7d, 0x1e, 0x5d, 0x9f, 0x9a, - 0x17, 0xaf, 0x26, 0xb3, 0x98, 0x43, 0x12, 0x85, 0x85, 0x4e, 0xa2, 0xfe, - 0x6b, 0xda, 0x09, 0x7e, 0xa2, 0xb1, 0x7b, 0x7e, 0x8f, 0xf4, 0x5e, 0x95, - 0x45, 0x63, 0xe9, 0x56, 0x3e, 0x17, 0x2b, 0x9d, 0xba, 0x4c, 0x17, 0xf0, - 0xdb, 0xe3, 0xf1, 0x68, 0x41, 0x7c, 0x7c, 0x5a, 0xe7, 0x0e, 0x6c, 0x3c, - 0xce, 0x57, 0x12, 0xc9, 0xa0, 0xe6, 0x5d, 0x73, 0x72, 0x59, 0x60, 0x83, - 0x36, 0x2b, 0x4f, 0x7a, 0x53, 0x72, 0xc6, 0xaa, 0x7a, 0xfd, 0xbc, 0xab, - 0x8b, 0x96, 0x5f, 0xbb, 0x8b, 0xa7, 0x4b, 0x68, 0xaf, 0xb1, 0x6c, 0x84, - 0xf8, 0x7d, 0x11, 0x37, 0x18, 0xc3, 0x50, 0x6b, 0x0d, 0xbb, 0x35, 0x68, - 0xa3, 0x7c, 0x8e, 0x32, 0x91, 0xbb, 0xbd, 0x48, 0x5c, 0xfc, 0x81, 0x1d, - 0x81, 0xaa, 0xa9, 0xd3, 0x62, 0x45, 0x65, 0x41, 0xe8, 0x3a, 0xae, 0x0f, - 0x0e, 0xd7, 0xb3, 0x3a, 0x27, 0x84, 0xe0, 0x74, 0x61, 0x52, 0xbe, 0x0b, - 0x2a, 0xe6, 0x65, 0x39, 0x3e, 0xb3, 0x24, 0xbf, 0x86, 0x84, 0x40, 0xd2, - 0x5e, 0xd3, 0xa6, 0xa3, 0xec, 0x42, 0x03, 0xc2, 0x20, 0x98, 0xfc, 0xa1, - 0x2f, 0x0e, 0x11, 0xdc, 0x17, 0x4b, 0xf6, 0x42, 0x0a, 0x71, 0x44, 0xdd, - 0xfe, 0x44, 0x64, 0xb5, 0x57, 0x93, 0x78, 0x4e, 0x0b, 0xc1, 0xfb, 0xd8, - 0x14, 0x74, 0xa6, 0xd3, 0x57, 0x53, 0x12, 0xba, 0x56, 0xdd, 0x48, 0x43, - 0x97, 0x34, 0xa0, 0xa5, 0x54, 0xa1, 0x0c, 0x9b, 0x39, 0xbe, 0x59, 0xce, - 0x6f, 0x4d, 0x68, 0x9a, 0x92, 0xd0, 0x5d, 0x44, 0x88, 0x9d, 0xaf, 0x35, - 0xd7, 0x0d, 0x7a, 0xfb, 0x43, 0xd8, 0x76, 0xdb, 0x2a, 0x63, 0xf7, 0x39, - 0x68, 0xd2, 0xd3, 0xb8, 0xbb, 0xb8, 0x24, 0xe6, 0x34, 0xfa, 0xa2, 0x67, - 0x7e, 0xd7, 0xd2, 0xb9, 0x58, 0x60, 0x48, 0x8e, 0x9b, 0xe7, 0x30, 0x09, - 0x7c, 0x3a, 0xf0, 0x22, 0xb8, 0x56, 0xc5, 0x6b, 0xc3, 0xe6, 0x3f, 0xf3, - 0x39, 0x56, 0x94, 0xc6, 0x16, 0x85, 0xae, 0xf2, 0xaa, 0x78, 0xf6, 0x5c, - 0x7e, 0x02, 0x4e, 0x5b, 0x61, 0xb2, 0x1f, 0x3a, 0x16, 0x53, 0x9d, 0xde, - 0x84, 0x2d, 0xe2, 0x24, 0xd3, 0xac, 0x3f, 0x71, 0x6f, 0xc2, 0xe0, 0xc6, - 0x6a, 0x00, 0x80, 0xa3, 0x86, 0x41, 0x74, 0x9e, 0x15, 0xd8, 0x5e, 0x1e, - 0x46, 0x9b, 0xba, 0x19, 0xfb, 0xbb, 0x7a, 0x12, 0x75, 0xaf, 0xb2, 0x6c, - 0x14, 0xe7, 0x5d, 0xdd, 0x41, 0x78, 0xa1, 0xa9, 0xb9, 0x89, 0xb0, 0x65, - 0x78, 0x78, 0x85, 0xea, 0xbe, 0xa0, 0x07, 0xeb, 0x14, 0x3a, 0x8a, 0x2b, - 0x76, 0x91, 0xf0, 0xdc, 0x3d, 0xc6, 0x91, 0x95, 0x8b, 0x31, 0x7d, 0x68, - 0xb8, 0x1e, 0x84, 0xed, 0x29, 0x24, 0x98, 0x9a, 0xd7, 0x84, 0xe4, 0x00, - 0x71, 0x7e, 0x2f, 0xf2, 0x46, 0xf7, 0x2c, 0x11, 0x21, 0x4c, 0x82, 0x68, - 0xab, 0xc8, 0x92, 0xbb, 0x30, 0x3a, 0xfa, 0xb7, 0x23, 0x16, 0x5e, 0x37, - 0x36, 0xbd, 0x1c, 0x61, 0x59, 0x6c, 0x22, 0x2e, 0x8e, 0x5b, 0x42, 0xd9, - 0x2c, 0x88, 0x1b, 0xe6, 0x64, 0xcf, 0xe6, 0x5a, 0x02, 0x71, 0x7a, 0x34, - 0x3f, 0x44, 0x3c, 0xe1, 0x84, 0xcc, 0x93, 0x7b, 0xf1, 0x17, 0xc2, 0xce, - 0xc9, 0x17, 0x01, 0x33, 0x6d, 0xb3, 0x6a, 0x8d, 0x21, 0x7c, 0x14, 0x2a, - 0x3e, 0x35, 0x94, 0x85, 0x39, 0x2f, 0x01, 0xb6, 0xee, 0xc3, 0x41, 0x1d, - 0xde, 0x60, 0xd6, 0x72, 0x31, 0x23, 0xaa, 0xfe, 0x2a, 0x63, 0xeb, 0x94, - 0xde, 0x15, 0x8d, 0x75, 0xe0, 0xa8, 0x07, 0x09, 0xc9, 0x45, 0xc0, 0x92, - 0xac, 0x6b, 0x5c, 0x68, 0x06, 0xc6, 0x48, 0x96, 0xc3, 0x31, 0xff, 0x06, - 0x95, 0x38, 0x26, 0xfa, 0x28, 0xa1, 0x5c, 0xaa, 0xae, 0xaa, 0x64, 0xd2, - 0x73, 0xab, 0xab, 0x37, 0x9a, 0x44, 0x66, 0x2b, 0x85, 0x1a, 0xb7, 0xe5, - 0xcd, 0x6d, 0x39, 0x94, 0xb2, 0xca, 0x29, 0x98, 0x6e, 0x6c, 0x6a, 0x70, - 0x92, 0x33, 0xaf, 0x2f, 0xfc, 0x31, 0xa3, 0xe9, 0x0e, 0xaa, 0x12, 0xc7, - 0x67, 0x83, 0x9d, 0xad, 0x16, 0xa1, 0x73, 0x24, 0x01, 0x43, 0x30, 0x9b, - 0x4e, 0x53, 0x62, 0x0a, 0xca, 0xa3, 0x65, 0x3a, 0x92, 0x21, 0xe2, 0xfc, - 0x8f, 0xa4, 0xf5, 0x19, 0xfb, 0x0d, 0x63, 0xec, 0x9c, 0x59, 0x84, 0x17, - 0x5a, 0x94, 0x2e, 0xc7, 0x9f, 0x33, 0x09, 0xec, 0x8c, 0x8d, 0x6d, 0xb8, - 0x90, 0x8d, 0xd8, 0xfb, 0x01, 0xda, 0xd7, 0x0e, 0x5d, 0x33, 0x6b, 0x60, - 0xbf, 0x67, 0x0c, 0x2b, 0x2a, 0x2d, 0x17, 0x58, 0x56, 0xc3, 0x4a, 0xeb, - 0xf7, 0x58, 0xd2, 0x6d, 0x92, 0x62, 0x7f, 0xa3, 0x61, 0x65, 0x41, 0xff, - 0xed, 0x79, 0x6f, 0x5e, 0x1c, 0x09, 0xfc, 0xc8, 0x9e, 0x67, 0x85, 0x52, - 0x86, 0x48, 0x36, 0x22, 0x97, 0xc4, 0x6b, 0x9a, 0xe3, 0x89, 0xfd, 0xa7, - 0xc6, 0x57, 0x8c, 0x89, 0xbe, 0x59, 0x96, 0x2e, 0x32, 0xdb, 0x30, 0xdf, - 0x94, 0x8b, 0x60, 0xc3, 0x27, 0x71, 0xc3, 0xcb, 0xec, 0x42, 0x7f, 0x88, - 0xa5, 0xbe, 0x42, 0x6a, 0x43, 0xf4, 0x45, 0xa4, 0xce, 0x7f, 0x36, 0x38, - 0xab, 0x90, 0xeb, 0x33, 0x00, 0x30, 0x78, 0x5c, 0xc6, 0x58, 0x86, 0xf6, - 0xe6, 0xe0, 0x81, 0x0f, 0x57, 0x4f, 0xc8, 0x8f, 0xe3, 0x52, 0x0b, 0x49, - 0xb9, 0x6a, 0xb8, 0x3c, 0x5f, 0x7d, 0x78, 0xf5, 0x7e, 0xe1, 0xe2, 0x7d, - 0x60, 0xf5, 0x2e, 0x11, 0x65, 0x4c, 0xf2, 0x01, 0xa2, 0x4b, 0x5e, 0x05, - 0x01, 0x0f, 0xac, 0xdd, 0x4b, 0x30, 0x9e, 0x77, 0x20, 0x57, 0x8f, 0x66, - 0x60, 0xa2, 0x79, 0xf5, 0xab, 0xed, 0x3a, 0xa8, 0xd1, 0x46, 0xdf, 0xde, - 0x9c, 0xe8, 0xea, 0xf3, 0x41, 0x10, 0x03, 0x04, 0x8d, 0x17, 0xd9, 0x14, - 0xfc, 0x3a, 0xf5, 0x96, 0x3c, 0x2c, 0xd4, 0x44, 0xad, 0x67, 0xaf, 0x45, - 0x98, 0xab, 0xc8, 0x74, 0x13, 0xbb, 0x54, 0x1b, 0xf3, 0xfb, 0xc2, 0x98, - 0xf8, 0x07, 0x27, 0x27, 0xb3, 0xd3, 0xa0, 0x70, 0xc4, 0xe5, 0xa8, 0x04, - 0x26, 0x56, 0x5b, 0x88, 0x64, 0x62, 0x9b, 0x68, 0xb1, 0x74, 0x19, 0x27, - 0xf3, 0x01, 0x90, 0x4c, 0x8e, 0xc6, 0xdf, 0xb7, 0x7a, 0xd5, 0x05, 0xa3, - 0x39, 0x4b, 0xd3, 0xe0, 0xf3, 0xeb, 0xd7, 0x2a, 0xe5, 0x95, 0xb2, 0xed, - 0x63, 0xdd, 0xa5, 0x75, 0xfb, 0xfe, 0x4f, 0x9f, 0x22, 0xfc, 0x8b, 0x4e, - 0xcd, 0xc2, 0x34, 0xd5, 0x0c, 0xed, 0x89, 0xe2, 0x9a, 0x1d, 0xbd, 0x6c, - 0x58, 0xfd, 0xdb, 0x12, 0x06, 0xcc, 0xeb, 0x75, 0x4c, 0x00, 0xf7, 0x13, - 0x5b, 0xe4, 0xd8, 0xd8, 0x34, 0x85, 0x64, 0x44, 0x4d, 0x83, 0xca, 0xbd, - 0x3a, 0xd3, 0x47, 0xa0, 0x8f, 0x12, 0xad, 0x50, 0xe2, 0x23, 0xc4, 0xea, - 0xc8, 0xb3, 0x46, 0x99, 0xa3, 0x24, 0x14, 0xd8, 0x9a, 0x14, 0x68, 0x1e, - 0xe5, 0xf6, 0xdb, 0x4e, 0x42, 0x13, 0x0a, 0xf1, 0xba, 0x1f, 0xe1, 0xc1, - 0xb5, 0x6e, 0xf7, 0x38, 0xf8, 0xa6, 0xe9, 0x43, 0xb4, 0x4b, 0x8e, 0xcd, - 0xa2, 0x10, 0x39, 0x91, 0x7c, 0x40, 0x2b, 0x7e, 0x9f, 0xe5, 0x1a, 0xa5, - 0x35, 0x4a, 0xc0, 0xf5, 0xf9, 0x88, 0xb2, 0x9b, 0x50, 0x6c, 0xdc, 0x1c, - 0x17, 0xd7, 0x0c, 0xd9, 0x61, 0x9b, 0x75, 0x84, 0x68, 0x83, 0x81, 0x1a, - 0x00, 0x35, 0xb6, 0xa7, 0x12, 0xcd, 0xe3, 0x64, 0x2a, 0x49, 0x1f, 0x89, - 0xfa, 0x4b, 0x0d, 0xee, 0x6d, 0x77, 0xd8, 0x21, 0x52, 0x57, 0x13, 0x72, - 0xb1, 0x94, 0xc6, 0x23, 0x78, 0x88, 0xe2, 0x6a, 0x82, 0x68, 0xeb, 0x9d, - 0xf1, 0x6b, 0xfd, 0xef, 0x78, 0xd5, 0xc7, 0x0b, 0xb2, 0xf1, 0xc5, 0x32, - 0x51, 0x55, 0x26, 0x58, 0x2f, 0x0e, 0x7d, 0xd8, 0x48, 0xe1, 0xaf, 0xc8, - 0x6c, 0x4c, 0xc7, 0x24, 0x47, 0x8e, 0x62, 0x43, 0x53, 0xbb, 0x4d, 0xc4, - 0x62, 0x25, 0x2e, 0xe9, 0x71, 0x52, 0xdd, 0x73, 0x44, 0xe6, 0xf7, 0x93, - 0x45, 0x5e, 0xb6, 0xc4, 0x89, 0x4b, 0xe0, 0x85, 0xd3, 0x29, 0xf4, 0x69, - 0x71, 0x85, 0xfa, 0x70, 0xf4, 0xe3, 0xf3, 0x0b, 0x49, 0x79, 0x3e, 0xe5, - 0x5f, 0xd4, 0x78, 0x5b, 0x1f, 0x07, 0x2c, 0x0e, 0x1a, 0x8b, 0xca, 0x01, - 0x60, 0x09, 0xcc, 0x5e, 0x2e, 0x09, 0x6a, 0x10, 0x64, 0x52, 0xb9, 0x24, - 0x9f, 0x78, 0x7a, 0xcf, 0xa9, 0x33, 0x90, 0xe8, 0x1a, 0x6b, 0xeb, 0xb2, - 0xad, 0x78, 0x24, 0x3c, 0x84, 0x9e, 0xdc, 0x97, 0x18, 0x84, 0x18, 0xac, - 0xcd, 0x2e, 0x75, 0xc6, 0x5f, 0xb2, 0x7b, 0xc2, 0xa2, 0xba, 0xd6, 0xb8, - 0x6a, 0x7b, 0x72, 0xc2, 0x85, 0xfb, 0x70, 0xb3, 0xfc, 0x66, 0x94, 0x23, - 0x37, 0x2f, 0xa6, 0xa1, 0x0c, 0x6a, 0x53, 0x45, 0x1a, 0xc4, 0x43, 0x19, - 0x64, 0x54, 0x9b, 0x02, 0x0a, 0x69, 0xcf, 0x24, 0x41, 0x6a, 0x00, 0x89, - 0x3e, 0x3c, 0x61, 0x4b, 0xd5, 0x13, 0xd7, 0x32, 0xf4, 0x77, 0x5c, 0x7f, - 0x92, 0x0b, 0x2e, 0xf9, 0x54, 0x0d, 0x03, 0x8a, 0x46, 0xac, 0x9b, 0x8b, - 0x25, 0x59, 0x69, 0xf2, 0x85, 0x68, 0xed, 0x57, 0x6a, 0xbe, 0x8d, 0xa7, - 0x69, 0xb9, 0x12, 0x49, 0x7f, 0x24, 0xba, 0x03, 0x9b, 0x7f, 0x58, 0xa7, - 0x6f, 0x11, 0x39, 0x69, 0xe1, 0x27, 0xa9, 0xbc, 0x25, 0xb3, 0xd4, 0x6d, - 0x6b, 0x1a, 0x49, 0x40, 0x1b, 0x26, 0xb4, 0x2d, 0x55, 0x64, 0x23, 0xce, - 0x32, 0x4d, 0xc7, 0x29, 0xeb, 0x45, 0x3a, 0x14, 0x59, 0x19, 0xce, 0xfa, - 0x50, 0x9a, 0x9f, 0x67, 0x6d, 0x54, 0x95, 0x82, 0x31, 0xd2, 0x50, 0x63, - 0xc9, 0x89, 0xab, 0x92, 0x60, 0xa3, 0xf7, 0x23, 0x7c, 0x09, 0xbd, 0x1f, - 0x1d, 0xc0, 0xa7, 0x34, 0xbe, 0xd1, 0xac, 0x51, 0xf6, 0xe5, 0x0b, 0x2d, - 0x8d, 0x92, 0x9b, 0xf8, 0x2e, 0xcd, 0xf2, 0x41, 0x25, 0xaf, 0xa8, 0x61, - 0x25, 0x2c, 0x88, 0x00, 0x48, 0x4e, 0x52, 0x2b, 0x14, 0xbf, 0x88, 0x18, - 0x25, 0x97, 0x4f, 0x84, 0x2b, 0x1c, 0xdb, 0x81, 0xc0, 0xb4, 0xfe, 0xf9, - 0xb6, 0x98, 0x62, 0xe1, 0x29, 0x6b, 0xc6, 0xe4, 0x21, 0xae, 0xca, 0xe5, - 0xa0, 0xe8, 0xa3, 0x71, 0x71, 0xd7, 0x7e, 0xc2, 0x8a, 0xbb, 0xd6, 0x13, - 0x26, 0x47, 0xcc, 0xa7, 0x77, 0xb9, 0x53, 0xd6, 0x3c, 0x66, 0xc3, 0x6f, - 0x9d, 0x6b, 0xa4, 0x25, 0x72, 0x57, 0x0e, 0x97, 0x4d, 0xac, 0xed, 0x74, - 0x29, 0x65, 0xbb, 0xf3, 0x65, 0x07, 0xec, 0xd1, 0x13, 0xe6, 0xa2, 0x49, - 0xd1, 0xbf, 0x1e, 0xac, 0xf3, 0x83, 0xe1, 0xb7, 0xc1, 0x91, 0x0a, 0xf8, - 0x95, 0xcb, 0xd9, 0xa8, 0xdf, 0xfd, 0x9c, 0x2f, 0x95, 0x5b, 0x04, 0x1a, - 0xb7, 0xd5, 0x4a, 0x6a, 0xc5, 0xdd, 0x3f, 0x4b, 0x6a, 0x8d, 0xe5, 0x7d, - 0x8c, 0xd4, 0xc2, 0x3d, 0x6a, 0x90, 0x1a, 0x26, 0xda, 0xa0, 0x34, 0x5b, - 0xd8, 0x5f, 0x4c, 0x6a, 0x4a, 0xa2, 0x55, 0x4a, 0x53, 0xbe, 0x55, 0xa1, - 0xb0, 0x80, 0x6c, 0x6a, 0xf1, 0x8a, 0xed, 0x16, 0xf9, 0xef, 0x10, 0x17, - 0xa0, 0xc9, 0x7b, 0x92, 0x4c, 0x1c, 0x04, 0x40, 0x56, 0xad, 0xca, 0x88, - 0xc7, 0xdc, 0x68, 0x0b, 0xc9, 0xf7, 0xd7, 0x8c, 0x04, 0xcb, 0xba, 0x7c, - 0x5c, 0xe2, 0xa5, 0xc1, 0xf4, 0x2c, 0x90, 0x13, 0x62, 0x8f, 0x76, 0xb3, - 0xd1, 0x22, 0x7f, 0xb0, 0x75, 0x4d, 0x62, 0x59, 0x91, 0xb4, 0x20, 0x11, - 0x2e, 0xf4, 0x3a, 0x35, 0x35, 0xd0, 0xd0, 0xea, 0x20, 0x9b, 0xd5, 0xc6, - 0x8b, 0xf8, 0xce, 0x26, 0x9b, 0x9a, 0x8b, 0x40, 0x0d, 0xc3, 0x17, 0x84, - 0x2e, 0xf6, 0xc0, 0x23, 0x52, 0xc5, 0xe1, 0x8a, 0xcc, 0xbd, 0x1b, 0x81, - 0x71, 0x10, 0xd4, 0x48, 0xd8, 0x16, 0x04, 0x12, 0xc4, 0xb8, 0xca, 0x9c, - 0x7f, 0x07, 0xb9, 0x6d, 0x4d, 0xe0, 0x29, 0xaf, 0x87, 0x64, 0x93, 0x09, - 0x3f, 0x6d, 0xc6, 0x1f, 0x28, 0x7f, 0xb5, 0x95, 0x51, 0x97, 0x7f, 0x63, - 0x91, 0x2b, 0x49, 0x56, 0x1a, 0xaf, 0x99, 0x84, 0xde, 0x4e, 0x17, 0xa8, - 0x24, 0xd6, 0x15, 0x31, 0xaf, 0x78, 0x67, 0x46, 0xc3, 0xd1, 0xc1, 0x13, - 0xec, 0xe8, 0xc2, 0x75, 0x34, 0x90, 0x71, 0x29, 0x56, 0x19, 0x8e, 0x8d, - 0x85, 0x89, 0x30, 0x4f, 0x7e, 0x43, 0xef, 0x62, 0x42, 0x0b, 0x86, 0xfc, - 0x43, 0x26, 0x4c, 0x12, 0x2a, 0xd7, 0x99, 0xd2, 0xbc, 0x77, 0xa3, 0x73, - 0xa1, 0x8f, 0x9f, 0xc7, 0xd7, 0x09, 0x67, 0x29, 0x8a, 0x9b, 0x48, 0x85, - 0xad, 0x0f, 0xa4, 0x43, 0x35, 0x12, 0x8a, 0x58, 0x38, 0xf3, 0xce, 0xc0, - 0x20, 0x7f, 0x08, 0x49, 0x60, 0x3e, 0x7b, 0x48, 0x17, 0xbf, 0x19, 0x72, - 0x3c, 0x51, 0x8b, 0x73, 0x35, 0xb2, 0xdb, 0x30, 0x1c, 0xd4, 0x6a, 0xd4, - 0xf9, 0x33, 0xfb, 0x8c, 0x3b, 0x36, 0x40, 0x37, 0xe5, 0xa6, 0x15, 0x94, - 0x1f, 0xf1, 0xca, 0x66, 0xd5, 0xd3, 0x6c, 0x81, 0x24, 0x2e, 0x0a, 0x00, - 0x20, 0x02, 0x4c, 0x12, 0xc4, 0x26, 0x49, 0x7e, 0xab, 0x93, 0x15, 0xc9, - 0x73, 0x12, 0x23, 0x7a, 0xaa, 0xc3, 0xda, 0xd7, 0x33, 0x22, 0xfa, 0xb3, - 0x0d, 0x4a, 0x93, 0xb0, 0x42, 0x56, 0x19, 0x4f, 0x19, 0xbd, 0xa3, 0xee, - 0x44, 0x60, 0xf5, 0x48, 0xcd, 0xc3, 0x13, 0xc4, 0x80, 0xf0, 0x80, 0x62, - 0x56, 0xd3, 0x52, 0x00, 0x3a, 0xb8, 0x69, 0xfd, 0x96, 0xde, 0xe8, 0x64, - 0x7e, 0xcd, 0x49, 0x8a, 0x2f, 0x5b, 0x63, 0xa0, 0x92, 0xa9, 0xa5, 0xed, - 0x5a, 0x90, 0xe4, 0x38, 0x5f, 0x2d, 0x98, 0xf1, 0xcb, 0x5b, 0xca, 0x8f, - 0x00, 0x4c, 0x20, 0xf1, 0x90, 0x61, 0x6e, 0xf7, 0xa0, 0x2d, 0x08, 0xc0, - 0xf5, 0xa8, 0xc1, 0xa2, 0x7c, 0x83, 0x2d, 0x68, 0xc1, 0x84, 0x3b, 0xc9, - 0x67, 0x44, 0x26, 0xa3, 0x65, 0x3a, 0x9d, 0x48, 0x4c, 0x98, 0x8b, 0xbe, - 0x6b, 0x38, 0x61, 0xb8, 0x9d, 0x22, 0xd4, 0xff, 0xf9, 0x22, 0xe3, 0x98, - 0xa7, 0x4d, 0x1e, 0xd0, 0x9c, 0xa6, 0xbd, 0xa5, 0xf9, 0xe3, 0xcc, 0x18, - 0xf5, 0x79, 0x15, 0xec, 0x1a, 0x26, 0xf3, 0xf8, 0x2e, 0x4e, 0xa7, 0xb8, - 0xc3, 0xa8, 0xa1, 0x7c, 0x39, 0x47, 0xe7, 0xd5, 0x95, 0xba, 0x4b, 0xf3, - 0x6c, 0x3e, 0x6b, 0xda, 0x37, 0x36, 0x2f, 0x4e, 0x86, 0x87, 0x51, 0x74, - 0x36, 0x8c, 0xce, 0xde, 0x9e, 0xfe, 0xc0, 0xae, 0x43, 0xd6, 0x31, 0x05, - 0x40, 0x83, 0xfb, 0x0f, 0xde, 0x8c, 0xee, 0xe2, 0x3c, 0x85, 0xbe, 0xd6, - 0xf3, 0x1e, 0xb5, 0x16, 0x55, 0x5c, 0xce, 0x66, 0xff, 0xde, 0xb6, 0xd8, - 0x87, 0x3d, 0xf2, 0xad, 0x85, 0xf8, 0xbf, 0x24, 0x2e, 0x52, 0x5a, 0x70, - 0x98, 0xb9, 0xc7, 0x96, 0x9c, 0xb7, 0x6c, 0xe6, 0x8a, 0xb1, 0x35, 0x2c, - 0x3c, 0xd5, 0x12, 0xa0, 0xc6, 0x17, 0x25, 0xf5, 0x4e, 0x13, 0xad, 0x45, - 0x6c, 0xd0, 0x44, 0xaf, 0x45, 0xaf, 0x5d, 0xe3, 0x6b, 0x46, 0x04, 0xb2, - 0x8b, 0x8f, 0x93, 0xb5, 0x5d, 0xc4, 0x2c, 0xbc, 0x3b, 0x6f, 0x08, 0x44, - 0xa2, 0x79, 0x99, 0x67, 0x8b, 0x55, 0xf4, 0x55, 0xcc, 0x3c, 0x8f, 0xfb, - 0x3a, 0x8a, 0x93, 0x59, 0x23, 0xaa, 0xa0, 0xc8, 0xc6, 0xb7, 0x49, 0x29, - 0x27, 0x48, 0x7e, 0x77, 0xe4, 0x0c, 0x5d, 0x4f, 0x78, 0x66, 0xc4, 0x8b, - 0x39, 0x61, 0xd3, 0x82, 0x51, 0x0f, 0x68, 0x8e, 0x86, 0xd2, 0x34, 0x3b, - 0x1a, 0xae, 0x43, 0xa0, 0x0d, 0x2a, 0x93, 0x40, 0x13, 0x32, 0xb5, 0x7a, - 0xa0, 0x61, 0xff, 0x98, 0x6f, 0x1a, 0xf6, 0xd0, 0xbf, 0x0c, 0xbc, 0xda, - 0x3f, 0xee, 0x9b, 0x6a, 0xf9, 0x53, 0xfb, 0x32, 0x34, 0x63, 0xdf, 0xab, - 0x57, 0x7b, 0xd0, 0x96, 0x86, 0xcd, 0x31, 0x7b, 0xb9, 0x6e, 0xb9, 0xb2, - 0x24, 0x11, 0x50, 0x43, 0xeb, 0x68, 0x31, 0xe1, 0xd1, 0x8f, 0x24, 0x8d, - 0x40, 0x02, 0x92, 0x2b, 0x8d, 0x59, 0x3a, 0x19, 0x6e, 0xde, 0xf3, 0xe3, - 0x37, 0x6b, 0x42, 0xe6, 0x4c, 0x65, 0x4d, 0x4c, 0x8d, 0x22, 0xee, 0xe0, - 0x14, 0x7a, 0xc9, 0x4d, 0x75, 0x83, 0x0d, 0x33, 0x7a, 0x6b, 0xcd, 0xfd, - 0x6d, 0xc9, 0xc0, 0x41, 0x13, 0x2c, 0xba, 0xba, 0x1f, 0x5d, 0xfa, 0x7b, - 0x70, 0xfc, 0x6a, 0xae, 0x02, 0x01, 0x20, 0x29, 0x9a, 0xee, 0x90, 0x4e, - 0x30, 0x93, 0x8e, 0xc5, 0x5e, 0x05, 0xd1, 0x69, 0xc4, 0x0f, 0x38, 0x09, - 0x29, 0xba, 0x4d, 0x56, 0x96, 0x59, 0xe7, 0x3e, 0x1b, 0x07, 0x10, 0x5c, - 0x6e, 0xed, 0x74, 0x51, 0x38, 0x09, 0x9c, 0x7e, 0xce, 0x59, 0x87, 0xff, - 0x1d, 0x76, 0x5f, 0xf7, 0x54, 0x14, 0xba, 0x7e, 0x9f, 0x1b, 0x04, 0xc7, - 0x29, 0x02, 0xea, 0x9d, 0x35, 0xd2, 0x68, 0x1c, 0x60, 0xd4, 0x74, 0xd5, - 0x6a, 0x02, 0xf0, 0xb0, 0x69, 0xcc, 0xa6, 0x34, 0xa1, 0xbe, 0x28, 0x2d, - 0x08, 0x1c, 0xf1, 0xf1, 0xd3, 0x74, 0x94, 0xb3, 0x43, 0x0b, 0x92, 0x52, - 0xc0, 0xac, 0x1b, 0xa2, 0x8a, 0x27, 0x20, 0x36, 0x82, 0xa4, 0xe3, 0x5b, - 0x9c, 0x22, 0xd5, 0x2b, 0xc2, 0x2d, 0x37, 0xe1, 0x4f, 0x20, 0xa3, 0xb4, - 0xaf, 0xba, 0x9e, 0x11, 0x97, 0x31, 0xe3, 0xcc, 0x20, 0x9b, 0x22, 0xe5, - 0xc8, 0x1c, 0x48, 0x5e, 0xca, 0xff, 0x3c, 0x17, 0x72, 0x6c, 0x88, 0xc7, - 0xfa, 0xfe, 0xe8, 0xe4, 0x02, 0x2c, 0x73, 0xb4, 0x5a, 0x93, 0x92, 0xb1, - 0x9d, 0x94, 0xe3, 0xed, 0xc5, 0x6d, 0xba, 0x3d, 0x2f, 0x8a, 0xc9, 0x68, - 0xcb, 0x65, 0x2d, 0x22, 0xc6, 0x9e, 0x43, 0x4b, 0xa2, 0xf3, 0x6f, 0x0e, - 0x87, 0x9f, 0xec, 0xee, 0x72, 0x0a, 0xfd, 0x64, 0xc9, 0x0a, 0xd2, 0x26, - 0x2d, 0x40, 0x23, 0x03, 0xae, 0xa0, 0x75, 0x9f, 0x0d, 0x8a, 0x6c, 0x0b, - 0x0a, 0x80, 0x63, 0xb8, 0x58, 0x23, 0x44, 0xa8, 0xc0, 0x3f, 0xa9, 0xf9, - 0x61, 0x6c, 0x56, 0xfc, 0x2d, 0xe3, 0x44, 0x84, 0x36, 0x10, 0xc5, 0x10, - 0xbd, 0xe4, 0x7f, 0xd7, 0x70, 0xba, 0xe0, 0x8c, 0x03, 0x6a, 0xa6, 0xb2, - 0x27, 0xfc, 0xb2, 0x4a, 0xf9, 0x1c, 0x74, 0x53, 0x39, 0xf1, 0x4d, 0x9d, - 0x87, 0x9d, 0xba, 0x34, 0xcf, 0x5e, 0x74, 0x74, 0x7c, 0x01, 0x9a, 0x3c, - 0x7e, 0xfb, 0x15, 0x84, 0x43, 0xce, 0xa1, 0xbb, 0x9e, 0xa7, 0x3f, 0x33, - 0xb7, 0xa3, 0x26, 0x8b, 0x81, 0x66, 0x1f, 0x86, 0xc7, 0xb3, 0xd6, 0x1c, - 0xaf, 0x17, 0xaf, 0x22, 0x0e, 0xd9, 0x6f, 0xbb, 0x4c, 0xb1, 0x30, 0xc6, - 0xc3, 0x83, 0x70, 0x76, 0xbf, 0x12, 0x43, 0xa4, 0xa7, 0x68, 0x44, 0x74, - 0x16, 0x5b, 0x0c, 0x21, 0x1c, 0x64, 0x14, 0x64, 0xf3, 0x31, 0x5d, 0xa8, - 0xe3, 0x26, 0xf2, 0x98, 0x3a, 0x11, 0x0d, 0xab, 0x12, 0x89, 0x24, 0x36, - 0xdf, 0x86, 0xcf, 0xd7, 0x3d, 0xb0, 0x59, 0x6c, 0x45, 0x8e, 0x7f, 0xa6, - 0xf3, 0x20, 0x34, 0x8a, 0x79, 0x99, 0xaa, 0xdf, 0x86, 0x61, 0x27, 0x07, - 0xbc, 0xa1, 0x41, 0xf2, 0xc4, 0x62, 0x77, 0x3c, 0x2c, 0xc7, 0x0f, 0x2b, - 0xde, 0x13, 0xd7, 0x53, 0x65, 0xe9, 0x69, 0x4f, 0x55, 0xe6, 0xd4, 0x8b, - 0xad, 0x91, 0x0e, 0x56, 0xc2, 0x96, 0xca, 0xb6, 0xee, 0xa0, 0xcd, 0xc6, - 0xa6, 0x0a, 0xe3, 0x71, 0xc4, 0xa2, 0x11, 0xa7, 0x2d, 0xd2, 0x85, 0x79, - 0xe9, 0x0f, 0x49, 0xa4, 0x7d, 0x7f, 0x78, 0xf0, 0xfe, 0xcb, 0x77, 0x6f, - 0x8f, 0x4e, 0x8f, 0xbb, 0x75, 0x8a, 0xbc, 0xd2, 0x40, 0x51, 0x12, 0x3c, - 0xc5, 0xe8, 0x55, 0x8b, 0x9d, 0xc4, 0xb5, 0x8e, 0x44, 0x5f, 0xb9, 0xe0, - 0x35, 0xd0, 0xda, 0x56, 0xbc, 0xae, 0xfe, 0x2c, 0xe7, 0x13, 0x64, 0x16, - 0x06, 0x93, 0xb7, 0x5c, 0x12, 0x75, 0x9d, 0xd9, 0xf8, 0x5a, 0xd4, 0x5d, - 0x84, 0x89, 0xd3, 0x05, 0xcd, 0x32, 0xb6, 0x81, 0x7c, 0x48, 0x7e, 0x92, - 0x87, 0x71, 0xaa, 0x88, 0xef, 0x1c, 0x14, 0x82, 0x55, 0x8f, 0x69, 0x40, - 0x2d, 0xdb, 0x5d, 0x54, 0xe2, 0x15, 0xb8, 0x15, 0xa2, 0xe4, 0xbe, 0x0e, - 0x72, 0x9c, 0x97, 0xdd, 0x5e, 0x94, 0xa4, 0x70, 0xc5, 0xa5, 0x41, 0x44, - 0xcd, 0xa4, 0x35, 0xbd, 0x86, 0x03, 0x26, 0x63, 0xa1, 0xeb, 0x41, 0xf2, - 0x90, 0x20, 0xb6, 0x43, 0xdf, 0x3a, 0x84, 0x71, 0xb7, 0x8c, 0xbe, 0xcb, - 0x72, 0xa4, 0xed, 0x1f, 0x59, 0x84, 0xa5, 0x3d, 0x14, 0xcf, 0x57, 0x4d, - 0xcf, 0x2d, 0xab, 0x44, 0xac, 0x15, 0x5c, 0x0b, 0x8a, 0xe2, 0xf9, 0xc1, - 0xe5, 0xd7, 0x6d, 0x47, 0xb8, 0x4a, 0x86, 0x8f, 0xdd, 0x33, 0xaa, 0x92, - 0x97, 0xeb, 0xe3, 0x37, 0xe5, 0xaa, 0x59, 0x7f, 0xd7, 0x54, 0x8f, 0x77, - 0xf3, 0xba, 0x69, 0xc9, 0xaf, 0x72, 0xd7, 0x8d, 0xdd, 0x36, 0xa3, 0xd5, - 0x7a, 0x92, 0x0c, 0x6f, 0x9a, 0xf5, 0x57, 0x4d, 0xf3, 0xae, 0xf1, 0x32, - 0x0c, 0x77, 0xc9, 0xa7, 0xd5, 0x2e, 0x1b, 0xbd, 0x6b, 0xfe, 0x8f, 0xb8, - 0x6a, 0x62, 0x9c, 0xa0, 0x1a, 0x0f, 0xf5, 0xe1, 0xb8, 0xff, 0x3a, 0x37, - 0x0d, 0x42, 0x7b, 0x9b, 0x0c, 0x46, 0x58, 0x6c, 0x8d, 0xa9, 0x56, 0xc2, - 0x37, 0x5b, 0x19, 0x62, 0xcf, 0xc4, 0xaf, 0xfa, 0x66, 0xb9, 0xae, 0xf0, - 0xda, 0x4d, 0x0c, 0xdb, 0x1b, 0x33, 0x8c, 0x3c, 0x1b, 0x4b, 0x06, 0x96, - 0x1a, 0x7b, 0x24, 0x47, 0xe9, 0x7d, 0x9e, 0xdc, 0xc4, 0x05, 0x31, 0x90, - 0x65, 0x99, 0xb2, 0x25, 0xbc, 0xae, 0x03, 0x2c, 0x39, 0x6c, 0xd0, 0xa9, - 0xfe, 0x91, 0x25, 0xfb, 0x45, 0x9a, 0xb6, 0xee, 0xd7, 0x4f, 0x4c, 0x0d, - 0xac, 0xfd, 0xd8, 0xa2, 0xb0, 0x72, 0x5f, 0x57, 0x5b, 0x87, 0xa7, 0xfd, - 0x10, 0xdf, 0x6d, 0xc6, 0x19, 0x9a, 0x30, 0xc7, 0x27, 0x57, 0x34, 0xdd, - 0x34, 0xc8, 0xfd, 0x33, 0xd0, 0x08, 0xbd, 0xe2, 0xd2, 0xab, 0x36, 0xe3, - 0x94, 0x7d, 0x0b, 0x76, 0xa2, 0x17, 0x50, 0x21, 0x00, 0x70, 0xd5, 0xed, - 0x2c, 0x7e, 0x43, 0x0a, 0xba, 0x62, 0x63, 0x24, 0x51, 0xf1, 0x1a, 0x7b, - 0xce, 0x6b, 0xc0, 0xcf, 0x14, 0xec, 0xbf, 0xe5, 0xc9, 0x6d, 0x32, 0x00, - 0x92, 0x00, 0x6c, 0xc5, 0x50, 0x89, 0xb7, 0x58, 0x6e, 0x57, 0xa3, 0x16, - 0x72, 0x4a, 0x14, 0x0d, 0xa6, 0x29, 0xa3, 0x28, 0x1c, 0x13, 0x22, 0xb9, - 0xe0, 0x9b, 0x84, 0xbb, 0x42, 0xcd, 0xbb, 0x80, 0x49, 0x25, 0xce, 0x4a, - 0x67, 0x34, 0xf8, 0x72, 0x92, 0xc4, 0xd3, 0xa8, 0x2d, 0x80, 0xe6, 0x4a, - 0xe0, 0x55, 0xcd, 0x5e, 0x0d, 0xb1, 0x66, 0x6e, 0x46, 0xee, 0x48, 0x43, - 0x20, 0x34, 0xde, 0x35, 0xc4, 0x96, 0xb8, 0x42, 0xde, 0x68, 0x83, 0x8a, - 0x27, 0xc9, 0x34, 0x15, 0xa3, 0x9f, 0xe5, 0xf7, 0x41, 0x67, 0xd1, 0x2c, - 0xc0, 0x02, 0x90, 0x27, 0x12, 0x13, 0xeb, 0x1e, 0x60, 0x30, 0x0f, 0x8d, - 0x5a, 0x2c, 0xea, 0xcd, 0x6d, 0x2a, 0x3c, 0x09, 0xf0, 0x18, 0x35, 0x43, - 0xcd, 0xe2, 0x90, 0x78, 0x58, 0x2b, 0x07, 0x95, 0xbb, 0xa5, 0x97, 0x1a, - 0x8c, 0x58, 0xd8, 0xa0, 0x45, 0xde, 0xd0, 0xb3, 0xd9, 0x65, 0x2a, 0x64, - 0x29, 0xa0, 0xc9, 0x58, 0xfe, 0x52, 0x54, 0xfc, 0xb8, 0x0c, 0xd3, 0x15, - 0x25, 0xa9, 0x67, 0x6f, 0xaf, 0xdd, 0xe8, 0xab, 0x99, 0xc5, 0x1a, 0x7b, - 0xc1, 0x4b, 0xd1, 0x2f, 0xe2, 0x2b, 0x87, 0x31, 0x42, 0x64, 0xcc, 0x12, - 0x63, 0x36, 0xa6, 0xd5, 0x93, 0xc0, 0x25, 0x7c, 0xc6, 0xe6, 0x8e, 0x86, - 0xab, 0x6b, 0x39, 0xe6, 0xd3, 0xc8, 0x06, 0x00, 0x6f, 0xc9, 0x8c, 0xd8, - 0xc9, 0xec, 0xfc, 0xf8, 0xc5, 0x34, 0x65, 0xc8, 0xb8, 0x3c, 0x5b, 0x5e, - 0xdf, 0xd0, 0x7d, 0x08, 0xd6, 0x82, 0xdb, 0xb5, 0xc5, 0x89, 0x51, 0x4b, - 0x81, 0x86, 0x3c, 0x7b, 0x97, 0x4d, 0xd9, 0xac, 0xb9, 0xe9, 0x9a, 0x97, - 0xd6, 0x9f, 0xee, 0xec, 0x62, 0xbc, 0x4f, 0x77, 0x3e, 0xad, 0x44, 0xb1, - 0xb3, 0x39, 0x3d, 0x1e, 0x23, 0xc5, 0x25, 0xfa, 0x91, 0x6f, 0x8f, 0x9f, - 0x5a, 0xfd, 0x2e, 0xb0, 0xcb, 0xc6, 0xf3, 0xd0, 0x12, 0x1b, 0x17, 0xb7, - 0xe2, 0x2a, 0xe8, 0xd8, 0xfb, 0xfc, 0x7a, 0x47, 0xad, 0x19, 0xce, 0x1f, - 0xdc, 0x86, 0xe2, 0xe3, 0x14, 0x5e, 0xce, 0x5a, 0x34, 0x36, 0x05, 0x69, - 0xbd, 0x17, 0x40, 0xff, 0x41, 0x0c, 0x02, 0x24, 0xeb, 0xd5, 0x5a, 0xcb, - 0xcc, 0xc1, 0xe1, 0xa1, 0xf7, 0xc6, 0x55, 0xe3, 0xbd, 0x9e, 0x70, 0xbc, - 0xd7, 0xc7, 0x9d, 0x7e, 0x40, 0xc6, 0xf4, 0x34, 0xb6, 0x1a, 0x06, 0xf3, - 0x4a, 0xda, 0xad, 0x5a, 0x54, 0x5a, 0x08, 0x0c, 0x46, 0xca, 0x65, 0x91, - 0xd4, 0x57, 0x74, 0x7d, 0x46, 0x49, 0x00, 0x28, 0xa6, 0xd9, 0x25, 0x7c, - 0x44, 0x82, 0xa4, 0x06, 0xb6, 0x79, 0x6e, 0xfb, 0x5c, 0x34, 0xc8, 0x7f, - 0x2a, 0xed, 0xb5, 0x44, 0x0c, 0x59, 0xfc, 0x94, 0x38, 0xb4, 0xe1, 0xf6, - 0x79, 0x40, 0x4a, 0xf4, 0x3c, 0x88, 0x14, 0xd7, 0x99, 0x95, 0xb4, 0x46, - 0x71, 0x3e, 0x71, 0x3e, 0x99, 0xa8, 0x09, 0xc3, 0x61, 0xd2, 0x0d, 0xe7, - 0xdf, 0x30, 0x54, 0x4d, 0x88, 0x52, 0xd2, 0xcc, 0x71, 0xb1, 0x80, 0x6d, - 0xef, 0x5e, 0x6e, 0xcd, 0xc2, 0x88, 0x66, 0xa9, 0x84, 0x77, 0x06, 0x19, - 0x1d, 0xf5, 0x05, 0xd3, 0x23, 0xf6, 0xa3, 0xfc, 0x6c, 0xa7, 0x41, 0xce, - 0x17, 0xcb, 0x33, 0xd5, 0xf9, 0xf4, 0x05, 0xc9, 0x40, 0x96, 0xf0, 0x3c, - 0x0f, 0xe2, 0x32, 0xbe, 0x31, 0xcb, 0x8d, 0xf8, 0x88, 0x9b, 0xc9, 0x53, - 0x9b, 0xc3, 0x2d, 0xf3, 0x14, 0xcb, 0xd5, 0xab, 0xed, 0xc5, 0xf9, 0xb5, - 0x70, 0x29, 0x0f, 0x39, 0xd2, 0x88, 0xb2, 0xeb, 0x37, 0xcc, 0x13, 0xd7, - 0xa2, 0x2f, 0x70, 0x00, 0xc5, 0x5d, 0x4b, 0xe4, 0x1d, 0x34, 0xa3, 0xf1, - 0xfd, 0xa4, 0x3d, 0x10, 0x45, 0x90, 0x2f, 0x33, 0x6c, 0xb3, 0x26, 0x4c, - 0x1e, 0x7e, 0x77, 0x14, 0xa4, 0x23, 0xf2, 0x19, 0xc3, 0x9c, 0x54, 0xe6, - 0x17, 0xd0, 0xea, 0x75, 0xb1, 0x72, 0x41, 0xa4, 0x0f, 0xc0, 0x60, 0x5f, - 0x03, 0xa1, 0x3b, 0x59, 0xb8, 0xf4, 0x22, 0x60, 0xbf, 0x08, 0x5b, 0x63, - 0x50, 0x57, 0xc0, 0xb7, 0xce, 0x9a, 0x22, 0xb1, 0x4f, 0x93, 0x45, 0x80, - 0x82, 0x8f, 0x58, 0xe1, 0xfc, 0xaf, 0x8b, 0xd7, 0x87, 0xbb, 0x9f, 0x3e, - 0xf9, 0x8c, 0x04, 0x74, 0x76, 0x88, 0xa6, 0xb5, 0x60, 0x5b, 0x09, 0x5c, - 0x5d, 0x1f, 0xb1, 0xa4, 0x46, 0x25, 0x13, 0x30, 0xd5, 0x4f, 0x4f, 0x9c, - 0x2f, 0xbb, 0x4f, 0x20, 0xf3, 0xa8, 0xcf, 0xb0, 0x11, 0x11, 0x95, 0xd1, - 0x22, 0x9a, 0xce, 0x85, 0x15, 0xe3, 0x58, 0x0d, 0xac, 0x96, 0xdc, 0xa9, - 0x83, 0x2a, 0x6a, 0x2e, 0x67, 0xc4, 0xf5, 0xa2, 0x8b, 0xe3, 0xcb, 0x8b, - 0x5e, 0x34, 0xbc, 0x3c, 0xbb, 0x58, 0x13, 0x66, 0x46, 0x37, 0x27, 0x73, - 0x25, 0x5e, 0x33, 0x26, 0x1b, 0x86, 0x15, 0x90, 0xe3, 0x56, 0xc9, 0xb6, - 0x80, 0x5e, 0x23, 0x61, 0x86, 0x60, 0xaa, 0xb3, 0xfe, 0xba, 0xe0, 0xc2, - 0xca, 0x6a, 0x81, 0x6c, 0x48, 0x92, 0x78, 0x74, 0x62, 0xb2, 0xed, 0x1f, - 0x41, 0x21, 0x4c, 0x8b, 0x3c, 0x5d, 0xe7, 0xd0, 0xc1, 0x68, 0x15, 0x4c, - 0xd0, 0xcb, 0x80, 0x6b, 0xc0, 0xaf, 0x5c, 0xf8, 0x06, 0x42, 0xfb, 0x1d, - 0xc6, 0x35, 0x0e, 0x4a, 0xc7, 0xfc, 0xdc, 0x1d, 0x58, 0x8a, 0x6e, 0x93, - 0x20, 0x6e, 0xeb, 0x03, 0xf4, 0x4b, 0x32, 0xc3, 0x96, 0x4b, 0x54, 0xe3, - 0xff, 0x18, 0x3c, 0x50, 0x70, 0x9b, 0x21, 0xe3, 0x19, 0xe3, 0x29, 0x22, - 0x17, 0x63, 0xdb, 0x16, 0x68, 0xe1, 0xf2, 0x07, 0x78, 0x97, 0xbb, 0xce, - 0x5d, 0x9e, 0x29, 0x75, 0xc8, 0xbe, 0x90, 0xd4, 0x33, 0x2d, 0x91, 0x99, - 0xd1, 0xb5, 0x51, 0x75, 0x1d, 0xa9, 0x55, 0xd8, 0xff, 0xb3, 0xc1, 0xee, - 0x56, 0x8d, 0xc9, 0x70, 0xb4, 0x41, 0x2b, 0x67, 0x61, 0x3f, 0x48, 0x25, - 0xc6, 0xc1, 0x10, 0xb7, 0x71, 0x0f, 0xd1, 0x85, 0x60, 0xa0, 0x1d, 0x00, - 0xe1, 0xe2, 0xa7, 0xd6, 0x20, 0xa6, 0xa0, 0x20, 0x01, 0x9b, 0x74, 0x3d, - 0x71, 0xeb, 0x9e, 0x8b, 0xff, 0x7f, 0x59, 0x67, 0xa7, 0x35, 0xff, 0x7d, - 0x3d, 0xd0, 0xc6, 0xc3, 0xa5, 0x38, 0x97, 0x18, 0x3b, 0xc1, 0x5d, 0x94, - 0x85, 0x25, 0xc5, 0x54, 0x66, 0xbe, 0xfb, 0xf1, 0x17, 0xdf, 0xa3, 0x61, - 0x52, 0x1f, 0x8a, 0x93, 0xc2, 0xe1, 0x0b, 0x22, 0xa5, 0x48, 0x39, 0x98, - 0x4b, 0x58, 0x05, 0xc2, 0xf9, 0x0c, 0x48, 0xc7, 0x16, 0x96, 0xf8, 0x32, - 0x8b, 0x31, 0xb0, 0x71, 0x37, 0x6e, 0x31, 0xc8, 0xb2, 0x86, 0x0d, 0x0f, - 0x15, 0x06, 0x7a, 0xa1, 0xdd, 0x30, 0xda, 0x98, 0x01, 0x2c, 0x08, 0x3e, - 0xb5, 0x8f, 0x07, 0x68, 0x40, 0x9c, 0xe5, 0xaa, 0x9a, 0x37, 0x4e, 0xda, - 0x79, 0xb8, 0xcb, 0xc2, 0x00, 0x21, 0x0b, 0x7a, 0xbe, 0x51, 0x8a, 0x89, - 0xb8, 0x1a, 0x40, 0x22, 0x61, 0xf2, 0x4d, 0x20, 0x3c, 0x51, 0x5e, 0x11, - 0xde, 0xa1, 0xe8, 0x37, 0xd5, 0xb8, 0x09, 0x5b, 0xe8, 0x86, 0xc4, 0xe5, - 0xaf, 0x8b, 0x7e, 0x99, 0x21, 0xba, 0x2e, 0x7a, 0xa9, 0x9d, 0x7d, 0xde, - 0x4a, 0xa2, 0x9c, 0x92, 0x14, 0x48, 0x7b, 0x86, 0x29, 0x09, 0xf4, 0xcc, - 0xa1, 0xda, 0x2e, 0x69, 0x20, 0x43, 0xcf, 0xb1, 0x45, 0xd8, 0x6f, 0x80, - 0x48, 0x01, 0x56, 0x53, 0xad, 0x12, 0x4e, 0x70, 0x32, 0x59, 0xc4, 0x94, - 0x34, 0x43, 0x0a, 0xbf, 0x5c, 0xce, 0x68, 0x2a, 0xf7, 0x49, 0x32, 0xe9, - 0x16, 0xd1, 0x10, 0x68, 0x8b, 0x75, 0x01, 0x99, 0xa3, 0x66, 0xb0, 0xe0, - 0xca, 0x27, 0x11, 0x84, 0xc8, 0x2e, 0x12, 0x53, 0x38, 0xe3, 0xc8, 0x10, - 0xf7, 0x42, 0xcd, 0xcc, 0x52, 0x94, 0xea, 0x8e, 0x88, 0xe1, 0x09, 0x23, - 0x70, 0x1d, 0xbc, 0xbb, 0xfc, 0xba, 0x13, 0x05, 0xa8, 0xaa, 0x01, 0x23, - 0xc6, 0x15, 0x5f, 0x92, 0x10, 0x71, 0xe7, 0x62, 0xeb, 0x72, 0x58, 0x4d, - 0x5a, 0x60, 0x14, 0x6a, 0x16, 0xfb, 0x41, 0x9d, 0x45, 0x3c, 0xab, 0xb3, - 0x08, 0xce, 0xfa, 0x06, 0x9f, 0xe8, 0xa7, 0x8b, 0x0f, 0x87, 0xf8, 0xb1, - 0x3a, 0x60, 0x36, 0x80, 0x93, 0x73, 0x06, 0xb3, 0x05, 0xba, 0x70, 0x88, - 0x59, 0xb2, 0xbc, 0xe6, 0xf0, 0xcf, 0x16, 0x00, 0x35, 0x86, 0xf8, 0xf0, - 0x3a, 0x80, 0x06, 0xf6, 0xd3, 0x2a, 0x33, 0x35, 0x55, 0x02, 0x97, 0xa4, - 0x37, 0xdd, 0x19, 0x9f, 0x0c, 0xb8, 0xd6, 0xcd, 0x36, 0x20, 0x8d, 0x4e, - 0x4e, 0x4d, 0x88, 0x81, 0xd2, 0xf7, 0xe0, 0x61, 0x92, 0xa7, 0x46, 0xe3, - 0x75, 0x03, 0x6e, 0x62, 0x35, 0x59, 0x22, 0x13, 0xc4, 0x4f, 0xe3, 0x86, - 0x63, 0x15, 0xc0, 0xc2, 0xbe, 0x2a, 0x0b, 0xfa, 0x74, 0xb0, 0xb7, 0xd5, - 0xaa, 0x41, 0x19, 0xdf, 0x61, 0x79, 0x9f, 0x13, 0x81, 0x88, 0x67, 0x8c, - 0xa1, 0xdc, 0x4b, 0xb4, 0xa1, 0x44, 0xab, 0xe5, 0x72, 0xe6, 0x3c, 0xa6, - 0x1f, 0x66, 0xd1, 0xc4, 0x47, 0xe2, 0x15, 0xaa, 0x1f, 0x28, 0x62, 0x8f, - 0x1f, 0x11, 0x92, 0x09, 0xda, 0x8f, 0xa3, 0x73, 0x12, 0x09, 0xdc, 0x12, - 0x07, 0x31, 0x5a, 0xf4, 0x0e, 0xd4, 0x13, 0x1e, 0xc6, 0x56, 0x5d, 0x80, - 0xe1, 0xe4, 0x5c, 0xd8, 0xb9, 0x5f, 0x23, 0x5c, 0xc7, 0x82, 0x0c, 0x89, - 0x15, 0xa6, 0x00, 0x7f, 0xcf, 0x69, 0x18, 0x88, 0x4d, 0x16, 0x54, 0x4a, - 0x1c, 0x30, 0xd6, 0x00, 0xed, 0xf6, 0xdb, 0x68, 0x95, 0xab, 0xa4, 0x80, - 0x8a, 0xbb, 0xb8, 0xd9, 0xdb, 0x4e, 0x87, 0x02, 0x85, 0x47, 0x80, 0x19, - 0x12, 0x03, 0x41, 0x5c, 0xb4, 0xa6, 0x49, 0x76, 0x3f, 0x07, 0x20, 0x40, - 0x8b, 0xf0, 0x87, 0xe1, 0x33, 0x53, 0x1b, 0x54, 0xaf, 0xc1, 0xbd, 0x9d, - 0xc1, 0x43, 0x48, 0xe3, 0x45, 0x31, 0x95, 0x95, 0x71, 0x65, 0x7b, 0xa4, - 0xc2, 0x0f, 0x2a, 0xf3, 0xd0, 0x6a, 0xe5, 0x2e, 0xa4, 0x69, 0x38, 0x3c, - 0xdd, 0xbe, 0x3c, 0x1d, 0x86, 0x9b, 0x6f, 0x9b, 0xde, 0x4c, 0x4e, 0x86, - 0x71, 0x17, 0x38, 0x72, 0x98, 0xb2, 0xc0, 0xb2, 0x06, 0xe0, 0x35, 0x9a, - 0x3a, 0xae, 0x87, 0xc2, 0x94, 0x16, 0x75, 0xa1, 0x37, 0x8d, 0x45, 0xdb, - 0x80, 0x7c, 0x8a, 0xc2, 0xe0, 0x61, 0x1c, 0xce, 0x62, 0xda, 0x37, 0x1a, - 0x94, 0x58, 0x36, 0xfe, 0x84, 0x56, 0xdc, 0x96, 0x91, 0xaf, 0xa2, 0x66, - 0x66, 0x68, 0x19, 0x4d, 0x69, 0x84, 0xd3, 0x42, 0x1c, 0xff, 0x88, 0x97, - 0xe0, 0x31, 0xe9, 0x4e, 0xd5, 0xd4, 0x46, 0x5a, 0xb0, 0x9d, 0xad, 0xc7, - 0x42, 0xbf, 0xee, 0x25, 0x40, 0x6e, 0x96, 0xe4, 0xb4, 0xeb, 0x80, 0x60, - 0x91, 0xdc, 0x30, 0x1d, 0xa0, 0x5b, 0x7e, 0xc3, 0xb4, 0xde, 0x6d, 0xa6, - 0x1d, 0x29, 0xb0, 0x51, 0x2c, 0x81, 0xa2, 0xb4, 0xe3, 0xde, 0xbe, 0xa4, - 0x62, 0x8f, 0x7c, 0xc0, 0x89, 0xf0, 0x77, 0x96, 0x8f, 0x76, 0xb5, 0xe4, - 0x4a, 0x3c, 0x2c, 0xae, 0xb7, 0xc5, 0xcf, 0xd6, 0xcf, 0x43, 0xb0, 0x54, - 0xad, 0xc7, 0xe2, 0x42, 0xc9, 0xb4, 0xbe, 0xcb, 0x20, 0xee, 0x69, 0x76, - 0xcd, 0x30, 0xa6, 0x16, 0x30, 0x0e, 0xc7, 0xbe, 0x43, 0x75, 0xa8, 0x2b, - 0xe0, 0x53, 0x09, 0xc2, 0xd1, 0x3d, 0xaf, 0x99, 0x24, 0x44, 0xea, 0x61, - 0x9a, 0xd0, 0x85, 0xb7, 0x94, 0x6d, 0x17, 0x6c, 0xd9, 0x74, 0x93, 0x3b, - 0x9b, 0xe0, 0x78, 0x35, 0x10, 0x33, 0x5a, 0x51, 0xc1, 0x95, 0xa8, 0x11, - 0x93, 0x4f, 0x21, 0x6a, 0x05, 0x3b, 0xa5, 0x8b, 0xc9, 0x13, 0x54, 0x85, - 0x59, 0x3d, 0x0f, 0x37, 0xda, 0x93, 0x52, 0xcb, 0x72, 0xd5, 0xcf, 0x8a, - 0x1e, 0x16, 0xb7, 0x88, 0xbf, 0xe0, 0xac, 0x5c, 0x8a, 0x93, 0xbe, 0x4c, - 0x1a, 0xf8, 0x4e, 0x8f, 0x1e, 0x11, 0x37, 0x87, 0x47, 0x52, 0xea, 0xd7, - 0x53, 0xae, 0xf3, 0xff, 0x33, 0xed, 0x7a, 0xe2, 0x55, 0xea, 0xd5, 0x14, - 0x6e, 0xa3, 0x1a, 0x1c, 0xa7, 0xcd, 0x58, 0xdb, 0xad, 0x35, 0xa7, 0x97, - 0xa6, 0x2a, 0x18, 0x6b, 0x09, 0x38, 0x80, 0x7b, 0x34, 0x1a, 0x96, 0x80, - 0xc4, 0x46, 0x20, 0x8c, 0xd1, 0xf4, 0x5a, 0x1a, 0x1e, 0x8f, 0xdb, 0xe3, - 0x80, 0x11, 0xba, 0x74, 0x78, 0x78, 0x48, 0x1f, 0x1c, 0x0a, 0x99, 0x1e, - 0x2a, 0x47, 0x3d, 0xbc, 0xe1, 0x8c, 0xcd, 0xe9, 0x56, 0x34, 0xbc, 0x59, - 0x72, 0xbe, 0x21, 0xcf, 0x91, 0x57, 0x56, 0x97, 0xb0, 0x1e, 0x42, 0x16, - 0xaf, 0xd8, 0x96, 0x25, 0x10, 0x51, 0x15, 0x01, 0x4b, 0xec, 0x02, 0x48, - 0x25, 0x35, 0xdf, 0xbf, 0xdd, 0x7f, 0xd2, 0x43, 0x6b, 0xaa, 0xf7, 0x72, - 0xee, 0x00, 0x09, 0x9d, 0xdd, 0x78, 0xee, 0x88, 0x5f, 0xf5, 0xc2, 0x58, - 0x0e, 0xcd, 0xdb, 0x83, 0x4b, 0x86, 0x80, 0x2e, 0x35, 0x06, 0xb5, 0x3d, - 0xc0, 0xcd, 0x1d, 0x4b, 0xd0, 0x7f, 0x1c, 0xa0, 0x07, 0x9a, 0x8a, 0x01, - 0x59, 0x96, 0x93, 0x20, 0x45, 0xb6, 0x1d, 0x68, 0x9c, 0x45, 0x8b, 0x60, - 0xac, 0x2b, 0xda, 0x77, 0x3a, 0x8e, 0x24, 0xbe, 0xf1, 0x9f, 0x45, 0xf3, - 0x78, 0x34, 0xf4, 0xa7, 0xca, 0xeb, 0x3f, 0x4a, 0xa4, 0xee, 0xb6, 0xf6, - 0xfa, 0xd3, 0x3f, 0xbf, 0x4d, 0x89, 0x4a, 0x35, 0xfc, 0x98, 0x5c, 0x61, - 0x4d, 0x6f, 0x71, 0x45, 0x3b, 0x73, 0x20, 0x37, 0x12, 0x97, 0xa7, 0x61, - 0xbd, 0x05, 0x6d, 0xf7, 0x04, 0x88, 0x58, 0x42, 0x83, 0x0e, 0x33, 0xfb, - 0x3e, 0x6e, 0x88, 0x37, 0x76, 0x50, 0xbd, 0x48, 0x89, 0x22, 0x3b, 0xe2, - 0x5d, 0x71, 0xcd, 0xe7, 0xc9, 0x62, 0xba, 0x72, 0x66, 0x00, 0x6d, 0x7e, - 0x9d, 0x98, 0x19, 0x1a, 0x93, 0xc2, 0x20, 0x66, 0x1b, 0x63, 0x51, 0x6d, - 0x05, 0x1d, 0xc5, 0x2c, 0x04, 0x5e, 0x35, 0x22, 0xe5, 0x63, 0xed, 0xb9, - 0x86, 0xc2, 0xdc, 0xdc, 0xa1, 0x40, 0xda, 0x72, 0xc0, 0x0d, 0x8a, 0x24, - 0xad, 0x19, 0x50, 0x8f, 0x27, 0x6e, 0x4f, 0x79, 0xe9, 0x21, 0x1c, 0x25, - 0xa4, 0x4d, 0x23, 0x03, 0x47, 0xe1, 0x2c, 0xfa, 0xe9, 0x5c, 0xd0, 0x13, - 0x38, 0xe1, 0x15, 0x46, 0x79, 0xc1, 0xbf, 0xa8, 0xe3, 0x41, 0xc6, 0x45, - 0x64, 0x08, 0x7f, 0xeb, 0x40, 0x2e, 0x0c, 0x02, 0xd5, 0xc7, 0xec, 0x03, - 0xaa, 0xa3, 0x4d, 0x88, 0xf5, 0x88, 0x16, 0x87, 0x8a, 0x68, 0x71, 0xc9, - 0xe1, 0x1c, 0x12, 0x59, 0x10, 0xe7, 0xe5, 0x36, 0xb0, 0x2b, 0x24, 0x43, - 0x79, 0xcc, 0x18, 0xc7, 0x5a, 0x2a, 0xe0, 0xe2, 0xf5, 0xe1, 0xde, 0x93, - 0xcf, 0x3e, 0x6b, 0x8d, 0x85, 0x4d, 0x34, 0x19, 0xcb, 0x43, 0x75, 0x73, - 0x30, 0xa3, 0xe4, 0xb6, 0x8b, 0xcb, 0x91, 0xeb, 0xd0, 0x70, 0x2a, 0xb0, - 0xa8, 0x98, 0x22, 0x23, 0x77, 0xc7, 0x4d, 0xe3, 0x3d, 0x0f, 0xa8, 0x2b, - 0xd6, 0x37, 0x49, 0x11, 0xb3, 0x32, 0x29, 0x5a, 0x5e, 0xa3, 0x0a, 0x81, - 0x26, 0x69, 0xc2, 0xf3, 0xe8, 0x0b, 0xa4, 0xb4, 0x71, 0x07, 0xb5, 0xe6, - 0xfe, 0xca, 0x5a, 0xee, 0x75, 0x52, 0x36, 0xb3, 0x2c, 0x83, 0xe4, 0xfe, - 0x47, 0x1a, 0x6f, 0xa1, 0x41, 0xcb, 0x12, 0x8d, 0x5e, 0x5a, 0x9a, 0x9d, - 0x57, 0xcf, 0x23, 0x2b, 0x28, 0x44, 0x23, 0x62, 0xe2, 0x7b, 0xa9, 0xd6, - 0x29, 0xcd, 0x30, 0xfb, 0xa2, 0x45, 0xc3, 0x2f, 0xcc, 0x8a, 0x0a, 0xd0, - 0xb1, 0xb2, 0x8c, 0xad, 0xca, 0x19, 0xbc, 0x96, 0x0c, 0x0a, 0x81, 0x48, - 0x04, 0xb5, 0xb4, 0x5a, 0x3d, 0x0c, 0xa6, 0x97, 0x69, 0x1b, 0xf2, 0xd1, - 0x4b, 0xd7, 0x28, 0x00, 0x6f, 0x05, 0x97, 0x83, 0x87, 0xd2, 0xb6, 0x12, - 0xa6, 0x75, 0x70, 0x92, 0x5e, 0x50, 0x15, 0xce, 0xa5, 0xad, 0xf3, 0xbb, - 0xc1, 0x3a, 0x35, 0x14, 0xfd, 0xe3, 0x87, 0x78, 0x86, 0x22, 0x5d, 0x26, - 0xf6, 0xc3, 0xab, 0xef, 0x53, 0xe7, 0x34, 0xd2, 0x25, 0x34, 0x92, 0xab, - 0xdb, 0xa6, 0xcb, 0x0f, 0xd5, 0xf7, 0x9e, 0x5f, 0xea, 0x9a, 0x3d, 0x2f, - 0xf4, 0xd1, 0x83, 0x22, 0x65, 0x38, 0x0e, 0x98, 0x50, 0x1c, 0xe6, 0xdc, - 0xd5, 0x64, 0x4d, 0xf8, 0x1e, 0xbf, 0x09, 0xf8, 0xab, 0xfd, 0xd6, 0x80, - 0x92, 0xfe, 0x6b, 0x37, 0xd2, 0x57, 0x5f, 0x54, 0x5a, 0xbb, 0xbf, 0x1f, - 0xcc, 0x56, 0xf6, 0x5d, 0x51, 0xa9, 0x39, 0xe8, 0x73, 0xda, 0x1d, 0xf4, - 0x05, 0xcf, 0xb2, 0x5b, 0x38, 0xe2, 0xf2, 0x48, 0x16, 0x61, 0xe9, 0x1b, - 0x23, 0x34, 0xcd, 0xe2, 0x69, 0x66, 0xa2, 0xb9, 0x44, 0x06, 0x4f, 0x7f, - 0x62, 0xed, 0xed, 0xaa, 0x93, 0x59, 0x0f, 0xfa, 0x75, 0xa6, 0xba, 0xe2, - 0x88, 0xae, 0x15, 0xa3, 0xb2, 0xa6, 0x9a, 0x5a, 0x94, 0xf9, 0x72, 0x5c, - 0x36, 0x3d, 0xb3, 0x56, 0x94, 0x4f, 0x71, 0x29, 0x83, 0x3c, 0x1f, 0xb1, - 0x25, 0x56, 0x58, 0x82, 0xcb, 0xb3, 0xf1, 0x79, 0x0c, 0x75, 0x1c, 0x12, - 0xe0, 0x33, 0x77, 0x7b, 0x22, 0x3d, 0x2b, 0x8a, 0x83, 0x87, 0x1d, 0x58, - 0xbb, 0xf0, 0x9d, 0xfb, 0x64, 0xf4, 0xea, 0x0b, 0x0e, 0x39, 0x7c, 0x00, - 0xbc, 0xab, 0xe0, 0x3c, 0x33, 0x0d, 0x6e, 0xf3, 0x9f, 0x9d, 0x88, 0x23, - 0x4e, 0x5a, 0xd6, 0x9d, 0xb8, 0xf8, 0xba, 0x16, 0x03, 0x44, 0x94, 0xa0, - 0xb5, 0xab, 0x2c, 0x5b, 0xdb, 0x98, 0x2b, 0x09, 0x88, 0xc5, 0x08, 0x92, - 0x7a, 0x24, 0xc7, 0xc6, 0x53, 0xa1, 0x50, 0x1e, 0xef, 0xe2, 0x5c, 0xc1, - 0xa5, 0x70, 0x0a, 0xdb, 0x90, 0x04, 0x46, 0x2b, 0x57, 0x39, 0xc2, 0xb2, - 0x8a, 0x5f, 0xf5, 0xa4, 0xfa, 0x29, 0x2b, 0xab, 0xeb, 0x17, 0x84, 0x9f, - 0x7e, 0xf5, 0x05, 0xd0, 0xca, 0xf8, 0xd7, 0x3f, 0xbb, 0xb7, 0xf9, 0x1f, - 0xa2, 0x62, 0x62, 0x04, 0x6b, 0x27, 0xc2, 0xa2, 0xc8, 0xd5, 0x32, 0x87, - 0x98, 0x91, 0xc8, 0x91, 0x94, 0xc2, 0x60, 0x06, 0x45, 0xac, 0xdc, 0xe4, - 0xcd, 0xc1, 0xdb, 0x77, 0x07, 0xa7, 0x8f, 0xe6, 0xdc, 0x84, 0x96, 0x52, - 0x17, 0x6b, 0x06, 0xc3, 0x65, 0x45, 0x70, 0xe4, 0xf3, 0xa8, 0x01, 0xff, - 0x72, 0x13, 0x3e, 0x5e, 0x85, 0xc6, 0xe3, 0x50, 0xe8, 0xf5, 0x19, 0x82, - 0x78, 0x78, 0x38, 0x21, 0xcb, 0x21, 0x50, 0x65, 0xa8, 0x35, 0x42, 0x1c, - 0x8e, 0xcd, 0x3c, 0x96, 0xa2, 0x5c, 0xce, 0x8c, 0x31, 0x4d, 0x4b, 0x36, - 0xb1, 0x32, 0x56, 0xe4, 0xa9, 0x16, 0xd9, 0xec, 0x7e, 0xd1, 0xc5, 0x1a, - 0x74, 0x5f, 0x76, 0x79, 0x43, 0xf3, 0x78, 0xdc, 0x92, 0x2f, 0x53, 0xb8, - 0x50, 0x8f, 0xa8, 0x2b, 0x54, 0xd3, 0xb5, 0x41, 0xe8, 0x9a, 0xc9, 0xc8, - 0x10, 0xea, 0x31, 0xcf, 0x22, 0x75, 0x14, 0xc3, 0xa8, 0xd9, 0xe2, 0xa1, - 0x02, 0xa4, 0x99, 0xcb, 0xf7, 0x95, 0x8a, 0x58, 0xb8, 0x16, 0xfc, 0xcc, - 0x45, 0x03, 0xc9, 0x99, 0x63, 0x70, 0x24, 0x85, 0x40, 0x4b, 0xb6, 0x45, - 0x87, 0xb8, 0xb5, 0xd1, 0xf1, 0xc8, 0x40, 0x38, 0x72, 0x87, 0x6e, 0xe5, - 0x94, 0xc3, 0x74, 0x61, 0xe9, 0xa5, 0x2f, 0xaf, 0xaf, 0x35, 0x23, 0x19, - 0x73, 0x06, 0x7e, 0x03, 0x4d, 0xba, 0x81, 0x6f, 0xa9, 0xf5, 0x6c, 0x89, - 0x8c, 0xeb, 0xe0, 0x53, 0xfd, 0x6b, 0x12, 0x6b, 0xae, 0xa7, 0xd9, 0x28, - 0xbb, 0xba, 0x7a, 0x84, 0x36, 0x24, 0x7f, 0x0c, 0x4d, 0x08, 0x5b, 0xee, - 0x70, 0xe6, 0x08, 0xbf, 0x37, 0x92, 0x34, 0x3f, 0x54, 0x4b, 0x18, 0x88, - 0x95, 0x53, 0x21, 0x4b, 0x1b, 0x93, 0x0a, 0x7c, 0x9c, 0xab, 0x5a, 0x81, - 0x50, 0x94, 0x04, 0x15, 0x85, 0x47, 0xc3, 0x1d, 0x3d, 0xe8, 0x0c, 0x89, - 0x36, 0x7f, 0xff, 0xc7, 0x8f, 0x3f, 0xb5, 0x80, 0x34, 0xb1, 0xeb, 0xc2, - 0xc2, 0xfa, 0x39, 0xac, 0x59, 0xd3, 0x91, 0xe0, 0x24, 0x60, 0x83, 0x95, - 0x87, 0x67, 0xd4, 0x92, 0x37, 0x41, 0xe8, 0x76, 0xf3, 0xc2, 0x28, 0x7c, - 0x87, 0x56, 0x57, 0x55, 0xc3, 0x36, 0xa6, 0xc9, 0x75, 0x0c, 0xdc, 0x06, - 0x7f, 0x79, 0xba, 0xdc, 0x57, 0x65, 0xd5, 0x4d, 0x00, 0x38, 0x97, 0xdb, - 0x1e, 0x0a, 0x52, 0x30, 0x27, 0x5f, 0x9c, 0x38, 0x97, 0x4d, 0xb0, 0x11, - 0x5f, 0xf1, 0x46, 0x34, 0x56, 0xcd, 0x03, 0x24, 0xf6, 0xea, 0xc1, 0xe6, - 0x21, 0x2c, 0x01, 0xa0, 0x74, 0x05, 0x34, 0xa0, 0x0a, 0x0b, 0xb4, 0x16, - 0x64, 0x2c, 0xcb, 0x6b, 0x38, 0x44, 0x22, 0x72, 0x79, 0x28, 0x46, 0x97, - 0x39, 0xf7, 0xd5, 0xf1, 0x65, 0x64, 0xc0, 0x6f, 0x0d, 0xba, 0x0f, 0xca, - 0xe6, 0x38, 0x08, 0x02, 0x87, 0x12, 0x27, 0x78, 0x15, 0xae, 0x70, 0xdf, - 0x7d, 0x58, 0xbe, 0xa3, 0x4d, 0x09, 0x51, 0xc8, 0x21, 0xd1, 0xea, 0x0c, - 0x8e, 0xc0, 0x2f, 0xdb, 0xa9, 0x41, 0xc3, 0x74, 0xff, 0xa3, 0xeb, 0xd1, - 0x5f, 0xda, 0x22, 0x90, 0x2c, 0xc1, 0xad, 0x91, 0x76, 0xdf, 0x3f, 0xe9, - 0x39, 0x40, 0x08, 0x5d, 0x2f, 0x59, 0x46, 0x37, 0x93, 0x51, 0x0b, 0xc0, - 0xdb, 0xba, 0x71, 0x7c, 0x7d, 0x7c, 0x70, 0x64, 0x93, 0xfd, 0x1f, 0xc8, - 0x9c, 0x77, 0x3e, 0xd0, 0x51, 0x22, 0xa0, 0x76, 0xcb, 0xb9, 0x95, 0x57, - 0xc2, 0x9e, 0x39, 0xc3, 0x4d, 0x4b, 0xc4, 0x18, 0x89, 0x6c, 0x8c, 0x76, - 0x2d, 0x9a, 0x1c, 0x4a, 0x04, 0x99, 0x83, 0x59, 0xa2, 0x2a, 0xdd, 0x7a, - 0x84, 0x9e, 0xa1, 0xc0, 0xab, 0xd2, 0x5a, 0xff, 0x28, 0x28, 0x06, 0x18, - 0x10, 0xf6, 0x0d, 0x52, 0xe2, 0xa6, 0x8b, 0x46, 0x6e, 0x54, 0x7c, 0xcd, - 0x29, 0x97, 0xd3, 0x45, 0xf0, 0x6c, 0x90, 0x3e, 0xf7, 0x52, 0x7e, 0xae, - 0xb9, 0x57, 0x8e, 0x01, 0x75, 0xa5, 0x8f, 0x86, 0x49, 0xa2, 0xd7, 0x41, - 0xf1, 0x26, 0x92, 0x34, 0xf8, 0xca, 0xb8, 0x66, 0xa3, 0x2d, 0x6e, 0x7c, - 0x62, 0xa1, 0xf5, 0x75, 0x08, 0x2a, 0x14, 0xfb, 0x0a, 0xe0, 0x49, 0xd0, - 0x7a, 0x25, 0xdd, 0x4a, 0x93, 0xd7, 0xac, 0x6c, 0xd1, 0xa4, 0x51, 0x53, - 0x86, 0xb8, 0x4d, 0x51, 0x92, 0x14, 0x68, 0x23, 0xe3, 0x97, 0x6e, 0xe2, - 0x00, 0xd0, 0x4f, 0x20, 0x1c, 0xc4, 0xd3, 0xec, 0x8f, 0x8d, 0xf9, 0x35, - 0x9b, 0x95, 0x3b, 0x9c, 0x62, 0xa7, 0xc0, 0x71, 0x4b, 0x6c, 0x1b, 0x84, - 0x6d, 0x4e, 0xf6, 0xe7, 0x97, 0x34, 0xb1, 0x4f, 0xbb, 0x0c, 0xa3, 0xe9, - 0xd6, 0x1c, 0x57, 0x15, 0xad, 0x9d, 0x33, 0x95, 0xc3, 0x09, 0x2a, 0x86, - 0x13, 0x9e, 0xa3, 0xa5, 0x11, 0x22, 0x69, 0x0f, 0xa5, 0xdc, 0x1b, 0xb7, - 0x1e, 0x5f, 0xc3, 0x45, 0xb9, 0xbc, 0xc2, 0x2c, 0x38, 0xcc, 0x46, 0x1c, - 0x22, 0x18, 0xa8, 0xaf, 0x8d, 0x9a, 0xa1, 0x08, 0xb9, 0xad, 0x99, 0xe9, - 0xfd, 0xf1, 0x78, 0x9d, 0x6f, 0x57, 0xa7, 0xe3, 0xab, 0xcf, 0x38, 0x56, - 0xcf, 0xf6, 0x34, 0x29, 0x2b, 0x9e, 0xe4, 0xec, 0xe0, 0x60, 0x1b, 0x9b, - 0x20, 0x7f, 0xdf, 0x37, 0x39, 0xba, 0xd6, 0xd8, 0x91, 0x44, 0x74, 0x2e, - 0xe6, 0xc0, 0x76, 0x32, 0x49, 0x36, 0xd4, 0x69, 0xeb, 0x82, 0xd1, 0x15, - 0x71, 0x9d, 0xde, 0x59, 0x59, 0x32, 0x8c, 0xac, 0x25, 0xe3, 0xcd, 0x06, - 0x61, 0xb2, 0xbe, 0xfa, 0xf6, 0x05, 0x8e, 0x21, 0xe2, 0xec, 0xd8, 0x60, - 0x3b, 0xc7, 0xd9, 0x14, 0xf8, 0x0d, 0x31, 0x5c, 0x09, 0xfb, 0x4c, 0xd8, - 0x75, 0x3f, 0xdc, 0xd7, 0x24, 0xd5, 0xed, 0x77, 0xd6, 0xc4, 0xbb, 0x87, - 0xac, 0xbd, 0x58, 0xe6, 0x56, 0x5d, 0x10, 0x41, 0x2a, 0x3a, 0x6a, 0xa0, - 0xe2, 0x4f, 0x26, 0xdb, 0x3a, 0x62, 0x0b, 0xe6, 0x6a, 0x83, 0x32, 0xd4, - 0x6c, 0x8d, 0x05, 0x82, 0x1a, 0x27, 0xfd, 0xec, 0xaa, 0x8f, 0x2a, 0x8d, - 0x5c, 0x21, 0x8f, 0xd5, 0xb2, 0x80, 0xa0, 0x91, 0xba, 0x8b, 0x94, 0xc2, - 0xc9, 0xa4, 0xed, 0x96, 0xd4, 0xc0, 0xf8, 0xdc, 0x59, 0xec, 0x74, 0x30, - 0xba, 0x28, 0xfb, 0x6c, 0xe5, 0xb1, 0xd7, 0x1d, 0x40, 0x1b, 0xa3, 0x79, - 0xc7, 0x79, 0x9e, 0xd2, 0x39, 0x6c, 0x80, 0x1a, 0x23, 0x8a, 0xb1, 0x27, - 0x37, 0xa9, 0x84, 0x84, 0xb1, 0xaf, 0x67, 0x26, 0x4e, 0x3e, 0x38, 0x6a, - 0x96, 0x0b, 0x88, 0x84, 0x9c, 0xb0, 0xdd, 0x26, 0xfb, 0xfa, 0x64, 0xb7, - 0x5a, 0x89, 0x44, 0xf8, 0x2f, 0xc2, 0xdc, 0xe0, 0x75, 0x08, 0x27, 0xeb, - 0x44, 0xe0, 0x20, 0xdf, 0x02, 0xac, 0x5a, 0x73, 0x01, 0xfc, 0x92, 0x6f, - 0x8b, 0xe9, 0xb5, 0x2d, 0x16, 0x89, 0xdf, 0x32, 0xee, 0x11, 0xc8, 0xce, - 0x5c, 0xc9, 0x7a, 0xb1, 0x1c, 0xcd, 0x26, 0xcf, 0xa2, 0x97, 0xf4, 0xcf, - 0xe7, 0x2d, 0xbe, 0x73, 0x49, 0x2a, 0x57, 0x59, 0x58, 0x65, 0x21, 0xfc, - 0xfe, 0x64, 0x8f, 0x4f, 0xc4, 0x03, 0xb5, 0x39, 0x4e, 0x11, 0x4a, 0x3a, - 0x49, 0xaf, 0xd3, 0xb2, 0xd0, 0x34, 0x42, 0xbc, 0xb0, 0xb6, 0x5c, 0x16, - 0xaf, 0xcf, 0xee, 0xde, 0x67, 0xd1, 0x28, 0x2d, 0xa3, 0x37, 0x47, 0xcf, - 0xa4, 0xe0, 0x5e, 0xb1, 0x9c, 0xf9, 0xc2, 0xac, 0x00, 0x04, 0x46, 0xa5, - 0xed, 0x2e, 0xc3, 0xf4, 0x2d, 0x47, 0xd3, 0x46, 0xed, 0x9b, 0xdb, 0x64, - 0x55, 0x2b, 0x2a, 0xce, 0xb0, 0x63, 0x45, 0x52, 0xb7, 0xb3, 0x3b, 0x92, - 0x43, 0xdd, 0x6e, 0xf5, 0xda, 0x37, 0x05, 0x7a, 0x9a, 0x3f, 0x8d, 0xa0, - 0xb0, 0x6a, 0x5d, 0xb5, 0xe4, 0x7f, 0x90, 0x01, 0xef, 0xfb, 0xf0, 0xf0, - 0x5c, 0xdc, 0x39, 0x08, 0xdd, 0x0b, 0x30, 0x24, 0x1e, 0xc3, 0xbe, 0xfd, - 0xb4, 0x6a, 0x5a, 0x95, 0xb2, 0x9b, 0x86, 0x59, 0xd4, 0x27, 0xe5, 0xea, - 0x7a, 0x5d, 0x2d, 0xc5, 0xe8, 0x04, 0xcf, 0xea, 0x31, 0x36, 0x8d, 0xf8, - 0x14, 0x6f, 0x04, 0xa9, 0xcf, 0x72, 0xed, 0xf2, 0x41, 0x48, 0xc7, 0x5c, - 0xd2, 0xb6, 0x81, 0xbe, 0xba, 0xf4, 0xf0, 0xc6, 0x56, 0xe0, 0x33, 0x5f, - 0x0a, 0xa0, 0xf9, 0xc1, 0x82, 0xcd, 0x3c, 0xd1, 0xee, 0xe0, 0xa1, 0x17, - 0x56, 0x17, 0x53, 0x00, 0x7c, 0x94, 0x11, 0x6b, 0x78, 0xa0, 0x10, 0x8e, - 0x51, 0x1b, 0x0d, 0xb7, 0x2d, 0xf6, 0xb5, 0x29, 0x87, 0x27, 0xe5, 0xc2, - 0x82, 0xf7, 0x88, 0x97, 0x5d, 0xc7, 0xc0, 0x5f, 0x0f, 0x28, 0x2f, 0xa5, - 0x73, 0xa0, 0x90, 0x66, 0xeb, 0xe6, 0x2d, 0xdf, 0x06, 0xa0, 0xbe, 0x76, - 0x0f, 0xab, 0x2c, 0x2e, 0xc1, 0xbd, 0x42, 0x6e, 0xc1, 0xd7, 0xcd, 0x22, - 0x68, 0xdc, 0x8c, 0x3b, 0xbd, 0xd0, 0x7e, 0x65, 0x05, 0xfa, 0x7c, 0xf3, - 0xf5, 0x22, 0xd4, 0x45, 0x77, 0x8c, 0xd2, 0x47, 0x35, 0x4b, 0xa3, 0xcd, - 0x20, 0xfe, 0xc2, 0xea, 0xf8, 0x72, 0xa8, 0xd3, 0x60, 0x10, 0x1e, 0x27, - 0x30, 0xf2, 0x2b, 0x66, 0x7e, 0xad, 0xb9, 0xdc, 0xe7, 0x82, 0x59, 0x18, - 0x55, 0xeb, 0x53, 0x6b, 0xcd, 0xa9, 0x40, 0x4c, 0x76, 0xcd, 0x0c, 0x9c, - 0x89, 0x24, 0xe1, 0x8f, 0xda, 0xae, 0x27, 0xf4, 0x26, 0x13, 0x09, 0xe2, - 0x11, 0x68, 0x27, 0x5c, 0x91, 0xfa, 0x41, 0x74, 0x30, 0x37, 0x4d, 0x3c, - 0xd2, 0x4a, 0x61, 0x48, 0xdc, 0x69, 0x54, 0x77, 0xb9, 0x4d, 0x1a, 0x26, - 0x01, 0xb5, 0x09, 0x04, 0x33, 0x23, 0xb9, 0x6a, 0x67, 0x7f, 0x37, 0xac, - 0x0b, 0x34, 0xd7, 0xf2, 0x11, 0x28, 0x96, 0xf3, 0xdb, 0x45, 0xdf, 0x9f, - 0xa8, 0x24, 0xd6, 0x46, 0x2f, 0x0c, 0xbb, 0xbd, 0xfd, 0xfa, 0xe4, 0xf4, - 0x78, 0x2b, 0x7a, 0x9d, 0x00, 0x57, 0xa4, 0x4a, 0x14, 0x38, 0xbe, 0xbf, - 0x93, 0x4f, 0x8c, 0xfc, 0x55, 0x09, 0x6d, 0x8b, 0x1f, 0x51, 0x87, 0x05, - 0xa4, 0x69, 0x39, 0x11, 0x98, 0x83, 0x64, 0x66, 0x65, 0x30, 0x5c, 0x1a, - 0xb2, 0x3a, 0xc4, 0xd5, 0x00, 0xf4, 0xa3, 0xa5, 0xb8, 0x53, 0x1c, 0x85, - 0xb5, 0x70, 0x3c, 0xde, 0x05, 0x93, 0x91, 0xc5, 0x01, 0xf3, 0xd8, 0xd5, - 0x2a, 0x57, 0xa9, 0x8b, 0xbe, 0xae, 0x68, 0x5e, 0x91, 0xfe, 0x2c, 0xd1, - 0xe8, 0x58, 0xb5, 0x59, 0x36, 0x71, 0xf8, 0x92, 0x52, 0xb2, 0x86, 0xe7, - 0x1b, 0xac, 0xdd, 0x5f, 0x69, 0xed, 0xfe, 0xba, 0x9c, 0xdf, 0xf6, 0xb5, - 0x34, 0xa1, 0x02, 0x7a, 0x14, 0xed, 0x67, 0xef, 0x3b, 0x17, 0x83, 0x82, - 0xc0, 0x60, 0x31, 0x74, 0x36, 0x6b, 0xf4, 0xc5, 0x01, 0xbc, 0x5c, 0xef, - 0xb1, 0x02, 0x3f, 0xa1, 0xf0, 0xc0, 0x91, 0xa3, 0x34, 0xb9, 0x31, 0x87, - 0x25, 0xb3, 0x8e, 0xd8, 0xb1, 0x62, 0x89, 0xda, 0x74, 0x67, 0xe0, 0xb1, - 0x15, 0x1b, 0x90, 0xb5, 0x85, 0xa6, 0x9d, 0xdd, 0x58, 0x8d, 0x3b, 0x08, - 0xb0, 0x1a, 0x5b, 0x42, 0xa2, 0x40, 0xca, 0xb6, 0x4d, 0xba, 0xe6, 0x5d, - 0x05, 0x46, 0x09, 0x4e, 0x64, 0x04, 0x59, 0x26, 0xa5, 0xda, 0x35, 0x2b, - 0x09, 0x81, 0x91, 0x21, 0x7f, 0x17, 0x1e, 0xef, 0xc7, 0x06, 0x18, 0xd5, - 0x06, 0x27, 0x02, 0x3d, 0xcb, 0x06, 0xdd, 0x06, 0xe1, 0x8c, 0xa7, 0x99, - 0x54, 0x3d, 0xba, 0x0f, 0xdd, 0x9a, 0xff, 0x89, 0xfb, 0x9e, 0x2f, 0x33, - 0xa5, 0xc4, 0x7e, 0x4b, 0x84, 0x7c, 0x08, 0x99, 0x6a, 0x18, 0x6b, 0xc8, - 0x3a, 0x82, 0x18, 0x71, 0xe6, 0x9b, 0x98, 0x07, 0x25, 0xbf, 0x55, 0xc5, - 0x58, 0x5b, 0x6c, 0xa8, 0x1f, 0x54, 0xf3, 0x70, 0x9c, 0xfa, 0x88, 0xc8, - 0x2a, 0x2b, 0x52, 0xd9, 0x16, 0x67, 0x14, 0x0c, 0xf5, 0xe6, 0x66, 0x84, - 0xb8, 0x81, 0x1b, 0xb8, 0xe4, 0x78, 0x17, 0x7a, 0x65, 0xda, 0x67, 0x30, - 0xdf, 0x5b, 0xf0, 0xf5, 0xa2, 0x2d, 0x6e, 0x4c, 0xd3, 0xa9, 0x82, 0x49, - 0x06, 0x56, 0x4e, 0x15, 0xf3, 0x2d, 0x6c, 0xc7, 0xe0, 0x5d, 0x49, 0x2c, - 0xb5, 0xd6, 0x3a, 0xcd, 0xa0, 0x91, 0x10, 0x69, 0x40, 0x4c, 0x67, 0x1e, - 0xd0, 0xe9, 0x80, 0x68, 0xab, 0xf1, 0x08, 0xe7, 0x6d, 0x48, 0xe4, 0x7a, - 0xd2, 0x52, 0xa7, 0x9b, 0x61, 0xb8, 0x69, 0x8b, 0x2c, 0xb0, 0xc1, 0x95, - 0x03, 0x6c, 0x49, 0xcc, 0xd3, 0x3c, 0x4b, 0x59, 0xb7, 0x98, 0xdd, 0x67, - 0x75, 0x5a, 0x5d, 0xb9, 0x80, 0x50, 0x17, 0x28, 0x2b, 0xbe, 0x10, 0x2d, - 0x08, 0xe4, 0x47, 0x15, 0xe0, 0xf2, 0xaf, 0x9d, 0x2c, 0x2a, 0xd3, 0x58, - 0xbc, 0x61, 0xb8, 0xc6, 0xcd, 0x70, 0xc3, 0x40, 0x14, 0x8d, 0x7c, 0x81, - 0x37, 0xe2, 0x07, 0x80, 0x6c, 0x40, 0x00, 0x9a, 0x54, 0x2e, 0x51, 0xa7, - 0x28, 0x9c, 0xf2, 0x62, 0xae, 0x95, 0xfc, 0x1e, 0x58, 0x69, 0xd7, 0x94, - 0x81, 0x43, 0xf2, 0xe5, 0x4d, 0xfc, 0xf0, 0x30, 0x28, 0x12, 0xa9, 0x8b, - 0x56, 0x14, 0x53, 0x24, 0x7a, 0x56, 0xeb, 0xbf, 0x71, 0x9a, 0x7f, 0xb2, - 0x88, 0xa7, 0x88, 0x76, 0x64, 0x7e, 0xb4, 0xae, 0xce, 0x56, 0x35, 0x5a, - 0x41, 0x2a, 0x00, 0x4a, 0xb9, 0xf4, 0x54, 0xea, 0xc3, 0x04, 0x72, 0x1c, - 0x03, 0x43, 0x15, 0xc2, 0x8a, 0x38, 0x04, 0x2b, 0x4a, 0x27, 0x0d, 0xa7, - 0x93, 0x86, 0x76, 0xb1, 0xfb, 0x87, 0x77, 0xce, 0x0d, 0x82, 0xb5, 0x8d, - 0x91, 0xda, 0xa1, 0x11, 0x59, 0xc2, 0xad, 0x9b, 0x77, 0x8c, 0xd1, 0x06, - 0x48, 0xdd, 0x9a, 0x2c, 0x1b, 0xda, 0x6e, 0xfd, 0x7d, 0x2b, 0xb2, 0x1b, - 0xe4, 0x5e, 0x80, 0xf7, 0xf0, 0x13, 0x99, 0xbb, 0xd3, 0x01, 0xc9, 0x8b, - 0xea, 0x8d, 0x8d, 0xcb, 0xe0, 0x4a, 0x50, 0x38, 0x64, 0x8a, 0x97, 0x87, - 0xe7, 0xef, 0xbf, 0x39, 0x3e, 0x3e, 0x3f, 0x39, 0x22, 0xde, 0x2f, 0x32, - 0xa5, 0xfb, 0xe8, 0xed, 0xe5, 0xb7, 0xa7, 0x06, 0xcc, 0x61, 0xeb, 0xd3, - 0xe0, 0xd6, 0x6c, 0xf8, 0x45, 0x73, 0xa7, 0xe9, 0x7c, 0xf9, 0xd0, 0x43, - 0x79, 0x29, 0x52, 0x34, 0x0e, 0x4e, 0xbe, 0xef, 0x45, 0x5f, 0x9f, 0xf7, - 0xdf, 0x7d, 0xdf, 0x48, 0x9e, 0xaa, 0x04, 0xe5, 0xd5, 0xcf, 0xb9, 0x0b, - 0xd1, 0x03, 0x62, 0x98, 0x9f, 0xbb, 0x91, 0x58, 0x0b, 0xb8, 0xf2, 0xc7, - 0x5d, 0xf6, 0x55, 0xdb, 0x7d, 0x78, 0xdb, 0x3b, 0xe3, 0x92, 0xec, 0x7d, - 0xcb, 0x6d, 0x17, 0xcf, 0x38, 0xd1, 0x68, 0x10, 0x12, 0xd6, 0x2a, 0x7a, - 0x49, 0xff, 0xb4, 0x65, 0x6b, 0x6e, 0x73, 0x91, 0xfa, 0xe8, 0x3c, 0x80, - 0xae, 0x70, 0x0e, 0xac, 0x81, 0xc5, 0x2d, 0xa9, 0x25, 0x41, 0xd3, 0x8f, - 0xd4, 0x49, 0x98, 0x37, 0xc0, 0x29, 0x5d, 0x0b, 0xbe, 0xa8, 0x2f, 0xcc, - 0x7b, 0x49, 0xbb, 0xf3, 0xf1, 0x57, 0x4c, 0x53, 0xa5, 0x4e, 0x3f, 0x08, - 0x88, 0xd0, 0x98, 0x22, 0x3f, 0x3a, 0x70, 0x80, 0x30, 0x2a, 0xb3, 0x70, - 0x23, 0x98, 0x9f, 0xa2, 0x6e, 0xb4, 0xe0, 0xb0, 0x0b, 0x60, 0x82, 0x43, - 0xf6, 0x40, 0x83, 0x34, 0xfa, 0x01, 0xa3, 0x23, 0xf4, 0x04, 0x27, 0x21, - 0xc4, 0x48, 0x70, 0x38, 0x40, 0x5a, 0x9d, 0xac, 0x6c, 0x35, 0x5e, 0x01, - 0xc8, 0xe4, 0xdf, 0x87, 0x8d, 0x70, 0x9b, 0x8f, 0xa2, 0x97, 0x08, 0xf8, - 0x6b, 0x0f, 0xa4, 0xd6, 0xba, 0xb1, 0xdf, 0x24, 0xf9, 0x28, 0xc9, 0xb3, - 0xa2, 0x9e, 0x43, 0xa7, 0x39, 0xf7, 0x5a, 0x9f, 0x93, 0x9b, 0x51, 0x68, - 0xff, 0x86, 0xe1, 0x15, 0x42, 0x78, 0x22, 0x1e, 0xec, 0x46, 0xb6, 0x50, - 0x17, 0xb1, 0x73, 0xdd, 0x5e, 0xd4, 0xe5, 0x4c, 0x41, 0xfe, 0x49, 0xac, - 0xeb, 0x0a, 0xbe, 0x91, 0x34, 0x9e, 0x76, 0x7b, 0x4d, 0x78, 0xc4, 0xae, - 0xae, 0x7a, 0x97, 0x36, 0x4e, 0x5a, 0xb3, 0x42, 0xaa, 0xb1, 0x8e, 0x43, - 0x10, 0x5d, 0xd2, 0x42, 0x41, 0x17, 0x43, 0x0b, 0x5d, 0xd1, 0xc0, 0xb2, - 0x72, 0xcd, 0x55, 0x53, 0xb5, 0xd6, 0xd5, 0x66, 0xa9, 0x72, 0x5e, 0x0d, - 0x8d, 0x84, 0xb6, 0x6f, 0xe9, 0xec, 0x92, 0xf0, 0x0e, 0xed, 0xf9, 0x56, - 0xd7, 0xee, 0x29, 0xcb, 0xaa, 0x5f, 0x0d, 0x87, 0x07, 0xe7, 0x27, 0xf5, - 0xa5, 0xa6, 0x4f, 0xfb, 0x6f, 0xad, 0x46, 0xfc, 0x96, 0x51, 0x8a, 0xd7, - 0x4d, 0x79, 0x06, 0xc8, 0x3c, 0x62, 0xe9, 0x9a, 0x43, 0x45, 0x04, 0x8a, - 0xea, 0x5b, 0xba, 0xcc, 0xd6, 0x44, 0x38, 0x2a, 0xf8, 0x90, 0x9a, 0x38, - 0xf3, 0xa8, 0x52, 0x7b, 0x92, 0x04, 0xc9, 0xdf, 0x90, 0xa6, 0xbe, 0x91, - 0x7a, 0x66, 0x57, 0xe9, 0x35, 0x07, 0xe9, 0xe3, 0x67, 0x1b, 0x0e, 0x93, - 0x03, 0x60, 0xd2, 0x12, 0xb0, 0xfe, 0x49, 0x2f, 0x31, 0x03, 0xf3, 0x4c, - 0x73, 0xcc, 0x44, 0x70, 0x1e, 0x58, 0x4d, 0x89, 0x06, 0x4a, 0x94, 0xbd, - 0x9c, 0x06, 0x21, 0x13, 0xd3, 0xc4, 0x47, 0xe4, 0x98, 0x62, 0x82, 0xbb, - 0xdc, 0x37, 0x0a, 0x0d, 0xb1, 0x49, 0xae, 0x56, 0x07, 0x4f, 0x5f, 0x16, - 0x3b, 0x7a, 0x38, 0x61, 0x15, 0x99, 0xc5, 0xd6, 0xc5, 0x4e, 0x7f, 0x7b, - 0x23, 0x6b, 0x03, 0x1b, 0x20, 0x19, 0x90, 0xe1, 0x9a, 0xc3, 0x31, 0x0c, - 0xa2, 0xb3, 0x45, 0x20, 0x7d, 0xdd, 0x24, 0x69, 0xee, 0x1d, 0xa2, 0x3e, - 0x9f, 0x1d, 0x5c, 0xa1, 0x39, 0x59, 0x66, 0x3c, 0x59, 0xb5, 0x20, 0x8f, - 0xae, 0xa0, 0x4c, 0x5b, 0xca, 0xa7, 0x18, 0xdf, 0x85, 0xe7, 0x8c, 0x66, - 0x52, 0x26, 0xc5, 0x82, 0xf4, 0xd0, 0x46, 0xf5, 0x4f, 0x31, 0x70, 0x02, - 0xf9, 0x80, 0x61, 0xa5, 0x0b, 0x04, 0xe1, 0x44, 0xc0, 0xe2, 0x5f, 0x55, - 0xdc, 0x2e, 0xf0, 0x78, 0xd2, 0x29, 0xda, 0x54, 0xfc, 0xc2, 0xd6, 0x02, - 0x85, 0xe2, 0x33, 0xe0, 0xc3, 0x1e, 0xa0, 0xfa, 0x5b, 0x79, 0x39, 0xdf, - 0xbe, 0x87, 0xe1, 0xf1, 0x7e, 0xe0, 0xb4, 0x25, 0x6b, 0xda, 0x41, 0xa6, - 0x04, 0x13, 0x70, 0xb0, 0x5d, 0xce, 0x81, 0x6c, 0x6c, 0x07, 0x40, 0xe8, - 0xa2, 0x4e, 0x28, 0xf6, 0x43, 0x03, 0x0b, 0x2a, 0x03, 0xc8, 0xca, 0x77, - 0x02, 0x0c, 0x31, 0xc9, 0x96, 0xcc, 0xe0, 0xe4, 0xd3, 0xba, 0x03, 0x27, - 0x91, 0xd2, 0x8e, 0x05, 0x3b, 0x85, 0xd8, 0x8b, 0xd3, 0x52, 0x7c, 0xc2, - 0x41, 0x33, 0xec, 0x47, 0x7f, 0xf9, 0x4b, 0x2f, 0xfa, 0x4b, 0x87, 0xfe, - 0x2b, 0xe9, 0x3f, 0x5a, 0xcf, 0xbf, 0x48, 0x2d, 0x83, 0xbf, 0xdc, 0xd1, - 0xfd, 0x19, 0x71, 0x49, 0xc2, 0x62, 0xca, 0x20, 0x02, 0x1e, 0xa7, 0xbe, - 0x05, 0x5a, 0x43, 0x42, 0x0c, 0xb5, 0x3e, 0x07, 0x1f, 0x7e, 0x58, 0xb0, - 0x26, 0x6e, 0xa9, 0x24, 0xb5, 0x86, 0x36, 0x6c, 0x39, 0x9b, 0x4b, 0x38, - 0x8a, 0x6e, 0x3b, 0xc8, 0xba, 0xa1, 0x45, 0xc6, 0x51, 0xf7, 0x13, 0xf3, - 0x9a, 0x97, 0x96, 0xda, 0x1a, 0x06, 0x69, 0xe2, 0x35, 0xa3, 0xeb, 0x52, - 0xeb, 0x40, 0x4a, 0x9c, 0x52, 0x5b, 0xbc, 0xa6, 0xa8, 0xe1, 0x67, 0x73, - 0xd8, 0xea, 0x01, 0x11, 0xaa, 0x8c, 0x55, 0x59, 0x21, 0x5b, 0xa5, 0x17, - 0x37, 0x2b, 0xe8, 0x9a, 0x3a, 0x24, 0x57, 0xcb, 0x99, 0x46, 0xd9, 0x52, - 0x56, 0xa4, 0x29, 0x7c, 0x5b, 0xe1, 0x52, 0x55, 0xd7, 0xad, 0x42, 0x66, - 0xc8, 0x57, 0x68, 0x80, 0xdd, 0x7e, 0xb7, 0x8a, 0x8d, 0x68, 0x61, 0x3c, - 0x6d, 0x75, 0x6e, 0x82, 0xa2, 0x34, 0x8d, 0xda, 0x98, 0xb0, 0x95, 0x2a, - 0xfc, 0x97, 0x80, 0xec, 0x0b, 0xd0, 0x46, 0xe6, 0xbd, 0x49, 0xf0, 0x12, - 0x56, 0x26, 0xa2, 0x7a, 0x3b, 0xb1, 0xd6, 0x46, 0x2d, 0x12, 0x05, 0x7e, - 0xd3, 0x77, 0xd3, 0x32, 0x50, 0x84, 0xfa, 0x7d, 0xa9, 0x9c, 0xa9, 0x78, - 0xd0, 0x90, 0x5a, 0x71, 0x39, 0xb1, 0xc6, 0x53, 0xa4, 0xb3, 0x45, 0xc3, - 0xf2, 0xc8, 0x6b, 0xec, 0x85, 0x5e, 0x1e, 0x06, 0x70, 0xf0, 0xb9, 0x9a, - 0xce, 0xfd, 0x5c, 0xd9, 0xc8, 0x30, 0x03, 0x8a, 0x80, 0x18, 0xa7, 0x00, - 0x2a, 0xe3, 0xe3, 0x76, 0x5a, 0xbc, 0xf6, 0x0d, 0x33, 0x15, 0x8f, 0xe9, - 0x55, 0xd4, 0x59, 0xab, 0xa5, 0x74, 0xea, 0x2f, 0x9c, 0x32, 0xec, 0x8b, - 0xee, 0xb8, 0x60, 0xfd, 0x8d, 0x61, 0x94, 0x13, 0x7c, 0xb6, 0x29, 0x10, - 0x49, 0xb4, 0x76, 0xa1, 0x4b, 0x8a, 0x0c, 0x99, 0xd3, 0x1a, 0x5f, 0x8c, - 0x38, 0xb1, 0x04, 0x3a, 0x52, 0x4f, 0x25, 0x57, 0x42, 0x5d, 0x07, 0x7b, - 0x6a, 0x36, 0x16, 0xce, 0xe1, 0xbf, 0x55, 0xf4, 0x37, 0xb5, 0x41, 0x6c, - 0x9a, 0xb6, 0xf7, 0x37, 0xbb, 0xc7, 0xb6, 0xd4, 0x4a, 0x2e, 0x79, 0xa9, - 0x6b, 0xa0, 0x5b, 0xc2, 0x2b, 0xc8, 0x81, 0x09, 0xa5, 0x90, 0xea, 0xe9, - 0xbd, 0xe5, 0x7c, 0xe2, 0xc2, 0x04, 0x0d, 0xeb, 0x65, 0x2d, 0x55, 0x43, - 0xd1, 0xe1, 0x1e, 0x15, 0x74, 0x4e, 0x89, 0xc7, 0x73, 0x16, 0xf8, 0x1c, - 0x0a, 0x27, 0x20, 0x67, 0x39, 0x29, 0xb1, 0x8d, 0x9d, 0xd9, 0xdd, 0x72, - 0x71, 0xa0, 0xa8, 0xeb, 0x27, 0x85, 0x1e, 0x55, 0x0d, 0xeb, 0xdc, 0x64, - 0x02, 0xf7, 0xd3, 0xd9, 0x67, 0xcd, 0x4a, 0x19, 0x83, 0x9f, 0x65, 0xf3, - 0x28, 0x00, 0x4c, 0xe9, 0xeb, 0xb3, 0x37, 0xc7, 0x2e, 0xe3, 0x55, 0x4c, - 0x7d, 0xfc, 0x49, 0x2b, 0xc4, 0xe3, 0x00, 0xf9, 0x04, 0x86, 0x00, 0xd1, - 0x6b, 0xd6, 0xe8, 0x94, 0x25, 0xba, 0x4e, 0xca, 0xc5, 0xfd, 0x32, 0x9d, - 0x6c, 0x02, 0xa4, 0xe3, 0xdd, 0xdb, 0x93, 0xef, 0xfb, 0x62, 0x29, 0x16, - 0x45, 0xce, 0x70, 0x2a, 0x0c, 0xe5, 0x42, 0xbc, 0x09, 0xb3, 0x16, 0x4c, - 0x16, 0xa5, 0x1a, 0x1c, 0x33, 0x45, 0x25, 0x42, 0xae, 0x5f, 0x3a, 0x17, - 0x21, 0x46, 0x1a, 0xa4, 0x7b, 0xe3, 0x6c, 0x4e, 0xec, 0x1b, 0x58, 0x4b, - 0x02, 0xa0, 0xd1, 0x92, 0xbd, 0x5b, 0x5d, 0x89, 0xe8, 0xe0, 0xfc, 0xfc, - 0xe8, 0xe0, 0xf2, 0xc0, 0xcd, 0x0d, 0xe0, 0x46, 0xe0, 0x73, 0x10, 0x67, - 0x58, 0xb1, 0xd7, 0x4a, 0x49, 0xdd, 0xdf, 0x73, 0x86, 0x60, 0x9d, 0xf3, - 0x9d, 0x5f, 0x9c, 0xb1, 0x99, 0xf1, 0xf7, 0x7f, 0x39, 0xf0, 0x15, 0xe2, - 0x50, 0x0a, 0xa9, 0x59, 0xa8, 0x6b, 0x6f, 0x8b, 0xc7, 0x77, 0xef, 0xc6, - 0xa7, 0x71, 0x42, 0x22, 0xc7, 0x45, 0xef, 0x79, 0x43, 0xf3, 0xb1, 0x13, - 0x4e, 0x6c, 0x35, 0xb0, 0x00, 0xbd, 0x96, 0xdc, 0xb2, 0x60, 0x22, 0x99, - 0xe7, 0xa7, 0x86, 0xf5, 0x64, 0x8b, 0x35, 0x8d, 0x92, 0x87, 0x64, 0xbc, - 0x2c, 0xc1, 0xbb, 0xd8, 0x9b, 0xc1, 0xf4, 0x35, 0xe1, 0x95, 0xaa, 0x3b, - 0xea, 0xeb, 0xdb, 0xe3, 0x61, 0x13, 0x85, 0x03, 0x49, 0x4a, 0x67, 0x26, - 0x55, 0x31, 0x06, 0x3a, 0x5a, 0x5f, 0x17, 0xa3, 0x71, 0x76, 0x04, 0x48, - 0x91, 0xe8, 0xdc, 0xe8, 0xb1, 0xb1, 0x20, 0x9f, 0x10, 0xe3, 0xeb, 0x5b, - 0x88, 0xa9, 0x4c, 0x9c, 0x3e, 0x68, 0x3c, 0x54, 0xba, 0x1a, 0x0f, 0x2c, - 0x26, 0x35, 0xbd, 0x9f, 0xca, 0xa7, 0x42, 0x06, 0x55, 0x37, 0xf5, 0x28, - 0x64, 0x8c, 0x3e, 0x05, 0xa8, 0x62, 0x44, 0x21, 0x36, 0xfd, 0x39, 0xe6, - 0x58, 0xa4, 0x47, 0x49, 0x2a, 0x26, 0x11, 0x97, 0xff, 0xda, 0xde, 0x1d, - 0xec, 0x74, 0x9a, 0xa3, 0x47, 0xe2, 0x19, 0x2c, 0xe3, 0xf1, 0x5c, 0xee, - 0x67, 0x01, 0xe6, 0xcd, 0x3e, 0x3c, 0x40, 0xe1, 0xa0, 0x24, 0xf3, 0x21, - 0x6e, 0xa1, 0x6d, 0x2c, 0xfd, 0xb3, 0x86, 0x77, 0x48, 0x3c, 0x9c, 0x9e, - 0x25, 0xcf, 0x33, 0x84, 0x95, 0xc6, 0x6c, 0x2c, 0x83, 0x9f, 0xa0, 0xd3, - 0xbe, 0xc0, 0xf3, 0x89, 0x44, 0x3b, 0xd4, 0xd6, 0xf9, 0x51, 0xdd, 0x65, - 0x7d, 0x98, 0xa0, 0xa3, 0x01, 0xf7, 0xf1, 0x5a, 0x6e, 0x57, 0x71, 0x8b, - 0x5a, 0xa1, 0xfb, 0x56, 0xf0, 0xd5, 0x03, 0xc1, 0x3f, 0x0e, 0x35, 0x0d, - 0xce, 0x83, 0xe3, 0xea, 0x81, 0x1c, 0x55, 0xc5, 0x9a, 0x93, 0xe6, 0x6f, - 0xce, 0x2a, 0x65, 0x00, 0xf1, 0x7b, 0xf3, 0xb6, 0xad, 0x94, 0x8d, 0x8e, - 0xb4, 0xe7, 0xbe, 0x5c, 0xb8, 0x6a, 0xa9, 0x43, 0x15, 0x96, 0xa0, 0x44, - 0xb6, 0xf3, 0x02, 0xac, 0x81, 0x07, 0x31, 0x29, 0x95, 0xd4, 0xc1, 0xa9, - 0xc0, 0xa9, 0x48, 0x40, 0xad, 0x68, 0x51, 0x32, 0x2c, 0xf1, 0xb8, 0x7b, - 0x2f, 0x14, 0xbf, 0xf7, 0xbb, 0xb6, 0xa2, 0xdb, 0xfb, 0x8a, 0xcf, 0x92, - 0x25, 0xa2, 0xc3, 0x89, 0xdf, 0x9e, 0x43, 0x22, 0x34, 0x51, 0xa9, 0xff, - 0xda, 0x99, 0xd5, 0xcc, 0xee, 0xc6, 0x3a, 0x2a, 0x2d, 0x79, 0x13, 0x24, - 0x54, 0x80, 0x2c, 0xd8, 0xb2, 0x8b, 0xd2, 0x60, 0x3d, 0x36, 0x71, 0x09, - 0x3b, 0xc8, 0x18, 0x62, 0x21, 0x36, 0xe8, 0x3b, 0x3d, 0x04, 0xd4, 0xd7, - 0x35, 0x49, 0xc7, 0x6b, 0x42, 0xaa, 0x0d, 0x64, 0xc4, 0xd7, 0xd7, 0x65, - 0xef, 0x40, 0x61, 0x99, 0xb5, 0xef, 0x81, 0x9f, 0x35, 0x99, 0x6c, 0x3e, - 0xd9, 0x12, 0x23, 0x86, 0xab, 0x9c, 0x0d, 0xc7, 0xdd, 0xbf, 0xa8, 0x3c, - 0xaa, 0x70, 0xe0, 0x4b, 0x10, 0xb6, 0x6d, 0xab, 0x8b, 0x2c, 0x7b, 0x2c, - 0xcf, 0x66, 0x4a, 0x92, 0x4e, 0xd9, 0x87, 0x69, 0xe9, 0x25, 0x89, 0x5c, - 0xc9, 0x64, 0xad, 0x96, 0x29, 0xd0, 0x0c, 0xf1, 0x43, 0x3a, 0x5b, 0xce, - 0xbc, 0xe7, 0x99, 0x71, 0x79, 0xcb, 0xa4, 0x59, 0xe1, 0x50, 0x6d, 0x1a, - 0x0d, 0x79, 0x5a, 0xfd, 0x5e, 0x3a, 0x43, 0x20, 0x13, 0x4b, 0x0c, 0x11, - 0xbc, 0x2a, 0xac, 0xfe, 0xd3, 0x78, 0x38, 0x8b, 0x3f, 0x5d, 0x88, 0x0c, - 0xc1, 0x71, 0x2b, 0x13, 0x71, 0x9c, 0x32, 0x05, 0xd5, 0x37, 0xd5, 0x86, - 0x81, 0x0a, 0x06, 0xe2, 0x94, 0x90, 0x60, 0xa0, 0x79, 0xc9, 0xa9, 0x72, - 0x23, 0x6a, 0xe2, 0x3e, 0x9d, 0x94, 0x37, 0xed, 0x78, 0x83, 0xb2, 0x8e, - 0x98, 0x77, 0x24, 0x08, 0x25, 0x1c, 0x5e, 0x82, 0xa5, 0x82, 0xcf, 0x78, - 0x5b, 0x0c, 0xc7, 0x2e, 0xdb, 0x3e, 0x26, 0xba, 0xbb, 0xe2, 0xf4, 0x88, - 0xa6, 0x9e, 0xa0, 0x61, 0x71, 0x03, 0x3b, 0xa2, 0x08, 0xbc, 0xbd, 0xed, - 0xf2, 0x2d, 0xd9, 0xfd, 0x46, 0xad, 0x22, 0x02, 0x5b, 0x84, 0x60, 0x6a, - 0xad, 0x0e, 0xce, 0x11, 0x31, 0xb7, 0xe9, 0xb4, 0x59, 0x20, 0x71, 0x05, - 0x65, 0x2a, 0xea, 0xce, 0x24, 0x8c, 0xf5, 0x4d, 0x57, 0x0d, 0xf8, 0x28, - 0x84, 0xac, 0x1e, 0xed, 0x9e, 0xa4, 0x3e, 0x44, 0xdd, 0x6b, 0xe9, 0xe6, - 0x2b, 0xff, 0x50, 0xad, 0x39, 0xef, 0x04, 0xb7, 0x5b, 0xa4, 0xd8, 0x8f, - 0xf6, 0x76, 0x76, 0xbe, 0xe9, 0x45, 0x4f, 0xa4, 0x74, 0xec, 0xee, 0x57, - 0xad, 0x2b, 0x24, 0x0b, 0x84, 0x2d, 0x56, 0xfd, 0x33, 0xbe, 0x03, 0xaf, - 0xd7, 0x45, 0xc3, 0x8c, 0x58, 0x53, 0x9c, 0x2c, 0x03, 0xdb, 0xb2, 0x2c, - 0xfe, 0x9a, 0xad, 0x82, 0x19, 0xbb, 0x0e, 0x85, 0x30, 0x43, 0xdc, 0x10, - 0xef, 0xde, 0x0d, 0xfd, 0xc6, 0xde, 0x7b, 0xdb, 0x58, 0xf4, 0xd3, 0x92, - 0xcf, 0x5e, 0xdc, 0xf0, 0xf1, 0x1f, 0x2d, 0x73, 0x9c, 0x64, 0x76, 0x84, - 0x4a, 0x39, 0x22, 0xb6, 0xad, 0x43, 0x67, 0x90, 0x5a, 0xd2, 0xbe, 0x74, - 0x6a, 0x59, 0x99, 0xce, 0xa0, 0xbd, 0xde, 0x23, 0xe2, 0x67, 0x5c, 0x41, - 0xd8, 0x1f, 0x48, 0x61, 0x42, 0xff, 0x72, 0x4c, 0xbc, 0xe2, 0x21, 0xda, - 0x4e, 0xe8, 0x61, 0xac, 0x4f, 0x96, 0xb5, 0x2a, 0xd1, 0x53, 0x61, 0x60, - 0x86, 0x29, 0x1c, 0x73, 0x64, 0xfc, 0xb4, 0x85, 0x96, 0xe9, 0xe1, 0x81, - 0x48, 0xd3, 0xe0, 0xb7, 0x53, 0x7e, 0x60, 0xba, 0xea, 0x35, 0xd5, 0x0e, - 0x0e, 0x0b, 0x84, 0x3f, 0xc0, 0x14, 0xa1, 0x70, 0x54, 0x9c, 0x3e, 0x3b, - 0x46, 0x89, 0x1a, 0x8e, 0xec, 0xfa, 0xed, 0xcc, 0x52, 0x53, 0xc6, 0xe3, - 0x4f, 0x8b, 0xb2, 0xcf, 0xee, 0xdd, 0xf5, 0xa8, 0x5d, 0x9a, 0x53, 0x6e, - 0xe8, 0x5d, 0x13, 0x8f, 0x86, 0x29, 0x96, 0x6c, 0x29, 0xbd, 0x81, 0x28, - 0x4a, 0x68, 0xc9, 0xcc, 0xbe, 0xfa, 0x8d, 0x40, 0x3f, 0xd6, 0x8f, 0xef, - 0xd2, 0xe4, 0x9e, 0xd3, 0xb2, 0x8f, 0x3d, 0x28, 0x59, 0x95, 0x67, 0x58, - 0xf5, 0x8b, 0x59, 0x3c, 0xbe, 0xa1, 0x0b, 0xa5, 0x8f, 0xb8, 0xeb, 0x16, - 0x19, 0x2b, 0xac, 0xa0, 0x5a, 0x1f, 0x16, 0x83, 0xe1, 0xb8, 0x34, 0x2c, - 0xc3, 0xa5, 0x0b, 0x90, 0x14, 0x79, 0x10, 0x6b, 0x40, 0xb0, 0xc4, 0x58, - 0xea, 0x70, 0xae, 0xa0, 0x39, 0x66, 0xb9, 0x41, 0xc9, 0x7e, 0x48, 0x6c, - 0x90, 0x2c, 0x35, 0x43, 0xe3, 0x7a, 0x7b, 0x3a, 0xf4, 0x18, 0x01, 0xa5, - 0x56, 0x52, 0x80, 0xad, 0x60, 0xc8, 0x52, 0xe1, 0xeb, 0x35, 0x55, 0xa5, - 0x0b, 0x01, 0xcc, 0x97, 0xf8, 0x20, 0x44, 0xbf, 0x88, 0x78, 0x9b, 0xe6, - 0x15, 0xac, 0x07, 0x6e, 0xfd, 0xcf, 0x1a, 0xa0, 0x3d, 0x91, 0x2a, 0x3a, - 0xed, 0x91, 0x2a, 0x9c, 0x51, 0x17, 0x16, 0x42, 0x87, 0xb1, 0x19, 0x49, - 0x5e, 0x44, 0x62, 0x74, 0x69, 0xdf, 0x56, 0x25, 0x15, 0xce, 0xd1, 0x10, - 0x64, 0x98, 0x97, 0xc4, 0xd1, 0x3e, 0xff, 0xb1, 0x4f, 0xff, 0xfe, 0xd4, - 0xf0, 0x05, 0x96, 0x82, 0x27, 0xa3, 0x26, 0x2d, 0x0b, 0x2b, 0xcd, 0x3d, - 0x3c, 0xbe, 0x54, 0xa6, 0x47, 0x3b, 0xf2, 0x6d, 0x11, 0x14, 0x16, 0x68, - 0x0d, 0x91, 0x30, 0xb7, 0xdc, 0x66, 0xc1, 0x50, 0x40, 0x01, 0x00, 0xb9, - 0x44, 0x0d, 0x59, 0x2b, 0xb0, 0x0b, 0xcc, 0xe5, 0xc6, 0x91, 0xd2, 0x1d, - 0x75, 0xd5, 0x95, 0x5d, 0xed, 0xe3, 0xc4, 0xfb, 0x25, 0x7d, 0x7d, 0xc7, - 0x11, 0x03, 0xc4, 0x14, 0x2b, 0x86, 0x7a, 0x12, 0x71, 0xae, 0xc8, 0x5c, - 0x42, 0x0b, 0x28, 0x19, 0xc3, 0x6f, 0x3a, 0x72, 0x19, 0x8d, 0x48, 0xa2, - 0x33, 0x48, 0xc0, 0xa5, 0xce, 0xf3, 0x3c, 0xbb, 0xb7, 0xb3, 0xaf, 0x61, - 0xc9, 0x81, 0xcc, 0xe0, 0x1d, 0x8c, 0xd4, 0xf6, 0x72, 0xd1, 0xe2, 0x79, - 0xe5, 0x54, 0x85, 0x06, 0x90, 0x48, 0x98, 0x89, 0x19, 0xd6, 0xc9, 0x68, - 0x0d, 0x4f, 0x01, 0x92, 0xfc, 0x96, 0x47, 0x51, 0x75, 0xa5, 0x4d, 0xc4, - 0x96, 0xed, 0xd2, 0x2b, 0x34, 0x74, 0x1b, 0x18, 0x3a, 0x1c, 0x8b, 0xdc, - 0x28, 0x3d, 0x2e, 0xa9, 0xd5, 0xc0, 0x5d, 0xb0, 0xb8, 0xeb, 0x32, 0x72, - 0x25, 0x3a, 0x36, 0xd9, 0x93, 0x39, 0x86, 0xfd, 0x4b, 0x03, 0xc2, 0xeb, - 0x65, 0x32, 0xda, 0x70, 0x09, 0x88, 0x03, 0x3c, 0xf9, 0xfe, 0xfb, 0x00, - 0x9a, 0x84, 0xe5, 0xcd, 0xad, 0x5e, 0x85, 0x69, 0xd5, 0x2a, 0x46, 0x12, - 0x15, 0x65, 0x2d, 0xa7, 0xdc, 0xc2, 0xec, 0x35, 0x14, 0x95, 0x23, 0x31, - 0xa0, 0xc4, 0x0d, 0x5c, 0x08, 0xbc, 0x15, 0xb8, 0xd6, 0xe0, 0xf7, 0x20, - 0x0c, 0xac, 0xa5, 0x7e, 0x94, 0x0b, 0xf9, 0xe9, 0xf9, 0xd8, 0x5b, 0x89, - 0x3c, 0x41, 0x78, 0x5a, 0xb8, 0x54, 0x85, 0xa3, 0x18, 0xba, 0x95, 0xee, - 0xe7, 0x83, 0xb6, 0xca, 0x26, 0x4d, 0xec, 0x44, 0xc9, 0x62, 0xc0, 0x8c, - 0x70, 0x7e, 0xa5, 0x1a, 0x0f, 0x9b, 0xa6, 0xc6, 0x79, 0xa2, 0x9e, 0x9b, - 0xc2, 0x95, 0x96, 0x6f, 0x9c, 0x57, 0xb1, 0xf3, 0x20, 0xd2, 0x4a, 0xc0, - 0xc2, 0x39, 0x5c, 0x57, 0xce, 0x2e, 0xae, 0x1f, 0x1f, 0xcf, 0x10, 0xee, - 0x16, 0x3f, 0xde, 0x6b, 0x0a, 0x08, 0xf7, 0x28, 0x3f, 0x12, 0x98, 0xee, - 0x10, 0x72, 0xa5, 0x99, 0x49, 0x82, 0x79, 0xf3, 0xa7, 0x6a, 0x91, 0x3d, - 0xcd, 0x9b, 0x13, 0xd2, 0x6b, 0xab, 0x24, 0xd8, 0x2f, 0xf3, 0x25, 0x56, - 0x88, 0x37, 0x84, 0x41, 0xdc, 0x58, 0x32, 0xb6, 0x74, 0x32, 0x76, 0xf2, - 0x59, 0x74, 0x99, 0xdc, 0x62, 0xde, 0xdd, 0xda, 0x0c, 0x02, 0xb1, 0x79, - 0x59, 0xda, 0x3a, 0xa7, 0xa9, 0x57, 0x02, 0x24, 0xfa, 0x7d, 0x12, 0x4c, - 0xfb, 0x78, 0xac, 0x68, 0x54, 0x76, 0x68, 0xd8, 0xbc, 0xa4, 0x85, 0x22, - 0x5c, 0x30, 0xd3, 0x21, 0x8c, 0x86, 0xd4, 0x65, 0x14, 0x33, 0x05, 0xb1, - 0x09, 0xee, 0xab, 0xe3, 0xcb, 0xfa, 0xd1, 0x02, 0x74, 0x84, 0xaa, 0x8a, - 0xc8, 0x9f, 0xa0, 0xbf, 0xcf, 0xdf, 0x5d, 0x6e, 0x79, 0x73, 0xc0, 0x24, - 0xab, 0xd9, 0xac, 0xac, 0xf5, 0x96, 0x4c, 0x14, 0xc9, 0x51, 0x50, 0x50, - 0x06, 0x24, 0x9a, 0xb8, 0x03, 0xc1, 0x28, 0x0a, 0x4f, 0x76, 0x76, 0x49, - 0x54, 0xdb, 0xd9, 0x83, 0xd5, 0xe5, 0xc9, 0xce, 0x13, 0x67, 0xce, 0xb6, - 0xa7, 0x1a, 0x37, 0x1e, 0xd3, 0x34, 0xf0, 0x17, 0x50, 0xcc, 0x56, 0xb4, - 0xee, 0xe8, 0xc9, 0xc3, 0x03, 0xbe, 0xea, 0x55, 0xb1, 0x7a, 0x8a, 0x44, - 0xa7, 0xef, 0x86, 0xba, 0xe6, 0x68, 0xf9, 0x15, 0x87, 0xf9, 0x64, 0x39, - 0x97, 0xd8, 0x2f, 0x56, 0x7d, 0x91, 0xf1, 0x50, 0xbf, 0x1c, 0x42, 0x3a, - 0x78, 0x8c, 0x35, 0x9d, 0xb2, 0x78, 0x5f, 0x61, 0x64, 0x3d, 0x8f, 0x4c, - 0x22, 0x70, 0xbf, 0xa6, 0xdd, 0x59, 0x2a, 0x62, 0xad, 0xb9, 0x3f, 0x05, - 0x28, 0x9f, 0x52, 0x20, 0x05, 0xa4, 0x1e, 0x70, 0x37, 0x54, 0xbc, 0xe2, - 0xa4, 0x31, 0x7f, 0x4a, 0x32, 0x75, 0x10, 0x36, 0xf3, 0x20, 0xb2, 0x1c, - 0x8f, 0x4a, 0xd2, 0x7f, 0x99, 0x67, 0x93, 0xe5, 0x18, 0x77, 0x3d, 0x87, - 0xbd, 0x70, 0x21, 0xbf, 0x91, 0xa0, 0x3e, 0x1a, 0x88, 0x06, 0x37, 0xed, - 0x89, 0xb4, 0xa9, 0x66, 0x2b, 0x6c, 0x3a, 0x9e, 0x73, 0x69, 0xbb, 0xac, - 0xd9, 0xb0, 0xd1, 0xc8, 0x65, 0x0b, 0xd7, 0x59, 0xc4, 0xfc, 0x2a, 0x53, - 0xd3, 0x5f, 0x13, 0xa4, 0x17, 0x74, 0x09, 0x27, 0x9d, 0x99, 0xd5, 0x63, - 0x29, 0x46, 0x07, 0xda, 0xf9, 0x92, 0x83, 0xd5, 0x6a, 0xed, 0x55, 0x60, - 0x58, 0x67, 0x0c, 0x2a, 0x9b, 0x8f, 0xe9, 0x78, 0xbf, 0xd4, 0xa8, 0xcd, - 0xa6, 0xab, 0x1f, 0xa0, 0x23, 0x43, 0x67, 0xc2, 0x57, 0xac, 0x48, 0x0f, - 0x3a, 0xa5, 0xeb, 0x2a, 0x32, 0xf5, 0x4c, 0xe0, 0x87, 0x35, 0x69, 0xa6, - 0x99, 0xb8, 0x05, 0x64, 0x55, 0xbf, 0xe2, 0x1f, 0xcc, 0xb1, 0x0c, 0x5d, - 0x00, 0x2d, 0x68, 0x91, 0xb4, 0xd0, 0xe9, 0x82, 0x41, 0xbe, 0x9a, 0xb6, - 0xed, 0xf5, 0x18, 0x25, 0x3a, 0x6d, 0x30, 0xf1, 0x7f, 0xe7, 0xb4, 0xe1, - 0x76, 0xfd, 0x65, 0xc3, 0x7c, 0x40, 0x91, 0x1a, 0xc4, 0x59, 0xbe, 0x84, - 0xe2, 0xf6, 0x91, 0x6a, 0x39, 0xde, 0xd8, 0x34, 0xf5, 0x75, 0xcb, 0xe7, - 0x5b, 0x0b, 0xe6, 0x84, 0x00, 0x3a, 0x31, 0xf3, 0x58, 0x17, 0xda, 0xe9, - 0x2f, 0xb6, 0xb4, 0x1a, 0x49, 0x8d, 0xfb, 0x18, 0x99, 0x97, 0xbd, 0x2a, - 0x3c, 0xce, 0xba, 0x7a, 0x82, 0x08, 0x7c, 0x04, 0x63, 0x0d, 0x79, 0x0d, - 0xe0, 0x8f, 0x71, 0xfd, 0x26, 0x0f, 0xf0, 0xb9, 0x10, 0x9f, 0x7a, 0xfe, - 0x64, 0xd0, 0x6e, 0xfb, 0x11, 0x25, 0xdd, 0x87, 0x9c, 0x1a, 0x57, 0x16, - 0x27, 0x85, 0xc0, 0xc9, 0x2c, 0x72, 0x86, 0x96, 0x0d, 0x66, 0xd7, 0x6b, - 0xc1, 0xcd, 0x43, 0xe0, 0x39, 0x83, 0x80, 0x8b, 0x8c, 0x5c, 0x36, 0xa2, - 0x91, 0x2c, 0xfe, 0xc8, 0x4a, 0x72, 0x79, 0x23, 0x17, 0x4f, 0xb3, 0xe1, - 0x3d, 0xe6, 0x69, 0xe3, 0xb6, 0x06, 0x5a, 0x96, 0xa4, 0x59, 0x36, 0x16, - 0x4b, 0x28, 0x04, 0xb7, 0x9b, 0x41, 0x53, 0x64, 0xa4, 0x6a, 0xe4, 0x8d, - 0x50, 0x2a, 0xe4, 0xaf, 0xb3, 0x12, 0x80, 0xb0, 0xdf, 0xcb, 0x4a, 0x6d, - 0x48, 0x4f, 0x15, 0xb3, 0x6d, 0x21, 0x8c, 0x47, 0x23, 0xda, 0xde, 0x28, - 0x21, 0x88, 0x1a, 0x3c, 0x57, 0x78, 0x61, 0x25, 0x5b, 0x51, 0x70, 0x0d, - 0xe3, 0x85, 0xb8, 0x50, 0x06, 0xc4, 0x5a, 0x67, 0x85, 0x6b, 0x71, 0x77, - 0x91, 0x1c, 0x31, 0x08, 0x60, 0x54, 0x83, 0x38, 0x7e, 0x2d, 0x11, 0x9c, - 0x5a, 0x01, 0x83, 0x11, 0x8a, 0x9c, 0xff, 0x35, 0x1b, 0xa9, 0x94, 0xc4, - 0x37, 0x7d, 0x1b, 0x72, 0xed, 0x15, 0xa2, 0xc3, 0x49, 0x6d, 0x8f, 0x26, - 0x4b, 0x71, 0x12, 0xf2, 0x80, 0xe6, 0x49, 0xc9, 0x0a, 0x2c, 0x62, 0xc7, - 0x45, 0xcf, 0xa0, 0xd3, 0x24, 0xd8, 0x8e, 0x88, 0x69, 0x95, 0x98, 0xc2, - 0x06, 0x68, 0x9c, 0xab, 0xec, 0xa4, 0x72, 0x34, 0x16, 0x87, 0x5d, 0x61, - 0x6b, 0x64, 0x80, 0x5f, 0x4f, 0x19, 0x7e, 0x83, 0xdd, 0x98, 0x37, 0xa3, - 0xf6, 0xde, 0xe0, 0xc3, 0x01, 0x57, 0xac, 0xe4, 0x18, 0x6a, 0x71, 0x4f, - 0x2c, 0x35, 0xb5, 0x4f, 0x8a, 0x21, 0xfb, 0x56, 0xe6, 0xdb, 0x5c, 0x9e, - 0xb8, 0xcc, 0xc7, 0x8d, 0x46, 0x6e, 0x7d, 0xa6, 0x5b, 0x81, 0x00, 0x0b, - 0x6c, 0xd9, 0x00, 0x0f, 0x13, 0xf3, 0x78, 0xaf, 0xbf, 0x64, 0xce, 0x8f, - 0xb3, 0x15, 0x3a, 0x44, 0x5a, 0xcc, 0xf5, 0xdd, 0xc2, 0xf9, 0x17, 0x54, - 0xb5, 0xe5, 0x9d, 0x00, 0xf4, 0x56, 0x5b, 0x1d, 0x65, 0x87, 0x27, 0xbb, - 0x5a, 0x34, 0x82, 0x27, 0x24, 0x0c, 0x5a, 0x96, 0xee, 0x4a, 0x0a, 0x54, - 0x99, 0xdf, 0xca, 0xcb, 0xda, 0xae, 0x86, 0x55, 0x28, 0x6b, 0x08, 0x38, - 0x4a, 0xcb, 0xe8, 0x1a, 0xf5, 0xaa, 0x59, 0xc4, 0xc4, 0x1c, 0x37, 0x9f, - 0x6e, 0x41, 0xa9, 0x2e, 0x17, 0x9b, 0xbb, 0x5b, 0x82, 0xbb, 0xa6, 0xa9, - 0xfc, 0x16, 0xbe, 0xd1, 0xe6, 0x3d, 0xf4, 0xf5, 0xaf, 0x82, 0xda, 0xaa, - 0xcc, 0x3b, 0x00, 0x09, 0x8b, 0xf8, 0xcd, 0x2b, 0x39, 0x14, 0x78, 0xdc, - 0x34, 0x7a, 0x36, 0x42, 0xb6, 0x70, 0x46, 0xc9, 0x6a, 0x5b, 0xb0, 0x9f, - 0xa6, 0x10, 0xc8, 0xf5, 0xcd, 0xb4, 0x0c, 0x33, 0xf8, 0x38, 0xbf, 0x59, - 0x2a, 0x89, 0xd0, 0xea, 0x4d, 0x27, 0x7d, 0x90, 0xf1, 0x75, 0x9e, 0x35, - 0x11, 0xc2, 0xd8, 0xc9, 0xce, 0x6b, 0xb0, 0x65, 0xae, 0xd0, 0xd6, 0x4a, - 0x19, 0x1d, 0x76, 0x29, 0x76, 0xc2, 0x3a, 0x68, 0xe6, 0xb5, 0xac, 0x1b, - 0x86, 0x2a, 0x5b, 0xda, 0xa0, 0xf7, 0x83, 0xe8, 0x6f, 0xcb, 0x74, 0x7c, - 0x8b, 0xbd, 0x45, 0xf8, 0x13, 0x3c, 0x54, 0x89, 0x93, 0x5b, 0xe9, 0x7a, - 0x60, 0xc9, 0x5c, 0x2a, 0x62, 0xb1, 0xfe, 0x09, 0x31, 0xc5, 0xa8, 0xac, - 0xa5, 0x4a, 0x0d, 0x9f, 0x55, 0xa7, 0x57, 0x00, 0x25, 0x4a, 0x4e, 0xa0, - 0x5a, 0x60, 0x44, 0x1b, 0x99, 0x64, 0x1c, 0x21, 0xcb, 0x8e, 0x16, 0xa1, - 0x82, 0x75, 0xd8, 0xec, 0xdd, 0xd9, 0x8a, 0xb3, 0xd0, 0xbb, 0x15, 0xd2, - 0x8b, 0xba, 0xc4, 0xb3, 0xe8, 0x9e, 0xe8, 0xda, 0xfa, 0xd6, 0x1c, 0xf2, - 0x4d, 0xb4, 0xeb, 0x35, 0x5d, 0x0b, 0x69, 0x4b, 0x17, 0xbe, 0x75, 0x69, - 0x3c, 0xb8, 0x6b, 0x31, 0xd7, 0xbe, 0xf9, 0xde, 0x6b, 0x6d, 0x7f, 0xab, - 0x6b, 0xe6, 0x31, 0x1b, 0xf0, 0xb8, 0xd5, 0x7a, 0xf6, 0x9c, 0x44, 0xec, - 0xae, 0xbc, 0x12, 0xb6, 0x78, 0xcb, 0xa2, 0x99, 0xe0, 0xe7, 0x2a, 0xb0, - 0xf1, 0x84, 0x99, 0x6e, 0xd8, 0xda, 0x13, 0x5b, 0x6d, 0x19, 0xe1, 0x64, - 0xf2, 0xba, 0x36, 0xcb, 0x74, 0x39, 0xa8, 0x0c, 0x56, 0x43, 0xdc, 0xd6, - 0xa4, 0x2d, 0x59, 0x25, 0xf8, 0xa8, 0x12, 0x0f, 0xd7, 0x52, 0x0c, 0x3e, - 0xa9, 0x3e, 0xd1, 0x9e, 0xbe, 0xcc, 0xea, 0xc3, 0x24, 0xe1, 0x48, 0x23, - 0x89, 0x7f, 0x7a, 0x93, 0x8e, 0xf3, 0xac, 0xc8, 0xae, 0xe4, 0x56, 0xf7, - 0xb8, 0x99, 0x6a, 0x70, 0xe2, 0xf4, 0xe2, 0x98, 0x9d, 0xbb, 0x4d, 0x7e, - 0xa1, 0xe5, 0xf8, 0xd8, 0xf2, 0x8b, 0x80, 0x42, 0xba, 0xb4, 0x67, 0x44, - 0xeb, 0xcc, 0x45, 0xd8, 0x12, 0x5c, 0x8a, 0x21, 0x3c, 0x8e, 0x9c, 0x5b, - 0x87, 0xcf, 0xb9, 0x85, 0x4c, 0x3e, 0x7b, 0x5c, 0x93, 0xe6, 0xad, 0xd0, - 0x2a, 0x2e, 0x66, 0xbd, 0x9d, 0x68, 0x65, 0x1d, 0xc5, 0x44, 0x12, 0xe5, - 0xc7, 0x5e, 0x6b, 0x1f, 0x9d, 0x29, 0x30, 0xc0, 0x2f, 0x87, 0xd1, 0x38, - 0xac, 0x98, 0xc8, 0x81, 0x80, 0x27, 0xc7, 0x97, 0xaf, 0xa3, 0x49, 0x1e, - 0xd3, 0xf4, 0xf1, 0x6f, 0x9f, 0x74, 0x80, 0x9f, 0xe3, 0x46, 0x16, 0x70, - 0xb1, 0xe0, 0x4d, 0xea, 0xb3, 0xe7, 0xb1, 0xbf, 0xf3, 0x74, 0x50, 0x3e, - 0xb4, 0x46, 0x0a, 0x86, 0xd6, 0x4b, 0xad, 0xac, 0xe1, 0xb7, 0x4b, 0x13, - 0x3c, 0x73, 0xc4, 0xcc, 0x3e, 0xac, 0x1a, 0x20, 0x87, 0x6d, 0xa0, 0xc0, - 0xa8, 0x57, 0xdc, 0xc7, 0xf3, 0x9e, 0x4a, 0x3e, 0x36, 0xec, 0xb2, 0x35, - 0xea, 0x52, 0x02, 0x2d, 0xab, 0xa1, 0x94, 0x4d, 0x3d, 0xa4, 0x35, 0xb0, - 0xd2, 0xe2, 0x2a, 0xdb, 0xe2, 0x28, 0xed, 0xe3, 0x35, 0xe8, 0x89, 0x45, - 0x95, 0x30, 0xdb, 0xb5, 0x78, 0x5f, 0x5b, 0xa6, 0x86, 0xa1, 0x81, 0x18, - 0x36, 0x50, 0x81, 0x45, 0x58, 0x93, 0xf4, 0xcb, 0x76, 0xa3, 0xfe, 0x52, - 0xd3, 0x61, 0xdb, 0x93, 0x84, 0xac, 0x10, 0xb4, 0x61, 0xbb, 0xd5, 0x48, - 0x0c, 0x52, 0xaa, 0xb9, 0x1e, 0x07, 0x52, 0x3b, 0x57, 0xc2, 0xcf, 0xea, - 0x1c, 0xad, 0xbf, 0x8c, 0xa2, 0xfd, 0xae, 0x10, 0x79, 0x32, 0xe7, 0x9a, - 0x1a, 0x42, 0xda, 0xb8, 0xbd, 0x1d, 0x1f, 0xac, 0x32, 0x3c, 0x97, 0xcc, - 0xd2, 0x5f, 0xb6, 0x8f, 0x2e, 0xce, 0x13, 0xbe, 0x9c, 0x24, 0x04, 0x52, - 0x4b, 0x88, 0x0d, 0xfe, 0x1d, 0x88, 0xdb, 0x55, 0x7c, 0x05, 0xcf, 0x87, - 0xde, 0x6e, 0x23, 0x48, 0x7f, 0xb4, 0xe4, 0xef, 0x5a, 0x2b, 0x75, 0x2b, - 0x33, 0x94, 0x27, 0xd4, 0x29, 0x1b, 0xb8, 0x56, 0x0b, 0x0e, 0x94, 0x9b, - 0x31, 0x72, 0xb0, 0x99, 0xdc, 0x59, 0xfa, 0x63, 0xfd, 0xb8, 0x4e, 0x13, - 0x4b, 0xe1, 0x1d, 0xa1, 0x10, 0x51, 0x33, 0xbb, 0x4b, 0x1f, 0xb0, 0x33, - 0x49, 0xe3, 0xda, 0x7a, 0xd4, 0xe6, 0xa0, 0x46, 0x03, 0x2e, 0x81, 0x4b, - 0x85, 0x7e, 0x81, 0x32, 0x50, 0x6b, 0x83, 0x36, 0xe2, 0xd0, 0xd8, 0x19, - 0x36, 0xe3, 0x66, 0x49, 0x02, 0x69, 0xaf, 0xc5, 0x6a, 0x6e, 0x86, 0xdc, - 0x14, 0x85, 0x30, 0x62, 0xa4, 0xe0, 0x5b, 0x96, 0x96, 0xbc, 0xce, 0x99, - 0xde, 0x77, 0x40, 0x3b, 0xb4, 0x52, 0x46, 0x8f, 0x14, 0xe8, 0x12, 0xab, - 0x91, 0x56, 0x98, 0xc7, 0xa8, 0xdc, 0x02, 0x3e, 0x1e, 0x76, 0x67, 0x50, - 0xf8, 0x62, 0xf7, 0xbc, 0x86, 0x0d, 0x36, 0x88, 0x2f, 0x73, 0x19, 0x80, - 0xec, 0x9f, 0x54, 0xb3, 0x5b, 0x83, 0x89, 0x48, 0x65, 0x11, 0x62, 0x22, - 0xd2, 0xa7, 0x70, 0x26, 0x0f, 0x76, 0xd1, 0x32, 0x92, 0x6a, 0xa6, 0xc6, - 0x63, 0x74, 0xb0, 0x14, 0xdb, 0x84, 0xcf, 0xea, 0xe0, 0x94, 0x76, 0x18, - 0x4e, 0xd5, 0x58, 0x7b, 0x79, 0x78, 0x1e, 0xd8, 0xc2, 0x49, 0x85, 0x2b, - 0x9a, 0x29, 0x4d, 0x2e, 0xca, 0x0c, 0xc1, 0x3a, 0x73, 0xd7, 0xfa, 0xec, - 0xdf, 0xb8, 0x36, 0x7e, 0x06, 0xc1, 0xf2, 0xb8, 0x0f, 0x6b, 0x4b, 0xa3, - 0xf9, 0x7b, 0xe9, 0xa4, 0x35, 0x8b, 0x42, 0x17, 0xc8, 0x70, 0xb8, 0x75, - 0x89, 0x38, 0x6b, 0xcc, 0xd2, 0x24, 0x4f, 0x8e, 0x68, 0x30, 0x2c, 0xdc, - 0x5c, 0x13, 0xf9, 0x7c, 0xe9, 0x73, 0xba, 0x9a, 0x52, 0x59, 0x90, 0x09, - 0x0e, 0x37, 0x07, 0x6a, 0x37, 0x79, 0x63, 0x1d, 0xb7, 0x92, 0x84, 0xb8, - 0x1d, 0xe2, 0x37, 0xd6, 0x2c, 0xd2, 0xf6, 0x3c, 0x79, 0x14, 0x57, 0xe7, - 0xc0, 0x90, 0x9b, 0xa5, 0x80, 0x79, 0x69, 0xee, 0x9a, 0xc3, 0x6a, 0xcf, - 0x13, 0x64, 0x00, 0xf2, 0x80, 0x83, 0x11, 0x17, 0x2d, 0xb7, 0x13, 0x72, - 0xa2, 0x92, 0x99, 0xba, 0xb5, 0x46, 0x79, 0x76, 0x4b, 0x27, 0x84, 0xdf, - 0x83, 0x30, 0xca, 0x6b, 0x2f, 0x87, 0xdc, 0x4c, 0x59, 0x74, 0x0c, 0x14, - 0xee, 0xb5, 0x69, 0x98, 0x33, 0xbc, 0x6b, 0x4d, 0xa4, 0xf1, 0x87, 0x45, - 0x80, 0xa6, 0x10, 0x06, 0x68, 0x17, 0x28, 0xae, 0x1e, 0xae, 0x80, 0x04, - 0xb7, 0xbc, 0x18, 0x5c, 0x1a, 0x1a, 0x69, 0x03, 0x9a, 0xf7, 0x37, 0xa7, - 0x21, 0x47, 0x16, 0x21, 0x0d, 0xb5, 0xec, 0x79, 0x85, 0x98, 0x44, 0x12, - 0x78, 0x49, 0x54, 0x25, 0x77, 0x3c, 0xbb, 0xfd, 0xea, 0xca, 0x3f, 0xa0, - 0x4e, 0xfb, 0x3e, 0x64, 0x5d, 0x5c, 0x83, 0x57, 0x6a, 0x08, 0x15, 0xa3, - 0xe3, 0xc4, 0xa3, 0xc8, 0xc7, 0x22, 0x5e, 0xf4, 0x50, 0x06, 0x92, 0x75, - 0xdd, 0xe6, 0xed, 0xee, 0x53, 0x6a, 0x54, 0x5d, 0x81, 0xa3, 0x82, 0xf7, - 0x07, 0x19, 0xaa, 0x69, 0x50, 0x43, 0xe6, 0x8f, 0x61, 0x90, 0x74, 0x9b, - 0xd1, 0x12, 0xc8, 0x06, 0x49, 0xe1, 0x4d, 0xb3, 0x12, 0x17, 0xe3, 0x72, - 0xd8, 0x18, 0x1b, 0x25, 0xe4, 0x19, 0x18, 0xdc, 0x20, 0x3a, 0x66, 0x3b, - 0x6b, 0x8b, 0xf2, 0x90, 0xba, 0x5a, 0x87, 0x52, 0x32, 0x3c, 0x55, 0xec, - 0x04, 0x89, 0xbe, 0x56, 0x6d, 0x8c, 0xeb, 0x84, 0x21, 0x5b, 0xcf, 0xa5, - 0x48, 0x48, 0xe9, 0xb6, 0x36, 0x45, 0xaa, 0x28, 0x25, 0x91, 0x5d, 0xe3, - 0x1d, 0xed, 0x03, 0x07, 0x95, 0xf5, 0xda, 0xdb, 0xfb, 0x7b, 0x91, 0xb8, - 0x2c, 0xa1, 0x67, 0x08, 0xc0, 0x4b, 0xdb, 0x64, 0xa3, 0xe0, 0xb1, 0xf0, - 0x95, 0xfd, 0xcf, 0x76, 0x2c, 0x22, 0x8b, 0x33, 0xd8, 0xc3, 0x67, 0x90, - 0xd0, 0xdd, 0xbc, 0x67, 0x90, 0xe8, 0x9e, 0x95, 0xee, 0xc9, 0x3a, 0x34, - 0xeb, 0x8b, 0xc1, 0xd3, 0x8a, 0x79, 0x77, 0x5e, 0x4e, 0x67, 0x0e, 0x1a, - 0xc8, 0x74, 0x82, 0xb7, 0x97, 0xa7, 0x6f, 0xa2, 0x86, 0x2e, 0x20, 0x5a, - 0x68, 0xdb, 0x77, 0xff, 0x8a, 0x52, 0x40, 0x5f, 0x9c, 0x9c, 0x0c, 0xa1, - 0x12, 0xa8, 0xa3, 0xba, 0x11, 0x70, 0x51, 0x0a, 0xf9, 0xb0, 0x58, 0x95, - 0xa7, 0xa4, 0xd2, 0x93, 0x0c, 0x49, 0xbf, 0x97, 0xd9, 0x38, 0x9b, 0x72, - 0x32, 0x21, 0xbf, 0x93, 0x68, 0xa9, 0x78, 0x5c, 0xef, 0x0c, 0x5d, 0x36, - 0x05, 0x57, 0x22, 0x4d, 0xbc, 0x11, 0x30, 0xb3, 0xd0, 0x90, 0x63, 0xc7, - 0x52, 0x14, 0xf1, 0x8a, 0xef, 0x0a, 0x2e, 0x50, 0x39, 0xd1, 0x9b, 0x26, - 0x05, 0xde, 0x37, 0x0b, 0x9a, 0x6a, 0xe3, 0xb8, 0x4d, 0x11, 0xf5, 0xd7, - 0x48, 0xe5, 0xd4, 0x9a, 0x55, 0x35, 0x25, 0x7f, 0x3e, 0xc9, 0x72, 0xb8, - 0xed, 0x02, 0x94, 0x18, 0x40, 0x9b, 0x2d, 0x11, 0x14, 0x03, 0xae, 0xb9, - 0x6a, 0x1e, 0xa5, 0xfb, 0x9b, 0x4c, 0x43, 0x7d, 0x65, 0xa5, 0x99, 0x31, - 0x49, 0x1c, 0x04, 0xdc, 0x73, 0x02, 0x30, 0x22, 0x38, 0x85, 0x8e, 0x93, - 0x04, 0xbb, 0xd1, 0xe6, 0x5e, 0x73, 0x55, 0xe2, 0x24, 0xd3, 0xaa, 0x27, - 0xf6, 0x4d, 0xda, 0x9c, 0xa3, 0xf4, 0x7a, 0x0d, 0xfe, 0x56, 0x9b, 0xd2, - 0xc1, 0xa3, 0x71, 0xfa, 0x46, 0xbb, 0xba, 0xd1, 0x1a, 0x1d, 0x5c, 0xd1, - 0x37, 0x88, 0xda, 0x7e, 0x41, 0x86, 0x97, 0xaf, 0x58, 0x2a, 0xda, 0x86, - 0xa8, 0x1b, 0xb8, 0xf8, 0x4c, 0xd7, 0x78, 0xd7, 0x70, 0x68, 0x3d, 0xa6, - 0x52, 0x54, 0x53, 0xb3, 0x78, 0x4a, 0xff, 0xa3, 0xd2, 0x71, 0x46, 0x23, - 0x55, 0x29, 0xb2, 0x35, 0x84, 0xf3, 0x3b, 0xa4, 0x7d, 0x98, 0x9c, 0x99, - 0xe9, 0x43, 0x21, 0x1a, 0x55, 0x51, 0x4e, 0x32, 0x06, 0x17, 0xb1, 0xa0, - 0xa4, 0xdc, 0x2e, 0xf3, 0xbf, 0xff, 0xa3, 0xe9, 0xa7, 0xfe, 0xf1, 0x27, - 0xd8, 0x87, 0x10, 0x5e, 0xeb, 0x7c, 0x28, 0x46, 0x46, 0x85, 0xc7, 0x16, - 0xe4, 0x1d, 0xe3, 0x5c, 0x16, 0x9d, 0xa1, 0x55, 0x06, 0xaf, 0xab, 0x30, - 0x16, 0x99, 0x66, 0x89, 0x07, 0x3a, 0x3a, 0xbb, 0x08, 0x80, 0xf7, 0x12, - 0xd4, 0xf1, 0x0d, 0x8a, 0x07, 0x48, 0xc4, 0xf4, 0x3a, 0xc4, 0x25, 0x8b, - 0x47, 0x57, 0x30, 0x1f, 0x0b, 0x2b, 0xe7, 0x40, 0x60, 0xb1, 0x9f, 0x63, - 0x06, 0x7c, 0xd1, 0xc0, 0x19, 0x98, 0xce, 0x9b, 0x68, 0x20, 0xb2, 0xd1, - 0x1a, 0xd3, 0xfb, 0x77, 0x3a, 0x65, 0xbd, 0xf2, 0x3e, 0xfb, 0xc7, 0x80, - 0xbd, 0x6a, 0xe0, 0xc4, 0xfd, 0x4c, 0xc0, 0x43, 0xdf, 0x7f, 0xb2, 0xcb, - 0x7a, 0x77, 0xa7, 0x09, 0x99, 0x8a, 0x45, 0xb0, 0x4d, 0x77, 0x51, 0xfa, - 0x6b, 0xc0, 0x47, 0xaa, 0xdd, 0x71, 0x2f, 0x3d, 0xbe, 0x14, 0xfe, 0x31, - 0xe0, 0x7f, 0x7f, 0xdc, 0xed, 0x3f, 0xfb, 0xc9, 0xf5, 0xfa, 0xc9, 0xee, - 0xfb, 0x4f, 0xf6, 0x3a, 0x6d, 0xa8, 0xaa, 0x6c, 0x99, 0x58, 0x1a, 0x12, - 0xa6, 0xe9, 0x73, 0x5a, 0x3b, 0x54, 0x1c, 0x5d, 0x6a, 0xf9, 0xf1, 0x68, - 0x6b, 0x00, 0x7f, 0x6c, 0x71, 0x22, 0xb2, 0xda, 0xd2, 0x9e, 0x69, 0xaf, - 0x10, 0xb6, 0x62, 0x09, 0xf7, 0xa5, 0x00, 0x03, 0xed, 0x56, 0x2b, 0xe3, - 0xc1, 0xb2, 0x8d, 0x60, 0x1b, 0xb5, 0x19, 0x36, 0xcc, 0x93, 0x1c, 0xf4, - 0x33, 0x59, 0xd1, 0xc5, 0x27, 0x60, 0x17, 0x2e, 0xab, 0xd7, 0x44, 0x49, - 0xab, 0x29, 0x2a, 0xf9, 0x43, 0x9b, 0xb1, 0x15, 0x13, 0x8b, 0x90, 0x6a, - 0xb2, 0xd5, 0xa6, 0xd0, 0x78, 0x1d, 0xc2, 0xd3, 0xfc, 0x28, 0x71, 0xf5, - 0x45, 0x95, 0xd8, 0xfd, 0xf9, 0xa9, 0x41, 0x4e, 0xb4, 0x9e, 0x9e, 0xa0, - 0xa9, 0x58, 0x67, 0x14, 0xd4, 0x7a, 0x56, 0x90, 0x59, 0x87, 0xe4, 0x84, - 0xaf, 0xee, 0x81, 0x2b, 0xdd, 0x00, 0x4a, 0x42, 0x2a, 0x96, 0x73, 0xf7, - 0x84, 0x60, 0x5e, 0xe1, 0xcb, 0x2e, 0x5c, 0x43, 0xb2, 0xed, 0x88, 0xa6, - 0x51, 0xcf, 0x68, 0x59, 0x36, 0x93, 0xec, 0x07, 0x5b, 0xad, 0xa1, 0xa6, - 0x06, 0x2a, 0xe5, 0x63, 0x76, 0xa3, 0x20, 0xc8, 0x29, 0x2a, 0x04, 0xb6, - 0x93, 0x01, 0xc4, 0x05, 0xf1, 0x22, 0xf1, 0x86, 0x81, 0x46, 0x30, 0xa7, - 0x16, 0xdb, 0xeb, 0x39, 0x1c, 0x98, 0x64, 0x5a, 0x24, 0x83, 0x7f, 0x2b, - 0xf9, 0x55, 0xb6, 0xa8, 0x1f, 0x37, 0x3c, 0x80, 0x15, 0xf6, 0x2f, 0x61, - 0x1f, 0xd5, 0x2a, 0x7c, 0x52, 0x59, 0xc0, 0x95, 0xb9, 0x73, 0x93, 0x2a, - 0x84, 0x3c, 0x1a, 0x59, 0x12, 0xb1, 0xd9, 0xa5, 0x24, 0x6d, 0xb4, 0x01, - 0x4c, 0x82, 0x14, 0x52, 0xe7, 0x92, 0x80, 0x77, 0x3e, 0x93, 0xe4, 0x2e, - 0x96, 0x6f, 0x9b, 0x60, 0x78, 0xee, 0x26, 0xac, 0xe8, 0xdb, 0x52, 0x4d, - 0x5c, 0x99, 0xdd, 0x18, 0xdc, 0x49, 0x6a, 0x35, 0x54, 0xe7, 0xdb, 0xa2, - 0x81, 0xb9, 0xd2, 0xa2, 0x4b, 0x27, 0x1f, 0x48, 0x46, 0x25, 0xb4, 0xa4, - 0x4e, 0x9f, 0x63, 0x65, 0x3a, 0x02, 0x49, 0x0b, 0xe5, 0x30, 0x68, 0xee, - 0x51, 0xf0, 0xae, 0x17, 0x55, 0xd7, 0x30, 0x5b, 0x8d, 0xa2, 0x97, 0x8b, - 0x9b, 0x9c, 0x64, 0x9a, 0x47, 0x40, 0x08, 0xe8, 0x29, 0x79, 0xc6, 0x31, - 0xda, 0x85, 0x4f, 0xda, 0xff, 0x0d, 0xb3, 0xe1, 0x39, 0xb0, 0xfe, 0xc9, - 0xce, 0x6e, 0xa3, 0x0a, 0x89, 0x2f, 0x3c, 0xae, 0xba, 0x23, 0x2f, 0x31, - 0x2d, 0xce, 0xc5, 0xeb, 0xc3, 0x28, 0xda, 0x7b, 0xbe, 0xfb, 0x7c, 0x7b, - 0x77, 0x67, 0xf0, 0x64, 0xb0, 0x17, 0x39, 0xd3, 0x38, 0xc9, 0xea, 0x5c, - 0xe6, 0x07, 0xa1, 0x35, 0xed, 0xd1, 0x28, 0xac, 0xf0, 0x51, 0x63, 0x1c, - 0x37, 0xe3, 0x3e, 0x81, 0xf1, 0xc5, 0x5f, 0xe1, 0x31, 0x07, 0xce, 0xb8, - 0xc8, 0x0c, 0xb3, 0x7d, 0x37, 0x9c, 0xd5, 0xf3, 0x3e, 0xc6, 0xa1, 0x42, - 0xdf, 0x52, 0xd0, 0x94, 0xa3, 0xe5, 0x28, 0x25, 0xa1, 0xa5, 0xe4, 0x22, - 0x78, 0xac, 0x41, 0x90, 0x28, 0x6b, 0x58, 0x3d, 0x3d, 0x8e, 0x05, 0x74, - 0x55, 0x12, 0xdb, 0x03, 0x14, 0x4d, 0x56, 0x09, 0x0c, 0x17, 0x88, 0x54, - 0x4d, 0x35, 0x17, 0x17, 0xc0, 0x2b, 0x74, 0xe3, 0x4b, 0xd9, 0x99, 0xaf, - 0x5d, 0x36, 0x70, 0xdc, 0x1a, 0xe7, 0x09, 0xac, 0x4e, 0xaf, 0xfd, 0x72, - 0x51, 0x29, 0x0e, 0x39, 0xf2, 0x70, 0x24, 0xfa, 0x81, 0x10, 0xab, 0x88, - 0x82, 0x98, 0x77, 0x1b, 0x74, 0x5a, 0xea, 0x6a, 0x25, 0xf8, 0x1d, 0x57, - 0x34, 0x0f, 0xf6, 0xee, 0x8a, 0x8e, 0x27, 0x46, 0x65, 0x14, 0xc7, 0x7e, - 0x2c, 0xc0, 0xf0, 0x11, 0x9c, 0x39, 0xa1, 0x85, 0xbd, 0xff, 0x2f, 0xd1, - 0xc2, 0xde, 0xff, 0x4f, 0x0b, 0xff, 0x26, 0x5a, 0x78, 0x51, 0xa3, 0x05, - 0xd6, 0xec, 0x88, 0x6f, 0xa9, 0x82, 0xd7, 0x44, 0xe2, 0x11, 0xaa, 0x08, - 0xc8, 0xc2, 0xd7, 0x8f, 0x63, 0xfd, 0x5e, 0x60, 0x42, 0xf4, 0x65, 0x85, - 0x0e, 0x42, 0x45, 0x3b, 0x8d, 0x83, 0x6c, 0x22, 0x69, 0x72, 0xc1, 0x3e, - 0xf6, 0xc3, 0x9f, 0xbb, 0xb7, 0x58, 0x8c, 0xe6, 0xcf, 0x96, 0x62, 0x1c, - 0x49, 0xae, 0xb0, 0x0b, 0xf0, 0xed, 0xf6, 0xf0, 0x25, 0xc2, 0xaf, 0x39, - 0xe3, 0xbe, 0xc1, 0xdf, 0x61, 0x4f, 0x31, 0x9d, 0x1d, 0xed, 0x48, 0xcd, - 0x5f, 0x1b, 0x92, 0x96, 0x68, 0xc8, 0xa3, 0x2e, 0x5d, 0x05, 0x8c, 0xb6, - 0xe1, 0x53, 0x79, 0x5b, 0xca, 0x38, 0x5f, 0xa5, 0x0f, 0xa2, 0xcf, 0xfe, - 0x9c, 0xe4, 0x59, 0x64, 0xfe, 0x26, 0x0d, 0xa5, 0x03, 0x7c, 0x94, 0xa5, - 0xc4, 0xfb, 0x0f, 0xb9, 0xd7, 0x86, 0x88, 0xfa, 0x27, 0xa0, 0xfa, 0x49, - 0xf4, 0x24, 0xc7, 0x84, 0xd9, 0x68, 0x98, 0x06, 0x26, 0x93, 0xd4, 0x84, - 0x3f, 0xbf, 0x70, 0x56, 0x66, 0x0f, 0xae, 0xec, 0xb2, 0xa5, 0xa2, 0x2c, - 0xaf, 0xcc, 0x66, 0xd9, 0x52, 0x34, 0x37, 0xbd, 0x92, 0x6c, 0x0a, 0x19, - 0x8e, 0xcb, 0x0a, 0x6e, 0x08, 0x1d, 0xfd, 0x28, 0x3a, 0x4a, 0xe6, 0x2b, - 0xb3, 0xcd, 0x78, 0x8d, 0x5e, 0x2a, 0x33, 0x41, 0xc6, 0x29, 0xbd, 0xcb, - 0xc3, 0x4c, 0x54, 0x6e, 0x88, 0xcd, 0x21, 0x55, 0xc7, 0x5c, 0xb6, 0xb8, - 0x3e, 0x5e, 0xb9, 0x65, 0xc8, 0x44, 0x98, 0x0b, 0xd7, 0x62, 0x13, 0x00, - 0x00, 0x26, 0xbe, 0xa2, 0x3f, 0x6b, 0xf1, 0xd1, 0x65, 0xd8, 0x82, 0xde, - 0x2b, 0x1e, 0x9c, 0x62, 0x39, 0xfa, 0x2b, 0x58, 0x14, 0x13, 0x26, 0xd7, - 0xad, 0xe1, 0x33, 0x18, 0xa2, 0xde, 0x71, 0xad, 0x83, 0xe5, 0x48, 0x50, - 0x0e, 0xca, 0x66, 0x73, 0xf4, 0x21, 0x04, 0x6b, 0x97, 0x01, 0xaf, 0x74, - 0x16, 0xd8, 0xe9, 0x1a, 0x93, 0x0a, 0xcc, 0x4d, 0x8d, 0x7d, 0xb7, 0xf3, - 0xc4, 0x55, 0x92, 0x0a, 0x35, 0x2c, 0x84, 0x9b, 0xe5, 0x56, 0x53, 0x1c, - 0xd5, 0xce, 0xac, 0xc6, 0x8f, 0xaf, 0x6d, 0x8b, 0xa8, 0xb5, 0xc7, 0xca, - 0x4e, 0xd1, 0xfb, 0x13, 0xff, 0x68, 0xaf, 0x96, 0x5b, 0x49, 0xd0, 0x30, - 0x1b, 0x3c, 0x3f, 0x8e, 0xa3, 0x81, 0xd7, 0xd7, 0x75, 0xf0, 0x8a, 0xbf, - 0x95, 0x1e, 0x1e, 0x6f, 0x1b, 0xda, 0xcc, 0x2f, 0xe8, 0xe0, 0xdd, 0xdc, - 0x22, 0xc1, 0x8c, 0xcc, 0x17, 0x2e, 0x60, 0x93, 0xa4, 0xbc, 0x7c, 0x2e, - 0x06, 0x74, 0x91, 0x48, 0x63, 0xab, 0x1f, 0xc7, 0x79, 0x38, 0xc0, 0xfb, - 0xaa, 0x07, 0x39, 0x30, 0x80, 0xce, 0x14, 0xfc, 0x95, 0xfe, 0xe5, 0xbd, - 0x85, 0x76, 0x6a, 0x71, 0xd1, 0x26, 0x2d, 0x2e, 0xb2, 0x52, 0x22, 0xb4, - 0xd9, 0x6c, 0xc9, 0xd2, 0x6d, 0xce, 0x77, 0x43, 0x0b, 0xc6, 0x91, 0x6d, - 0x84, 0x25, 0xe9, 0x73, 0xb3, 0xdc, 0xe0, 0x72, 0x21, 0x4e, 0x50, 0x49, - 0x58, 0xd0, 0x32, 0x0f, 0xc8, 0x60, 0x30, 0xca, 0x95, 0x9e, 0xeb, 0x86, - 0x29, 0x98, 0x4c, 0x70, 0xd9, 0xb9, 0xf0, 0xee, 0xbb, 0x2c, 0x9d, 0xa0, - 0x04, 0x6e, 0x9e, 0xb7, 0xe0, 0xbf, 0x7f, 0x5c, 0xbc, 0x65, 0x2f, 0xc0, - 0x79, 0x89, 0x8b, 0xd0, 0x3d, 0xd6, 0xb4, 0x0a, 0xbb, 0xf8, 0xdf, 0x58, - 0x42, 0xda, 0x88, 0x88, 0xe7, 0x71, 0x69, 0x47, 0xcc, 0x6f, 0x03, 0x46, - 0x29, 0x29, 0xd7, 0xec, 0xad, 0x1b, 0x27, 0x2d, 0xf8, 0x7e, 0x50, 0x0b, - 0xdb, 0x83, 0xb5, 0x6a, 0x11, 0x92, 0x7b, 0x8d, 0xfb, 0x44, 0x02, 0xbe, - 0x3f, 0x7c, 0xab, 0xb4, 0x5c, 0x2a, 0x7a, 0xa7, 0x04, 0x9c, 0x51, 0x2a, - 0xb2, 0x39, 0xf9, 0x60, 0xd0, 0x12, 0x6f, 0x66, 0x94, 0x2c, 0x21, 0x6c, - 0xf7, 0xe1, 0xdb, 0x39, 0x0c, 0x20, 0x24, 0xca, 0x88, 0x13, 0xe0, 0x17, - 0x4e, 0xe5, 0x61, 0xd5, 0x27, 0x85, 0x8c, 0xcd, 0x6e, 0xad, 0x13, 0xb0, - 0x8d, 0x5e, 0x20, 0x94, 0x87, 0x88, 0x26, 0x95, 0x2c, 0xf5, 0x9a, 0x97, - 0xda, 0x0c, 0xb4, 0x5a, 0x59, 0x77, 0x36, 0x5b, 0xd6, 0x69, 0x71, 0x6e, - 0xb5, 0x7c, 0x45, 0x93, 0x0a, 0x6b, 0xb7, 0x9b, 0xb9, 0xdd, 0xd0, 0x02, - 0x05, 0xc7, 0x5b, 0x12, 0x56, 0x40, 0x5b, 0xac, 0x95, 0xb6, 0xcb, 0x5e, - 0xdb, 0x2e, 0x52, 0x3d, 0x67, 0x8c, 0x87, 0x3e, 0xf1, 0xba, 0x45, 0x2d, - 0x61, 0xe5, 0x49, 0xdb, 0x94, 0x81, 0xa8, 0xf9, 0xe8, 0x84, 0xb9, 0xf3, - 0xb5, 0xf1, 0xcc, 0x51, 0x38, 0x53, 0x9b, 0xd9, 0x3a, 0xeb, 0x93, 0x4c, - 0x52, 0xe7, 0xf8, 0x4e, 0xdc, 0x9c, 0x68, 0x13, 0xca, 0x22, 0xb3, 0x19, - 0x5e, 0x96, 0xa0, 0x2f, 0x51, 0x35, 0x1b, 0x13, 0x86, 0x0e, 0x2f, 0x29, - 0x17, 0xf2, 0x9c, 0x1e, 0x07, 0x8f, 0x68, 0x51, 0x1f, 0xa4, 0xee, 0x0a, - 0xe6, 0xd4, 0xb4, 0xa1, 0x16, 0xd2, 0x11, 0x0f, 0x2c, 0xad, 0x86, 0xfa, - 0xc8, 0x1a, 0x4d, 0x60, 0xcc, 0x7d, 0x84, 0xac, 0xc3, 0x55, 0x12, 0xcb, - 0x6f, 0x7d, 0x04, 0x52, 0xd3, 0xf7, 0x9f, 0x5c, 0x24, 0xe9, 0xbf, 0x65, - 0x95, 0xb4, 0xaf, 0xd6, 0x4c, 0x86, 0x70, 0x99, 0x1a, 0x33, 0x5a, 0x17, - 0xc2, 0xb4, 0x66, 0xe7, 0xd7, 0x05, 0x31, 0xd5, 0xa7, 0xd5, 0x16, 0x6a, - 0xda, 0x3e, 0x31, 0x85, 0xfe, 0xf2, 0x03, 0x51, 0xee, 0xeb, 0xe6, 0x87, - 0x8e, 0xeb, 0xde, 0x40, 0xf7, 0xb0, 0xa6, 0x36, 0x55, 0x48, 0xe1, 0x51, - 0x2d, 0xc8, 0x99, 0xc8, 0x3f, 0x86, 0x39, 0xc9, 0x9c, 0xd9, 0x28, 0xff, - 0x6b, 0xee, 0x22, 0xdc, 0x41, 0x95, 0x3d, 0x44, 0x17, 0x95, 0xa9, 0xb4, - 0xf8, 0xc3, 0x1a, 0x9b, 0xb7, 0x3b, 0xd8, 0x01, 0xb7, 0x7d, 0x58, 0xc1, - 0x04, 0xba, 0xcf, 0x77, 0xd7, 0x4f, 0x9f, 0x37, 0x0a, 0x59, 0xb8, 0xc2, - 0xcf, 0x1e, 0x03, 0x56, 0x4a, 0xa7, 0xf0, 0xfb, 0x36, 0x32, 0x43, 0xae, - 0xf2, 0x49, 0x7f, 0x1a, 0x4e, 0xb4, 0x1e, 0xd4, 0x2f, 0x2d, 0x03, 0x4c, - 0x3f, 0xce, 0xcb, 0xc3, 0xcb, 0xbb, 0x3b, 0x9f, 0xed, 0xb4, 0xe6, 0x2e, - 0x43, 0x84, 0x08, 0x0a, 0xd2, 0x39, 0xc4, 0x4d, 0x11, 0x4d, 0xb5, 0x2a, - 0x6e, 0x62, 0x83, 0x53, 0xe7, 0x47, 0x6b, 0x60, 0xc6, 0x66, 0xff, 0x61, - 0x5b, 0xd7, 0x80, 0xe5, 0xc2, 0x54, 0x03, 0xaa, 0xd5, 0x25, 0xee, 0xb2, - 0x15, 0x0f, 0xcf, 0xde, 0xbe, 0x3d, 0x3e, 0x24, 0x55, 0xec, 0x26, 0x87, - 0xe0, 0xe8, 0xdc, 0x98, 0x6d, 0x66, 0x51, 0x5f, 0x6a, 0x43, 0x06, 0xc0, - 0x8b, 0x13, 0x48, 0xf0, 0xce, 0x19, 0x50, 0xe3, 0x2f, 0x2d, 0xc4, 0xb9, - 0x3b, 0xd8, 0x0d, 0xb6, 0x6a, 0x61, 0x23, 0x2d, 0x39, 0xd1, 0x70, 0xda, - 0x1a, 0x3f, 0x65, 0x7d, 0xca, 0x9c, 0xcd, 0xe0, 0x53, 0x9d, 0x65, 0x23, - 0x01, 0x0f, 0x97, 0x41, 0x8b, 0xbe, 0x6c, 0x2d, 0x99, 0x72, 0x86, 0x64, - 0x17, 0x59, 0x19, 0xcd, 0x5e, 0xc3, 0x40, 0x22, 0xb7, 0x2c, 0x0a, 0x3d, - 0xd6, 0xb2, 0x30, 0x61, 0x01, 0x9d, 0x59, 0x02, 0x09, 0x4c, 0xf4, 0xce, - 0xb4, 0xd4, 0xa2, 0x99, 0x00, 0xd1, 0x86, 0x7d, 0xd7, 0xc5, 0xad, 0x2b, - 0xe8, 0x3f, 0xf5, 0xd2, 0xb8, 0xef, 0xa8, 0xd7, 0x78, 0x41, 0x1d, 0x21, - 0x57, 0xa7, 0x10, 0x80, 0x5d, 0x77, 0x50, 0x2a, 0xdb, 0x6e, 0x5b, 0xe7, - 0x52, 0x9d, 0x5a, 0xb2, 0x08, 0x9c, 0x13, 0xcb, 0x25, 0x81, 0xc8, 0xcb, - 0x2a, 0x53, 0x6a, 0x56, 0x91, 0x86, 0xb1, 0x58, 0x64, 0xac, 0x32, 0x8a, - 0x96, 0xc2, 0xd3, 0x4a, 0xf5, 0x12, 0xd8, 0x14, 0xcf, 0x85, 0x8c, 0x74, - 0xad, 0x1c, 0x05, 0x65, 0x95, 0x43, 0xb8, 0x1c, 0x3d, 0x02, 0x40, 0xca, - 0x76, 0x3f, 0x71, 0x24, 0x3e, 0x8a, 0x3d, 0xea, 0x42, 0xe3, 0x2c, 0xc6, - 0x70, 0x4d, 0x75, 0x83, 0x7f, 0x3b, 0xf6, 0xe8, 0xf9, 0xb6, 0xd6, 0x56, - 0x47, 0x3e, 0xf1, 0xba, 0xfc, 0x9c, 0xd7, 0x5a, 0x0a, 0x19, 0xfe, 0xe1, - 0xa2, 0x76, 0x3a, 0xb4, 0xf8, 0x69, 0x96, 0x6f, 0x43, 0xc0, 0xe3, 0x12, - 0x7c, 0x79, 0x36, 0x35, 0xe8, 0xec, 0x16, 0xd0, 0x43, 0x04, 0x1c, 0xd9, - 0x55, 0x41, 0x4d, 0xab, 0x2d, 0x44, 0x9d, 0xb3, 0x33, 0x9f, 0x46, 0x29, - 0xa2, 0xa3, 0x16, 0x5a, 0xb5, 0xca, 0xe7, 0x27, 0xf3, 0x06, 0x70, 0x1f, - 0x3f, 0x01, 0x78, 0x3d, 0xe5, 0xeb, 0x38, 0x6e, 0x82, 0xa7, 0xad, 0x4c, - 0xd1, 0x95, 0x80, 0x35, 0x42, 0x61, 0x60, 0x3b, 0xa5, 0x96, 0x06, 0xaa, - 0x37, 0xa7, 0x38, 0x75, 0x8b, 0x80, 0x93, 0x5a, 0x1e, 0x92, 0x40, 0x8a, - 0xe4, 0xa5, 0x61, 0x40, 0x54, 0x0a, 0xd6, 0xc6, 0xc5, 0x6d, 0xb1, 0x16, - 0x9a, 0xbb, 0x1a, 0xed, 0x4d, 0xa3, 0x0b, 0x90, 0xfb, 0xad, 0x55, 0x81, - 0xdc, 0x2a, 0xc3, 0x51, 0x32, 0x25, 0x56, 0x9b, 0x73, 0x5b, 0xd4, 0x80, - 0x23, 0x6d, 0x28, 0xac, 0x0e, 0xc0, 0xbf, 0x5d, 0xf3, 0x4b, 0x07, 0x49, - 0xd4, 0x61, 0x68, 0xff, 0x4e, 0x98, 0xf6, 0x25, 0xda, 0x88, 0x7b, 0x95, - 0x2b, 0x71, 0xd0, 0x50, 0xdd, 0x58, 0x5b, 0x5c, 0x14, 0xc6, 0x5e, 0xd5, - 0xb2, 0xcf, 0x5b, 0xb6, 0xf9, 0x6e, 0x9e, 0x3e, 0xe0, 0x2a, 0x68, 0xe2, - 0x05, 0xbb, 0x79, 0x3f, 0x32, 0xaa, 0xdd, 0x17, 0x7b, 0x83, 0xdd, 0xe7, - 0x9f, 0x0d, 0x76, 0x77, 0x06, 0xbb, 0x95, 0xd1, 0x41, 0x41, 0xe2, 0x90, - 0xbf, 0xb0, 0x9d, 0x96, 0x4b, 0xb4, 0x2d, 0x76, 0x25, 0xec, 0x60, 0xb6, - 0x1a, 0x04, 0x91, 0xeb, 0x8d, 0x2e, 0x34, 0xba, 0xbd, 0xc5, 0xcc, 0xe2, - 0xfc, 0xd0, 0x4a, 0x6a, 0xd0, 0x0e, 0x9c, 0x6a, 0x16, 0x6c, 0xaa, 0x84, - 0x37, 0x7a, 0xe3, 0x4f, 0x4b, 0x25, 0xa4, 0x20, 0x4d, 0xaa, 0x52, 0x78, - 0xda, 0x45, 0xe4, 0xb9, 0xfe, 0xff, 0x85, 0xe3, 0xae, 0x68, 0x34, 0x1c, - 0xf8, 0xe6, 0x8e, 0x21, 0xf4, 0x18, 0x17, 0x1d, 0x0b, 0xbe, 0x7f, 0x7e, - 0x76, 0x71, 0xa9, 0x09, 0xda, 0xc2, 0x0e, 0xe2, 0xe2, 0x6e, 0xe0, 0xa2, - 0xe5, 0x10, 0x9d, 0xab, 0x97, 0x4b, 0xe9, 0xa0, 0x3a, 0xac, 0xb9, 0xe3, - 0xf3, 0x0b, 0x8f, 0xa2, 0x10, 0xdc, 0xa1, 0x68, 0xd3, 0x65, 0x0c, 0xb3, - 0x58, 0x8b, 0xd6, 0xfa, 0xa4, 0xb2, 0x71, 0x8e, 0x08, 0x5e, 0x83, 0x9d, - 0x97, 0x56, 0x68, 0xea, 0xc1, 0x2d, 0xf8, 0xb5, 0x3f, 0xfd, 0xc9, 0xb3, - 0xa8, 0x21, 0xa7, 0xb4, 0x69, 0x45, 0x44, 0xd8, 0x38, 0x9f, 0x79, 0xf7, - 0xba, 0x00, 0xc0, 0x44, 0x9d, 0xfd, 0x1f, 0x91, 0xf8, 0xf6, 0x53, 0xff, - 0x47, 0xfa, 0xf3, 0xa7, 0x8e, 0xbb, 0x06, 0xa0, 0x50, 0x89, 0x67, 0xd1, - 0x4d, 0x5e, 0x36, 0x08, 0x35, 0x63, 0x51, 0x7f, 0x54, 0xae, 0x02, 0xde, - 0x2e, 0x8e, 0x87, 0xc4, 0x41, 0x14, 0x8c, 0x04, 0x0f, 0xa8, 0x13, 0x1b, - 0x76, 0x8a, 0x14, 0x29, 0x23, 0x4a, 0x71, 0x6b, 0x89, 0x74, 0xc0, 0xd8, - 0x20, 0x10, 0xf0, 0x62, 0xcf, 0x70, 0xc7, 0xd8, 0x49, 0x7a, 0x2f, 0x6c, - 0x27, 0x36, 0x88, 0x15, 0xb9, 0x7f, 0x18, 0x5a, 0x53, 0x5d, 0xb8, 0xf2, - 0xc1, 0x86, 0x4b, 0x09, 0xe7, 0x7c, 0x2c, 0x52, 0xf1, 0xb9, 0xa4, 0x94, - 0x1a, 0x92, 0x10, 0x3c, 0x96, 0xb8, 0x80, 0xd9, 0x74, 0xce, 0x7e, 0x65, - 0xb3, 0x3e, 0xe5, 0x69, 0x71, 0xcb, 0x33, 0x54, 0xd0, 0x82, 0x48, 0x90, - 0x35, 0x36, 0x02, 0x45, 0x1f, 0x23, 0xb3, 0xbc, 0x5a, 0x8e, 0xd7, 0x37, - 0x3b, 0x67, 0x70, 0x0b, 0xfc, 0xcd, 0xc8, 0x4c, 0xcb, 0x0e, 0xa9, 0x7f, - 0x52, 0xd0, 0xf9, 0x3c, 0x5c, 0x69, 0x36, 0xaf, 0x14, 0xcb, 0x10, 0x94, - 0x2b, 0x83, 0x72, 0x6b, 0xe4, 0x53, 0x85, 0xc0, 0x84, 0x2e, 0x15, 0x08, - 0x41, 0x0b, 0xf1, 0xc4, 0x90, 0x0a, 0x35, 0xaf, 0x1d, 0xb4, 0x18, 0x42, - 0x65, 0xb6, 0x60, 0x50, 0x58, 0x06, 0x92, 0x0e, 0xa2, 0x0d, 0xfe, 0xb0, - 0x48, 0xe2, 0x9c, 0xb8, 0x17, 0xbb, 0x8a, 0x83, 0xc9, 0xfd, 0x2f, 0x6a, - 0x16, 0x40, 0xa9, 0x0c, 0xec, 0x8b, 0x91, 0xb7, 0xdd, 0x6f, 0xdb, 0x43, - 0xb9, 0xe4, 0x38, 0xcc, 0x1c, 0x2c, 0x3a, 0xce, 0x47, 0x69, 0x99, 0xc7, - 0x1a, 0x65, 0xaf, 0x08, 0x21, 0x81, 0x70, 0xa1, 0x65, 0x3c, 0x86, 0xeb, - 0x50, 0x42, 0x06, 0xd1, 0xff, 0x42, 0xa7, 0xfa, 0xb6, 0xd8, 0x2b, 0x90, - 0x9a, 0xfa, 0xe5, 0xf1, 0xeb, 0xb3, 0x8b, 0xe3, 0x6a, 0x42, 0xa7, 0x80, - 0x07, 0x44, 0x6d, 0x35, 0xc9, 0x36, 0x51, 0x3a, 0x59, 0x8d, 0x25, 0x56, - 0xaa, 0x4d, 0x80, 0x08, 0xce, 0xbf, 0x3b, 0x0a, 0x4e, 0x9e, 0xc1, 0xac, - 0x58, 0xa3, 0xbd, 0x56, 0xaf, 0x2e, 0xf8, 0xe7, 0x16, 0x8a, 0x61, 0x0b, - 0xba, 0x83, 0x8d, 0x4f, 0xe0, 0x73, 0x50, 0xc8, 0xcb, 0x0c, 0x33, 0x08, - 0xe4, 0x2c, 0x0a, 0x76, 0x4a, 0xb8, 0x46, 0x5b, 0x60, 0x73, 0x89, 0xd9, - 0x4b, 0xed, 0x4b, 0x35, 0x71, 0xc4, 0x12, 0x98, 0xc0, 0xd1, 0x0a, 0x83, - 0xa8, 0xd9, 0x91, 0xc2, 0xac, 0x48, 0x2f, 0x8d, 0x92, 0x34, 0x82, 0xc3, - 0xc6, 0x9e, 0x5d, 0xf1, 0x60, 0x9b, 0xc2, 0xa0, 0x58, 0x3b, 0x51, 0x08, - 0x6e, 0x23, 0x55, 0xa5, 0xad, 0x06, 0x40, 0xcb, 0xed, 0xeb, 0xd6, 0x57, - 0x3b, 0xdf, 0x2c, 0xb6, 0x2a, 0xd5, 0xb6, 0x6d, 0xf1, 0xac, 0xa8, 0xe3, - 0x9f, 0xba, 0xde, 0x12, 0xdf, 0x82, 0xb8, 0xe3, 0xc0, 0xd0, 0x2d, 0x05, - 0x6f, 0x6b, 0xe0, 0x3c, 0xfe, 0xed, 0x55, 0xfc, 0xdc, 0xac, 0x01, 0x17, - 0xd1, 0x5a, 0xce, 0x5b, 0x05, 0x04, 0x03, 0x9a, 0xb4, 0x93, 0x6c, 0xd0, - 0x89, 0x1a, 0x18, 0x61, 0xed, 0x28, 0xe0, 0x71, 0x1b, 0xd8, 0x93, 0x4f, - 0x2a, 0x75, 0xf5, 0x2b, 0x47, 0x0a, 0xdd, 0xfe, 0x83, 0x79, 0xc6, 0x91, - 0xf8, 0x1e, 0x15, 0xab, 0x79, 0x09, 0xa1, 0x49, 0x92, 0x0a, 0xc7, 0x59, - 0x9e, 0x37, 0x8d, 0x8e, 0x28, 0x76, 0xe5, 0x36, 0x0d, 0x19, 0x15, 0x17, - 0xaf, 0x0f, 0x5f, 0x3c, 0x7b, 0x01, 0xd1, 0x0f, 0x65, 0xd5, 0x34, 0x1f, - 0x4d, 0xa3, 0x0d, 0x11, 0xc6, 0xe9, 0x87, 0xdc, 0x60, 0x07, 0xda, 0x92, - 0x9a, 0x01, 0x47, 0xc9, 0x54, 0xf0, 0x29, 0x86, 0x41, 0x13, 0x83, 0x56, - 0xd3, 0x69, 0xdb, 0xed, 0xb9, 0xae, 0x3a, 0xb0, 0xdd, 0x1a, 0x18, 0x7d, - 0x2a, 0xb1, 0x6f, 0x5a, 0x5d, 0xd4, 0xd4, 0x25, 0xd2, 0xd0, 0xe7, 0xd0, - 0x66, 0x74, 0x13, 0x7b, 0x8e, 0xea, 0x5c, 0xd5, 0xd6, 0xa2, 0xad, 0xb9, - 0xbf, 0x55, 0xcf, 0x73, 0xad, 0xf2, 0x04, 0x0e, 0x40, 0xa5, 0xda, 0xf8, - 0x00, 0x1e, 0x05, 0xd6, 0x03, 0xda, 0x0c, 0x25, 0x6a, 0xc4, 0x32, 0x67, - 0x0c, 0x87, 0x33, 0x78, 0xf2, 0x6a, 0xe9, 0xaf, 0x59, 0xbb, 0xf9, 0xe6, - 0x3a, 0x5f, 0x48, 0xc2, 0x63, 0x1b, 0x40, 0x6d, 0x18, 0x07, 0x23, 0x8f, - 0x1a, 0xb1, 0xa3, 0xe6, 0x06, 0xac, 0x16, 0x78, 0xf7, 0xe4, 0xc8, 0xd5, - 0x39, 0xf7, 0xd1, 0x3c, 0xa3, 0x55, 0x7b, 0x73, 0xee, 0x31, 0x10, 0x9b, - 0x67, 0x8a, 0xae, 0x29, 0x2f, 0x35, 0x8f, 0x2c, 0x51, 0x1e, 0xdf, 0xb5, - 0x37, 0xa7, 0xad, 0x88, 0x32, 0x29, 0x6d, 0x58, 0xc3, 0x08, 0x54, 0xb5, - 0x4a, 0x73, 0xbc, 0x31, 0x9c, 0xe8, 0x6d, 0xdd, 0x34, 0x6b, 0x16, 0xde, - 0x90, 0x10, 0x2e, 0x82, 0xf8, 0x07, 0xd7, 0x62, 0x06, 0xd3, 0xa0, 0x61, - 0x35, 0xaa, 0x7b, 0xad, 0x08, 0xeb, 0x9f, 0xa3, 0x9d, 0x51, 0x2a, 0xe0, - 0x55, 0x4d, 0x52, 0xae, 0x5b, 0x49, 0x44, 0x49, 0x43, 0xf3, 0x78, 0x33, - 0x9c, 0xc2, 0x3c, 0xca, 0xc6, 0x65, 0x30, 0x03, 0x7e, 0xa0, 0xbd, 0x39, - 0x15, 0x0d, 0x9a, 0x33, 0x63, 0x3f, 0x0b, 0xd2, 0x98, 0x1e, 0x9f, 0x99, - 0x3c, 0xd8, 0xd8, 0x64, 0xfa, 0x50, 0x58, 0x51, 0x63, 0x87, 0xd7, 0xcf, - 0xac, 0x6d, 0x87, 0x31, 0x82, 0xfa, 0x06, 0xfb, 0x14, 0x2b, 0x3c, 0xde, - 0x6f, 0x6f, 0xce, 0xed, 0x30, 0x9e, 0x7c, 0x74, 0x83, 0xb5, 0x97, 0xc6, - 0x2a, 0x4c, 0xe7, 0x0a, 0x8d, 0xf9, 0x5e, 0x10, 0x02, 0x38, 0xef, 0xbf, - 0x7c, 0xff, 0xf8, 0x82, 0x4c, 0xe7, 0x06, 0xa5, 0xc5, 0xc9, 0xed, 0xfe, - 0xe0, 0x6a, 0x5c, 0x5e, 0x5c, 0x05, 0xd9, 0x8a, 0xc4, 0xbc, 0xb0, 0x86, - 0xec, 0x7d, 0x7f, 0x1e, 0x7b, 0x69, 0x91, 0xa5, 0x92, 0x8b, 0xaf, 0x68, - 0x41, 0x51, 0x65, 0x88, 0x51, 0x1b, 0x46, 0x4f, 0x10, 0x4b, 0xdc, 0x98, - 0xe2, 0xec, 0x96, 0x1d, 0x2b, 0xee, 0x76, 0x7b, 0xbf, 0x5e, 0x87, 0x01, - 0x1d, 0xcb, 0xe3, 0x9e, 0x8e, 0x65, 0x56, 0x4e, 0x39, 0x77, 0x19, 0xe7, - 0x1f, 0xde, 0xed, 0x6a, 0x97, 0xee, 0x4c, 0xd6, 0xc7, 0xb7, 0xb8, 0x9f, - 0x58, 0xe7, 0xfc, 0xab, 0x75, 0x1c, 0x02, 0x24, 0xc7, 0xa3, 0x22, 0x9b, - 0x2e, 0x4b, 0x89, 0xd6, 0x93, 0xc6, 0xae, 0x4c, 0x40, 0x5c, 0xb3, 0x14, - 0x88, 0x4f, 0xb5, 0xbb, 0x7d, 0x7d, 0x52, 0x75, 0x2e, 0x88, 0xea, 0x06, - 0x18, 0x86, 0xed, 0x58, 0xbf, 0x38, 0xfa, 0xb4, 0x1f, 0xa2, 0x00, 0x7e, - 0x7b, 0xe6, 0x95, 0xb7, 0x2c, 0xd0, 0x7a, 0x86, 0xa7, 0xbd, 0xd6, 0x0e, - 0xc4, 0x24, 0x61, 0xcc, 0x3d, 0x25, 0x05, 0x8e, 0x4e, 0xd4, 0xfa, 0xf0, - 0xca, 0xf7, 0x1e, 0x23, 0xa4, 0xb5, 0x6b, 0x9c, 0xcf, 0x3e, 0x70, 0xc8, - 0xe9, 0x01, 0x3f, 0x2b, 0x86, 0x06, 0x0b, 0x66, 0xd5, 0x38, 0x99, 0x7a, - 0x8c, 0xd7, 0xac, 0xfc, 0xba, 0x11, 0x54, 0xa8, 0xf0, 0xb1, 0x91, 0xf0, - 0x83, 0x6d, 0x83, 0x09, 0x80, 0xfc, 0xd8, 0x09, 0xbf, 0x0a, 0x38, 0x65, - 0x7b, 0x73, 0x3a, 0x5c, 0xff, 0x9e, 0x2e, 0x4f, 0xcf, 0xcc, 0x66, 0x13, - 0x35, 0x43, 0xb3, 0x06, 0xda, 0xa4, 0x0d, 0x3b, 0xe0, 0xbf, 0x88, 0x41, - 0xb0, 0xda, 0x31, 0x9d, 0x57, 0x62, 0x2b, 0xa9, 0xc7, 0x6c, 0x06, 0x0c, - 0x98, 0xf6, 0x18, 0x72, 0x49, 0x21, 0x0b, 0x91, 0xfe, 0xdd, 0xb6, 0x0b, - 0x5a, 0x80, 0xa0, 0x0d, 0x5b, 0xb9, 0xd4, 0xfb, 0x10, 0xd5, 0xae, 0xc5, - 0x0c, 0x66, 0x25, 0xc0, 0x62, 0xa0, 0xda, 0x51, 0xd7, 0x48, 0x5e, 0x14, - 0x46, 0x29, 0x59, 0x90, 0x85, 0xe9, 0x63, 0x62, 0x3c, 0x72, 0xa2, 0xb0, - 0x3c, 0xde, 0x28, 0x55, 0xc3, 0x59, 0x1b, 0x52, 0xb0, 0xb4, 0x5a, 0x05, - 0x6d, 0x50, 0x2f, 0x53, 0xdb, 0x4f, 0xae, 0x27, 0x7d, 0x25, 0x8e, 0x2a, - 0x2b, 0xea, 0xe7, 0xdb, 0x58, 0x08, 0x52, 0x7f, 0x5f, 0xe2, 0xc7, 0xe7, - 0x6b, 0x6b, 0x2f, 0x0e, 0x7d, 0x01, 0xc6, 0xe8, 0x42, 0x42, 0x7f, 0x98, - 0xa7, 0x32, 0x06, 0x8e, 0x2a, 0xd0, 0x9b, 0x6c, 0x6b, 0x91, 0x5a, 0xbd, - 0x82, 0x8e, 0x3f, 0x5e, 0xb6, 0x95, 0x66, 0xd8, 0xb2, 0xda, 0x82, 0x68, - 0x7a, 0x77, 0xb0, 0xdb, 0x33, 0xdd, 0x4a, 0xa5, 0x38, 0x93, 0x90, 0xf9, - 0x93, 0x58, 0x53, 0x7a, 0x22, 0xd4, 0x4f, 0xac, 0x5b, 0xc7, 0x2e, 0x24, - 0xe4, 0x55, 0xc5, 0xc6, 0xb0, 0xbc, 0x26, 0x57, 0x09, 0x74, 0x42, 0x39, - 0x23, 0xd9, 0x34, 0xa8, 0x68, 0xa7, 0xff, 0xf4, 0xc5, 0x8b, 0xca, 0xbd, - 0x1e, 0x2a, 0xc1, 0xcf, 0x76, 0x76, 0x04, 0xde, 0xa7, 0xfe, 0x1a, 0x7d, - 0xd1, 0x7f, 0x81, 0x17, 0xab, 0xaf, 0x09, 0x08, 0xcc, 0xfa, 0xf7, 0xfa, - 0xfc, 0x4d, 0x4b, 0x77, 0xb0, 0xe0, 0xac, 0x7d, 0xeb, 0x05, 0x77, 0xd7, - 0xf2, 0x16, 0x1e, 0x96, 0x75, 0xcc, 0xae, 0xae, 0xb8, 0x74, 0x35, 0x3f, - 0x29, 0x18, 0xe0, 0x59, 0x7e, 0x1f, 0xe7, 0x93, 0xe6, 0x74, 0x77, 0x7a, - 0xfd, 0xdd, 0x75, 0xd3, 0x75, 0x75, 0x26, 0xb1, 0x9d, 0xac, 0x09, 0x6d, - 0xfe, 0x71, 0x6b, 0xf3, 0xeb, 0xad, 0xb6, 0xd9, 0x7f, 0xba, 0xb3, 0xd3, - 0x7b, 0xce, 0x3f, 0x5f, 0xbc, 0x58, 0x1b, 0x63, 0xe2, 0xfb, 0x78, 0x62, - 0x53, 0xab, 0x8c, 0x96, 0xda, 0x69, 0x69, 0x7d, 0x97, 0x5a, 0xdd, 0x7d, - 0xf1, 0xa2, 0xc7, 0xbd, 0x3c, 0xfb, 0xa8, 0xd6, 0xcb, 0xfb, 0xcc, 0x9b, - 0xce, 0xf9, 0x75, 0x4f, 0x8e, 0x45, 0x6d, 0x06, 0xf4, 0x27, 0xa2, 0x98, - 0x18, 0xf5, 0x28, 0x32, 0xef, 0x82, 0x96, 0xa1, 0x54, 0x1f, 0x7c, 0x80, - 0xdb, 0x88, 0x40, 0xbf, 0x05, 0xf2, 0xf0, 0xa0, 0x29, 0x8a, 0xfa, 0x11, - 0x7b, 0xff, 0x82, 0xf9, 0xe3, 0x3d, 0xa2, 0xf6, 0x99, 0xb8, 0xc2, 0xae, - 0x19, 0x71, 0xc9, 0xb2, 0xf4, 0x8a, 0x68, 0x93, 0xc8, 0x65, 0x0b, 0xb6, - 0x80, 0xbb, 0x78, 0x9a, 0x1a, 0x92, 0x43, 0xd4, 0x85, 0x01, 0x4b, 0x50, - 0x39, 0xe8, 0xf7, 0x6c, 0xd1, 0x45, 0xbd, 0x9c, 0xe9, 0xc4, 0x69, 0x22, - 0xe6, 0x95, 0x92, 0x27, 0xfb, 0xf2, 0x8c, 0x1c, 0x34, 0xa8, 0x73, 0x0f, - 0x03, 0xc1, 0x23, 0x64, 0xef, 0x50, 0xad, 0xd7, 0xc8, 0x01, 0x23, 0x79, - 0x44, 0x5f, 0x81, 0xc2, 0x85, 0xb9, 0xca, 0x4f, 0xb3, 0x5b, 0x04, 0x08, - 0x78, 0xe6, 0x30, 0x98, 0x07, 0xde, 0xc0, 0x49, 0x62, 0x30, 0xcb, 0x35, - 0x1c, 0x18, 0xf7, 0xbe, 0xd8, 0x63, 0x96, 0xa2, 0x88, 0xfa, 0x43, 0xf6, - 0x03, 0x2c, 0x67, 0x9a, 0xbb, 0x25, 0xa9, 0x13, 0xac, 0x9f, 0xde, 0xc7, - 0x79, 0x62, 0x59, 0xa7, 0xa4, 0x37, 0x1b, 0x07, 0x70, 0x40, 0xab, 0x9a, - 0x39, 0xa9, 0xc9, 0xe3, 0x1e, 0x0b, 0xc1, 0x10, 0xad, 0x25, 0x58, 0x69, - 0x82, 0x78, 0x50, 0x4d, 0xb2, 0x65, 0xdb, 0x3f, 0xec, 0x74, 0x15, 0x77, - 0x98, 0xa1, 0xad, 0x9b, 0x85, 0x4e, 0x70, 0xe0, 0x36, 0x6a, 0x2e, 0x30, - 0x7e, 0x0a, 0xc9, 0xb0, 0x40, 0x69, 0x72, 0x25, 0x5c, 0xdd, 0x2c, 0xc0, - 0x8e, 0x78, 0x8b, 0xc0, 0x98, 0x64, 0xf1, 0x0d, 0x02, 0x4b, 0x0b, 0x46, - 0x5b, 0x74, 0x91, 0x40, 0xd4, 0x01, 0xf0, 0xa5, 0xb2, 0x63, 0xb4, 0x57, - 0x8e, 0x09, 0xd2, 0xa6, 0x45, 0x9b, 0x41, 0xd8, 0x22, 0x68, 0x2b, 0xd0, - 0xf9, 0x0d, 0x51, 0x35, 0x93, 0x18, 0xbc, 0xad, 0x81, 0x0c, 0x00, 0x46, - 0x5b, 0xd9, 0x09, 0x00, 0xf2, 0x84, 0x5b, 0x9a, 0x3c, 0x94, 0x80, 0xc4, - 0xc6, 0x93, 0x76, 0x39, 0x0f, 0x4f, 0xfe, 0xf7, 0xf1, 0xe0, 0xd7, 0xb0, - 0x26, 0xd7, 0x23, 0xcf, 0xf3, 0xf8, 0xde, 0xa3, 0x43, 0xa8, 0xb7, 0xd8, - 0x05, 0xbe, 0xc5, 0xd3, 0xa9, 0xaf, 0x73, 0x0f, 0xbf, 0x1f, 0x09, 0xfb, - 0x99, 0xa1, 0xc5, 0xbb, 0x1a, 0xf6, 0x6b, 0xd1, 0xc5, 0x39, 0xc3, 0x6f, - 0x82, 0x0a, 0xce, 0xa1, 0x61, 0xd9, 0x81, 0xbe, 0xcc, 0xe0, 0x7e, 0xb1, - 0x8a, 0x52, 0x4b, 0xea, 0x04, 0xa5, 0xda, 0xea, 0xf6, 0x29, 0x1a, 0x62, - 0x03, 0x8c, 0x3d, 0x8c, 0x8b, 0xb9, 0xf0, 0x29, 0x0d, 0x3c, 0xf3, 0x35, - 0xc8, 0x17, 0x08, 0x44, 0x15, 0x17, 0x76, 0x58, 0xda, 0xd6, 0xec, 0x06, - 0x81, 0x71, 0x1c, 0xc4, 0x8f, 0xac, 0x9b, 0x36, 0x73, 0x14, 0xaf, 0x6d, - 0x19, 0xcf, 0x16, 0x2d, 0xe9, 0x2e, 0x92, 0x99, 0x6b, 0x08, 0x49, 0xac, - 0x1c, 0xf9, 0x80, 0x54, 0x74, 0xd6, 0x6c, 0x2e, 0xc8, 0xc1, 0x11, 0xca, - 0xa5, 0x17, 0xe1, 0x88, 0x70, 0xfd, 0x54, 0x73, 0x47, 0x58, 0x16, 0x03, - 0x66, 0x70, 0xd3, 0x9d, 0xc8, 0x67, 0x03, 0x2b, 0x9f, 0x02, 0x33, 0x10, - 0x51, 0x6d, 0x3c, 0x08, 0x91, 0xee, 0x13, 0x8d, 0x70, 0x92, 0x48, 0x11, - 0x84, 0x55, 0x72, 0x68, 0x94, 0x56, 0x6c, 0x8d, 0xd7, 0xec, 0xa0, 0x07, - 0xe5, 0x94, 0xae, 0xb1, 0x7e, 0xfe, 0x16, 0x96, 0x54, 0x18, 0xb3, 0xdd, - 0x11, 0x7f, 0x82, 0x75, 0x6f, 0xb9, 0x18, 0x34, 0xb1, 0x8c, 0x83, 0x6a, - 0x42, 0xfa, 0x3e, 0x75, 0xbf, 0x13, 0xba, 0x0a, 0xc1, 0x28, 0x34, 0x04, - 0xd9, 0xd5, 0x6e, 0x49, 0x8b, 0xd6, 0xda, 0x1f, 0x30, 0x1c, 0xb3, 0x05, - 0xd4, 0xcd, 0x57, 0xa6, 0x2b, 0x36, 0x7e, 0xc9, 0x62, 0xde, 0xe7, 0x72, - 0x6c, 0x82, 0x6b, 0xd6, 0xf3, 0x80, 0xd1, 0xd1, 0xd3, 0x87, 0x87, 0x86, - 0x62, 0x12, 0x40, 0xe8, 0x4a, 0xf1, 0x31, 0x21, 0xf6, 0x67, 0x0f, 0x0f, - 0xd5, 0x2f, 0xd7, 0xc0, 0xaa, 0x88, 0x23, 0x89, 0xf7, 0x7b, 0x94, 0x49, - 0x72, 0x95, 0xac, 0x56, 0xdc, 0xb2, 0x8e, 0x72, 0x39, 0xdf, 0xc7, 0x88, - 0xba, 0x6d, 0x7a, 0x1a, 0x21, 0x71, 0xb8, 0x2a, 0x39, 0x96, 0xe5, 0xc3, - 0x89, 0xb7, 0x37, 0xc4, 0x0a, 0x04, 0x0c, 0x55, 0x83, 0x62, 0xb5, 0x41, - 0x2b, 0x59, 0xd4, 0xb2, 0x4e, 0xdc, 0x8b, 0x2c, 0x7b, 0x0a, 0xd4, 0xd1, - 0x32, 0x9d, 0xf2, 0x6b, 0xc0, 0xe0, 0xa4, 0x16, 0x76, 0x69, 0xf9, 0xd3, - 0xf9, 0xb2, 0x4c, 0x0a, 0x57, 0x2f, 0x3b, 0xa8, 0x35, 0xd7, 0xb6, 0xec, - 0x53, 0xe0, 0x05, 0x49, 0x38, 0x48, 0xbd, 0xa0, 0x97, 0x8e, 0x4b, 0x21, - 0x17, 0x14, 0x69, 0x46, 0x49, 0xb6, 0x8f, 0x57, 0x5b, 0x92, 0x89, 0x22, - 0x17, 0x18, 0xaa, 0x47, 0x33, 0x79, 0xa0, 0xd5, 0x96, 0x08, 0xd1, 0x08, - 0x1e, 0x5e, 0x92, 0x2e, 0xf8, 0xb6, 0xb9, 0xce, 0x72, 0xda, 0xd4, 0xd9, - 0x20, 0xc8, 0xdc, 0x6b, 0x44, 0x19, 0x4a, 0x57, 0x0e, 0xeb, 0x8f, 0xcb, - 0x88, 0x38, 0x88, 0xdc, 0x32, 0x2b, 0x95, 0x31, 0x6a, 0x2c, 0x2b, 0x73, - 0x1d, 0xc4, 0x2f, 0xd9, 0xb8, 0x1f, 0x8b, 0xca, 0xdf, 0x1b, 0x3c, 0x69, - 0x2b, 0x9b, 0x5a, 0xc1, 0x24, 0x89, 0x02, 0x61, 0xdf, 0x59, 0x36, 0x1f, - 0x29, 0x9e, 0xda, 0x58, 0xdc, 0x31, 0x07, 0x17, 0x84, 0xd5, 0x53, 0x6b, - 0xe7, 0x5e, 0x16, 0xf1, 0x11, 0x08, 0x43, 0xc3, 0x79, 0x2e, 0xa6, 0x49, - 0xb2, 0x90, 0xb1, 0x39, 0x64, 0x60, 0x2b, 0x9e, 0x2b, 0x27, 0x15, 0x61, - 0xf8, 0x4a, 0xa4, 0x7a, 0xdf, 0xae, 0xe3, 0x00, 0x11, 0xec, 0xf8, 0x30, - 0x69, 0x5b, 0x65, 0xbb, 0x76, 0x4e, 0xb3, 0x29, 0xe2, 0x8a, 0x25, 0xac, - 0xad, 0x29, 0x75, 0x65, 0x5b, 0x8a, 0xe1, 0xb8, 0x6d, 0x75, 0x44, 0xa5, - 0x9b, 0x51, 0xab, 0x7c, 0xdb, 0x2c, 0x1b, 0x21, 0x40, 0xf7, 0xb8, 0x9a, - 0x12, 0x81, 0xcd, 0x47, 0x05, 0x5c, 0x99, 0x11, 0x7c, 0xb6, 0x8a, 0x68, - 0x35, 0x70, 0xbc, 0x47, 0x0a, 0xa2, 0x60, 0x09, 0x1b, 0xb1, 0xcb, 0x48, - 0x28, 0xa8, 0xa1, 0x65, 0x9b, 0xf4, 0xe8, 0x22, 0x88, 0x1c, 0x35, 0xf2, - 0xd8, 0x07, 0x9e, 0x44, 0x9a, 0x35, 0x16, 0xfe, 0x5d, 0x14, 0xa3, 0x15, - 0x90, 0x8a, 0x47, 0xa9, 0xe6, 0x83, 0xd8, 0x97, 0x97, 0x7a, 0x78, 0x25, - 0xb3, 0x51, 0xaf, 0x0c, 0x96, 0xe8, 0x43, 0xa7, 0x4c, 0xa4, 0x8c, 0x2b, - 0xa0, 0x0b, 0xbd, 0x31, 0x1b, 0x0a, 0x9c, 0xf2, 0x27, 0xe3, 0x23, 0xc8, - 0x57, 0x8d, 0x59, 0x42, 0xe1, 0x42, 0x94, 0x9b, 0x9c, 0x80, 0xae, 0x43, - 0xdb, 0xe2, 0x8f, 0x01, 0x38, 0xa6, 0xce, 0x4a, 0xf4, 0xdf, 0x48, 0x9f, - 0x04, 0xc2, 0xa0, 0xf0, 0xac, 0x49, 0x0b, 0x42, 0xe8, 0xdb, 0x8c, 0x23, - 0x47, 0xf4, 0xca, 0xbd, 0xf2, 0xed, 0xe8, 0x9b, 0x4d, 0x1c, 0x41, 0xb4, - 0x63, 0x29, 0x32, 0xd4, 0x44, 0xaf, 0x82, 0x60, 0x6d, 0xc3, 0x46, 0xcc, - 0x13, 0xfc, 0x4a, 0x12, 0x27, 0x22, 0x17, 0x65, 0x8b, 0x17, 0x00, 0xac, - 0x9d, 0xbd, 0x47, 0x70, 0xbe, 0xf1, 0x74, 0x5a, 0xd0, 0x4c, 0xb1, 0x01, - 0xd4, 0x46, 0xca, 0x50, 0x69, 0x97, 0xc6, 0x98, 0x9a, 0x89, 0x4a, 0x9a, - 0x13, 0xac, 0x83, 0xe9, 0x16, 0x61, 0xe5, 0x98, 0x94, 0x51, 0x36, 0x44, - 0x72, 0xac, 0x80, 0x9a, 0x0e, 0xa4, 0x56, 0x40, 0xd9, 0xc4, 0x19, 0xf3, - 0x79, 0xcc, 0x20, 0xf0, 0x52, 0x24, 0x71, 0xc3, 0xfa, 0x74, 0x0c, 0xfb, - 0x63, 0x58, 0x5d, 0x4d, 0xdc, 0x5c, 0x47, 0xb5, 0xba, 0xac, 0x4c, 0xb7, - 0xff, 0x3c, 0xe1, 0x16, 0x5c, 0x3e, 0x84, 0x0b, 0x30, 0xd6, 0x37, 0x6f, - 0x88, 0x0f, 0xc5, 0x8a, 0xf0, 0xb7, 0x65, 0xca, 0x24, 0x2a, 0x11, 0x45, - 0x47, 0x80, 0x61, 0x2f, 0x34, 0xb8, 0xfc, 0x1a, 0xe1, 0x1b, 0xea, 0xef, - 0xce, 0x9d, 0x64, 0xd0, 0x80, 0xa3, 0x05, 0x92, 0xd2, 0xc0, 0x50, 0x43, - 0x01, 0x78, 0x39, 0x5b, 0x86, 0xd8, 0x69, 0xfd, 0x21, 0x8f, 0x84, 0x5a, - 0xed, 0xa3, 0x8d, 0xb6, 0xbb, 0xdf, 0x63, 0x76, 0xf6, 0xa5, 0xc8, 0x8c, - 0x97, 0x67, 0x30, 0x1c, 0xc8, 0x1d, 0x32, 0x02, 0x03, 0x6f, 0x12, 0xdc, - 0x98, 0x06, 0x94, 0x3c, 0x73, 0xd8, 0x4a, 0x24, 0x33, 0xd7, 0x11, 0x2f, - 0x9e, 0x46, 0x2f, 0x3f, 0x10, 0x33, 0xaa, 0x65, 0x4d, 0xd4, 0x4c, 0x32, - 0x3c, 0x3b, 0xfc, 0x66, 0xf8, 0xf4, 0x83, 0xc1, 0xa2, 0xeb, 0xab, 0xbb, - 0x3e, 0x1a, 0x2e, 0xfa, 0x48, 0x39, 0x85, 0x96, 0xac, 0x09, 0x2e, 0x2c, - 0x93, 0xd3, 0xa5, 0x56, 0xc0, 0xa1, 0xca, 0xc0, 0xb7, 0x69, 0xb6, 0x74, - 0x88, 0x4d, 0x91, 0x8f, 0x9a, 0xec, 0x39, 0xb0, 0xb7, 0x55, 0x23, 0x83, - 0x2c, 0xe1, 0x3d, 0x11, 0xfc, 0xb6, 0xe4, 0x61, 0x3c, 0x5d, 0x16, 0xe9, - 0xdd, 0x6f, 0x5a, 0xc8, 0x5b, 0x56, 0x3d, 0xfe, 0xa7, 0x96, 0x3d, 0xfe, - 0xb8, 0x75, 0x6f, 0x30, 0x91, 0x5f, 0xb8, 0xee, 0x6d, 0x45, 0xdc, 0xff, - 0xef, 0x58, 0xf7, 0x67, 0x7d, 0x07, 0x1f, 0xf4, 0xf2, 0x97, 0x86, 0x4a, - 0x63, 0x0b, 0x9e, 0x69, 0x68, 0xe9, 0x26, 0xac, 0x5f, 0x49, 0x18, 0x6d, - 0xca, 0xa5, 0x4a, 0xa6, 0x77, 0xc9, 0x1a, 0x0c, 0x23, 0x98, 0x80, 0xb7, - 0x3e, 0x78, 0x62, 0xdc, 0x4e, 0x89, 0x5f, 0x5a, 0xf6, 0xaa, 0xbe, 0x76, - 0xff, 0xc4, 0xce, 0x39, 0x89, 0xc0, 0xef, 0x5d, 0xeb, 0xe6, 0x85, 0x7b, - 0x27, 0x97, 0xe6, 0xff, 0xd4, 0xce, 0xd5, 0xa4, 0xe5, 0xea, 0x2c, 0x50, - 0x40, 0xc1, 0xc6, 0x2e, 0x25, 0x7b, 0xe9, 0x5e, 0x9c, 0xa2, 0x8a, 0x8e, - 0xc3, 0xe9, 0x71, 0x01, 0x44, 0x4d, 0xd4, 0x3a, 0x25, 0x87, 0x4a, 0x85, - 0x56, 0xdd, 0x0d, 0x57, 0x30, 0x6c, 0xab, 0x41, 0x3c, 0xff, 0xcc, 0x99, - 0x35, 0x82, 0xe1, 0xc8, 0x40, 0x80, 0x48, 0x19, 0x99, 0x08, 0x7d, 0x81, - 0x34, 0xda, 0x42, 0x11, 0xa1, 0xb7, 0x03, 0xd4, 0xd2, 0xaa, 0xc3, 0x7c, - 0x90, 0x64, 0x2a, 0x87, 0xbb, 0x05, 0xc2, 0x73, 0x5d, 0x44, 0xfe, 0xff, - 0x91, 0x07, 0xbb, 0x8d, 0x3c, 0x2c, 0x28, 0xfe, 0xa3, 0x89, 0xc3, 0x85, - 0xb2, 0xfd, 0x4b, 0xe4, 0xd1, 0x76, 0xce, 0x36, 0x35, 0x3e, 0x8f, 0x97, - 0xc9, 0x78, 0xfe, 0x96, 0x2f, 0x97, 0x08, 0x54, 0x4d, 0xdc, 0xea, 0x27, - 0xe7, 0xdf, 0x3e, 0x87, 0x33, 0x63, 0xd8, 0x04, 0xc5, 0x39, 0x3d, 0x3a, - 0x38, 0x6f, 0x61, 0x61, 0xd7, 0x74, 0xcb, 0x2f, 0xd2, 0x3e, 0xdb, 0x3f, - 0x59, 0x30, 0x7d, 0xa9, 0xbf, 0x30, 0x11, 0xb5, 0x89, 0xde, 0xa6, 0x5f, - 0xd8, 0xf3, 0xe0, 0x7e, 0x8a, 0xa7, 0x81, 0x59, 0xaa, 0xf9, 0x9a, 0xc5, - 0xf2, 0xf1, 0x6c, 0xb2, 0x2d, 0x7f, 0xf6, 0xaf, 0xfe, 0x36, 0x99, 0x0f, - 0x1e, 0xa1, 0x95, 0xb8, 0x12, 0xbc, 0xae, 0x05, 0x64, 0xd2, 0x66, 0xbe, - 0xac, 0xab, 0x6b, 0x57, 0x37, 0xcd, 0xbb, 0x53, 0x15, 0x69, 0x2a, 0x0e, - 0xa0, 0x57, 0xd6, 0xcd, 0x92, 0x3f, 0x9d, 0x44, 0x0a, 0xea, 0x16, 0x35, - 0x13, 0x1e, 0xf0, 0xfd, 0xb6, 0x6f, 0xe9, 0x5f, 0xeb, 0xcd, 0xda, 0xe3, - 0xb0, 0xd3, 0xb6, 0xe6, 0x64, 0x14, 0x22, 0x2b, 0xd7, 0x9e, 0x14, 0xad, - 0x5f, 0x8a, 0x56, 0xa2, 0xba, 0xa9, 0xbf, 0x22, 0xfa, 0x8a, 0x49, 0xd8, - 0x80, 0x23, 0x10, 0xc8, 0xe9, 0x72, 0x6c, 0x99, 0x29, 0xe9, 0x7c, 0xbc, - 0x88, 0x25, 0x79, 0xbd, 0xbe, 0x05, 0x8f, 0xe3, 0xcb, 0x55, 0x67, 0x33, - 0x4f, 0xea, 0xf1, 0x96, 0x07, 0x45, 0x05, 0x49, 0x47, 0x9e, 0x8b, 0x2c, - 0xe3, 0x0a, 0xdb, 0x8a, 0x10, 0x28, 0x2d, 0x7d, 0x85, 0x48, 0x15, 0xdc, - 0x44, 0xf2, 0x48, 0x23, 0xff, 0xbe, 0x74, 0x00, 0x84, 0x51, 0x7e, 0x35, - 0xde, 0x7d, 0xf1, 0x7c, 0x97, 0xa5, 0xde, 0x55, 0x21, 0x30, 0x55, 0x85, - 0x36, 0xf3, 0x74, 0xf0, 0x64, 0xfb, 0xe9, 0xe0, 0x69, 0xe4, 0xb1, 0xd9, - 0x47, 0x49, 0x6b, 0x4a, 0x6e, 0x32, 0x46, 0x3a, 0xff, 0x48, 0x8f, 0xdc, - 0xdb, 0xe3, 0x43, 0xab, 0x1a, 0x8b, 0x24, 0xd5, 0x2a, 0x2c, 0xa5, 0x56, - 0x35, 0xe5, 0xc5, 0x93, 0x52, 0x08, 0xed, 0xa8, 0xde, 0xad, 0xcb, 0xe2, - 0xf3, 0x8d, 0x11, 0xb6, 0x32, 0xd7, 0x39, 0xd3, 0xba, 0x12, 0xcb, 0xba, - 0xd1, 0xf2, 0x67, 0x2d, 0x91, 0x78, 0xf5, 0xb5, 0x09, 0x56, 0x6e, 0xf0, - 0x81, 0x9d, 0x29, 0x27, 0xc4, 0x5b, 0xdb, 0x9d, 0xc6, 0x17, 0xae, 0xda, - 0x11, 0x31, 0x0c, 0x14, 0x9f, 0x2f, 0x14, 0x80, 0x89, 0x5f, 0xb1, 0x78, - 0xb1, 0x4a, 0x24, 0x91, 0xd9, 0xba, 0xd7, 0x86, 0x0c, 0x06, 0x70, 0x46, - 0x02, 0xe7, 0x07, 0x70, 0xfd, 0x6e, 0xbf, 0x6b, 0x57, 0x85, 0x19, 0xcb, - 0x83, 0x0a, 0xb2, 0x86, 0xf8, 0xb4, 0xfe, 0xd0, 0x6b, 0x51, 0x0e, 0x44, - 0xb5, 0x88, 0x5d, 0x87, 0x9d, 0x24, 0x0e, 0x06, 0x8d, 0x38, 0xca, 0x0d, - 0x33, 0x3d, 0xb5, 0xe2, 0x4c, 0x92, 0x71, 0x53, 0xc7, 0x72, 0x40, 0x1f, - 0xf4, 0xfc, 0x38, 0x5e, 0xc4, 0xa3, 0x74, 0x9a, 0x96, 0x69, 0x4b, 0x78, - 0xde, 0xaf, 0x28, 0xfb, 0x95, 0xe3, 0x45, 0x7f, 0x9e, 0xb5, 0xd9, 0x08, - 0x2f, 0xb9, 0xec, 0x49, 0x00, 0x76, 0xfb, 0xfe, 0xed, 0xd9, 0xd1, 0xf1, - 0xe9, 0xc1, 0x0f, 0xe6, 0xf5, 0x76, 0xa1, 0xc7, 0xa8, 0x1d, 0x9b, 0xc4, - 0xc5, 0xea, 0x7d, 0x91, 0x94, 0xf4, 0xe5, 0xe6, 0x93, 0x2d, 0xf6, 0x47, - 0xd5, 0xaf, 0x59, 0x56, 0xbf, 0xc2, 0x5a, 0x08, 0x6a, 0xb0, 0xf5, 0xf3, - 0xa8, 0x91, 0xc9, 0x6e, 0xc5, 0xd1, 0x50, 0xd2, 0xfd, 0x5a, 0x26, 0xd3, - 0x79, 0x52, 0x2a, 0xf0, 0x7d, 0xf4, 0xf2, 0xec, 0xfc, 0xf2, 0xd5, 0x5d, - 0x3c, 0xad, 0x93, 0x0c, 0x03, 0x09, 0x69, 0x8b, 0x85, 0x51, 0x88, 0xbc, - 0x19, 0x84, 0x30, 0x0e, 0x5d, 0xac, 0xa0, 0x3d, 0xd9, 0x06, 0x56, 0x71, - 0x79, 0xf9, 0xc3, 0xf9, 0xf1, 0xab, 0x97, 0xac, 0x32, 0x7f, 0xce, 0x8a, - 0xbe, 0x9a, 0x4a, 0xa0, 0x41, 0xf3, 0x3a, 0xaf, 0x16, 0xcd, 0xeb, 0xfb, - 0xfb, 0xa3, 0x93, 0xe1, 0xf9, 0xe9, 0xd9, 0xe1, 0xab, 0x97, 0xdf, 0xb3, - 0x81, 0x95, 0x0b, 0x6a, 0x04, 0xef, 0xba, 0xcf, 0x5c, 0x1c, 0x54, 0x13, - 0x09, 0xf8, 0xf8, 0xbb, 0xf7, 0xc7, 0x6f, 0xbf, 0x7d, 0xf5, 0xf2, 0x2e, - 0xce, 0x7b, 0x3c, 0x3f, 0x79, 0x9b, 0x13, 0x9a, 0x5b, 0xea, 0x2e, 0x54, - 0xf6, 0x92, 0x73, 0x0f, 0x46, 0xd3, 0x5b, 0xa9, 0xc1, 0x83, 0xc2, 0x37, - 0x8d, 0x00, 0x84, 0x4b, 0xc4, 0x69, 0xb3, 0xd1, 0x82, 0x7f, 0x8b, 0xbe, - 0x3c, 0xfd, 0x86, 0xdd, 0x5b, 0xee, 0x6e, 0x46, 0x94, 0x2b, 0x91, 0xc9, - 0xe7, 0xcf, 0x76, 0xf7, 0xb6, 0x82, 0x92, 0x1a, 0xec, 0x24, 0xa7, 0x11, - 0xdf, 0x36, 0x8c, 0x26, 0x3f, 0x1b, 0xe2, 0xac, 0x07, 0xbb, 0xd6, 0x5a, - 0xe2, 0x7c, 0x03, 0x08, 0xb0, 0x74, 0x1e, 0xcf, 0xb9, 0x90, 0x22, 0x42, - 0x94, 0x38, 0x32, 0xa3, 0x04, 0x82, 0x08, 0x3b, 0xb0, 0x1b, 0x79, 0xb8, - 0x97, 0x3e, 0x9a, 0x75, 0xc0, 0xc6, 0x6c, 0xbb, 0xa1, 0x69, 0x38, 0xea, - 0xf7, 0x6e, 0x27, 0xe4, 0x5f, 0xfb, 0x60, 0xb4, 0x27, 0xc1, 0x87, 0xb0, - 0x56, 0x97, 0x8c, 0xce, 0xbe, 0x60, 0xd7, 0xe5, 0x23, 0x31, 0x2f, 0x58, - 0x3f, 0x8f, 0x73, 0x5c, 0x65, 0x56, 0x81, 0xff, 0x49, 0xc9, 0xd4, 0x21, - 0xae, 0xbd, 0xbb, 0x38, 0x5d, 0xc3, 0xbe, 0x5c, 0x4d, 0x79, 0x8f, 0xfd, - 0x66, 0xd5, 0xe1, 0x5d, 0xc3, 0xc0, 0x59, 0x3b, 0x74, 0xfb, 0x11, 0x5b, - 0xfd, 0xed, 0x47, 0x1c, 0x60, 0x92, 0x75, 0x07, 0x67, 0xbe, 0xab, 0xbb, - 0x03, 0x5a, 0x10, 0xd4, 0x5d, 0x9a, 0x42, 0x8a, 0x24, 0xdc, 0x6d, 0x63, - 0x08, 0xbc, 0x7e, 0x1b, 0x6b, 0x02, 0xe1, 0x22, 0x71, 0xc3, 0x28, 0x96, - 0x4c, 0x26, 0xc8, 0xd3, 0x18, 0x8f, 0x65, 0x21, 0x56, 0x67, 0xa1, 0x48, - 0x34, 0x1b, 0x2d, 0x50, 0x86, 0x42, 0x50, 0x37, 0x1c, 0x9f, 0x54, 0xba, - 0x8a, 0xdc, 0xd8, 0xbb, 0x6a, 0x04, 0x9a, 0x11, 0x69, 0xe0, 0x11, 0xac, - 0x0b, 0x12, 0x1a, 0x67, 0xe4, 0x93, 0x52, 0xc4, 0xe8, 0xcc, 0x5a, 0x06, - 0x87, 0x33, 0x4f, 0x57, 0x41, 0xd8, 0x82, 0x6c, 0x6c, 0x10, 0x12, 0xde, - 0x30, 0x5b, 0xb3, 0xc9, 0x68, 0xe0, 0xe8, 0xcd, 0x08, 0x0d, 0x52, 0x02, - 0xfb, 0xaf, 0x36, 0x87, 0x5b, 0x4a, 0xc6, 0x42, 0x6e, 0xe7, 0xef, 0x7c, - 0x92, 0x4f, 0x5b, 0xf5, 0xa9, 0x75, 0x04, 0xe8, 0xd4, 0x6d, 0xbf, 0x50, - 0x9d, 0x7e, 0x87, 0x41, 0x0c, 0xd5, 0x5e, 0x09, 0x08, 0x43, 0x3b, 0x6e, - 0x74, 0x4b, 0x71, 0x99, 0x18, 0x9f, 0x44, 0x14, 0xb7, 0xe2, 0xf0, 0x49, - 0xbc, 0x6d, 0x74, 0x30, 0x85, 0x77, 0x99, 0x78, 0xe3, 0xaa, 0x57, 0xef, - 0x63, 0xd0, 0x89, 0x2a, 0x48, 0x89, 0x62, 0x3f, 0xdd, 0x6a, 0x60, 0x8a, - 0xae, 0x30, 0xf4, 0xd0, 0x16, 0x10, 0xe6, 0xc3, 0xf2, 0x50, 0x6b, 0x43, - 0x43, 0x80, 0x05, 0x58, 0x49, 0x33, 0x1f, 0x1c, 0x72, 0x03, 0x52, 0x71, - 0xa5, 0x68, 0x0b, 0xa7, 0xba, 0xc0, 0x95, 0xe5, 0x42, 0x98, 0x14, 0x2d, - 0x5f, 0xec, 0xc2, 0xda, 0x26, 0x84, 0xb0, 0x36, 0xdc, 0x11, 0xd9, 0xc4, - 0x96, 0x45, 0xb5, 0x2a, 0x8e, 0x96, 0x73, 0xc0, 0x6c, 0xa0, 0x7f, 0xe9, - 0x41, 0xf8, 0x18, 0x42, 0xaf, 0x25, 0x59, 0x47, 0x81, 0x9d, 0xfb, 0x97, - 0x0d, 0x48, 0x23, 0x7e, 0x61, 0x11, 0xa7, 0x79, 0x10, 0x4a, 0x83, 0xf0, - 0x35, 0x9e, 0xbb, 0x50, 0x92, 0x06, 0x3e, 0x42, 0xea, 0x1d, 0x08, 0x69, - 0xc3, 0x4f, 0xb2, 0xb6, 0xa4, 0x44, 0xe7, 0x7a, 0x9a, 0x8d, 0x46, 0x34, - 0xa9, 0x8e, 0x49, 0xa4, 0x34, 0xc2, 0x38, 0xbf, 0x86, 0x92, 0xd6, 0x33, - 0xbc, 0x2b, 0x7f, 0x58, 0x01, 0x97, 0x8a, 0xbe, 0xd6, 0x45, 0xfa, 0x6b, - 0x1d, 0xb1, 0xcc, 0xe3, 0x5f, 0x03, 0xc8, 0x34, 0xac, 0x49, 0x29, 0xee, - 0x6f, 0x7c, 0x1e, 0x59, 0xff, 0x75, 0x8e, 0x5f, 0xae, 0x38, 0x56, 0xd2, - 0x5d, 0x9f, 0xca, 0x7c, 0xc0, 0x72, 0x14, 0xc3, 0x32, 0x6d, 0x09, 0xb6, - 0xe7, 0x09, 0xd3, 0x04, 0x3a, 0x7f, 0xe7, 0x51, 0xec, 0xf6, 0xf8, 0xdf, - 0xbd, 0x7f, 0x74, 0x0c, 0xa9, 0x94, 0xb1, 0xa2, 0x65, 0xf0, 0x25, 0xa3, - 0x43, 0x16, 0x06, 0x8f, 0xda, 0x82, 0x86, 0xca, 0x15, 0xbc, 0xd6, 0xb6, - 0x9e, 0xce, 0xae, 0x7f, 0xdc, 0xed, 0xef, 0xee, 0xec, 0xec, 0xfc, 0x34, - 0x58, 0xf0, 0xd2, 0x5d, 0xa1, 0x79, 0xfa, 0x77, 0xb0, 0x48, 0xc7, 0x1c, - 0xf2, 0x42, 0x9b, 0x99, 0xc6, 0xdc, 0xf4, 0xb6, 0xf4, 0xb7, 0x1d, 0x5e, - 0x9f, 0x39, 0x27, 0xef, 0xb4, 0xf2, 0x71, 0x07, 0x48, 0x4d, 0x47, 0xe2, - 0x6a, 0xa9, 0xe0, 0xf5, 0x2c, 0x77, 0x4f, 0x96, 0x12, 0x8d, 0x20, 0xd1, - 0x1a, 0xea, 0x26, 0xe6, 0xcd, 0x26, 0x52, 0x95, 0x62, 0x60, 0x7c, 0xe3, - 0xf5, 0x5a, 0x2b, 0x17, 0xe3, 0xdb, 0x44, 0x50, 0x7d, 0x38, 0x0f, 0x36, - 0xa8, 0xde, 0xd2, 0x73, 0x89, 0x01, 0x38, 0xb0, 0x4a, 0xf7, 0x72, 0x6e, - 0x9b, 0x40, 0xc3, 0x7c, 0xcc, 0x48, 0xfa, 0xe4, 0xaf, 0x8d, 0xcb, 0xb9, - 0x7a, 0x11, 0x56, 0xbd, 0x22, 0x91, 0xfc, 0xd2, 0x3a, 0x72, 0x69, 0x9b, - 0x82, 0xee, 0x4d, 0x1d, 0xa1, 0x99, 0x03, 0xc1, 0xfc, 0xfd, 0x3b, 0x81, - 0x34, 0x1e, 0x65, 0x05, 0xbc, 0xf5, 0xba, 0x68, 0x0d, 0xe5, 0xa7, 0x18, - 0xa7, 0xe9, 0x6f, 0x2a, 0xb5, 0xa2, 0x57, 0x74, 0xf3, 0xf8, 0x86, 0xc5, - 0xb2, 0x5d, 0xb2, 0x5b, 0xe1, 0x66, 0xf9, 0xdd, 0x12, 0x73, 0x87, 0xdb, - 0xaf, 0xff, 0x83, 0x36, 0x8c, 0xab, 0x1b, 0x36, 0xaa, 0x3d, 0x61, 0xaa, - 0xa2, 0x28, 0x4e, 0x93, 0x98, 0x83, 0x8a, 0xcd, 0x4c, 0x73, 0x93, 0x3c, - 0x88, 0xc0, 0xd0, 0x84, 0x09, 0x10, 0x9f, 0x2e, 0x7b, 0x4d, 0x54, 0xef, - 0x3b, 0x18, 0x1e, 0x9e, 0x9c, 0x54, 0x14, 0x62, 0x5e, 0xbc, 0x01, 0x43, - 0xa0, 0x8b, 0x9b, 0xa5, 0x98, 0xd1, 0x2a, 0xb2, 0x93, 0x07, 0xc3, 0x6d, - 0xc8, 0x29, 0x1c, 0x92, 0x86, 0xf4, 0x51, 0x46, 0x20, 0x8f, 0x8b, 0xd4, - 0x62, 0x00, 0x63, 0xc9, 0xfd, 0x5a, 0xce, 0x59, 0xa2, 0xe0, 0xc0, 0x98, - 0x9b, 0x25, 0x1d, 0xc9, 0xe2, 0x23, 0x4d, 0x6f, 0x1f, 0x4b, 0x8f, 0xbf, - 0x3d, 0xe9, 0xb5, 0x04, 0x3b, 0x9d, 0xe7, 0x1a, 0x53, 0x26, 0xa1, 0x2f, - 0x91, 0x44, 0x2a, 0x31, 0x6e, 0x39, 0xdf, 0x1a, 0x42, 0x81, 0x19, 0x8a, - 0x09, 0x61, 0xb4, 0xb8, 0x52, 0x0c, 0x40, 0xab, 0x05, 0x69, 0x47, 0xf5, - 0x84, 0xa2, 0x8e, 0x9b, 0xff, 0xb4, 0x22, 0x85, 0x5a, 0x8d, 0xa0, 0xe8, - 0x25, 0xff, 0xbb, 0x6f, 0x05, 0x7a, 0xd6, 0x95, 0xde, 0x74, 0x99, 0x28, - 0xcd, 0x92, 0x3e, 0x21, 0xb0, 0xaf, 0x5c, 0xb7, 0x8f, 0x83, 0xb9, 0x0f, - 0xa2, 0x33, 0xb7, 0x2f, 0xbe, 0x28, 0x20, 0xda, 0xac, 0x57, 0x28, 0x5b, - 0x07, 0xec, 0x8e, 0xf4, 0xc3, 0xeb, 0x54, 0x09, 0xdf, 0x8f, 0x6b, 0xd3, - 0x8c, 0x8b, 0x6c, 0x8f, 0xcc, 0x45, 0x7b, 0xa6, 0x9b, 0x78, 0x9a, 0xcd, - 0xb7, 0x5a, 0x97, 0x0a, 0x5b, 0x45, 0x82, 0x26, 0xc7, 0x90, 0x89, 0xf5, - 0xce, 0x15, 0x05, 0x6c, 0x8b, 0x03, 0x40, 0xf0, 0x0b, 0xe4, 0x5a, 0x2e, - 0xe9, 0x71, 0x7e, 0xd2, 0xd7, 0x30, 0x48, 0x45, 0xde, 0x97, 0x6c, 0x37, - 0x01, 0xb6, 0xaf, 0xe3, 0xda, 0xb4, 0x2d, 0x84, 0xcf, 0xa7, 0x16, 0xd4, - 0xe8, 0x0a, 0xf4, 0xd5, 0x72, 0x51, 0x9b, 0x9b, 0x70, 0x1b, 0x1b, 0x5f, - 0x5d, 0xa8, 0x44, 0xe2, 0xb3, 0x60, 0x5c, 0x84, 0xca, 0xde, 0x48, 0xab, - 0xe0, 0xb9, 0x34, 0x49, 0xb5, 0x28, 0xc8, 0x35, 0x8e, 0x95, 0x69, 0x83, - 0x35, 0x0a, 0x48, 0x7e, 0x9f, 0x78, 0xce, 0x32, 0xda, 0xef, 0xfc, 0x86, - 0x27, 0xe3, 0x9d, 0x59, 0xc0, 0x7f, 0x7d, 0x82, 0x6c, 0x80, 0xfc, 0xb7, - 0x12, 0xe4, 0xff, 0xbf, 0xd7, 0x7e, 0xaf, 0xdf, 0xfd, 0xb6, 0x7b, 0xdd, - 0xe7, 0x79, 0xbf, 0x24, 0xa1, 0x6f, 0xdd, 0xbe, 0xc6, 0x10, 0x22, 0x0d, - 0xe4, 0xbf, 0x01, 0xd7, 0x0a, 0xb5, 0x8b, 0xaf, 0x9c, 0x1b, 0x5a, 0x22, - 0x17, 0x07, 0xd5, 0x44, 0xc7, 0x30, 0x58, 0x0c, 0x93, 0xd4, 0xa9, 0xd1, - 0xcd, 0x62, 0x4b, 0x12, 0x12, 0x82, 0xd4, 0xf5, 0x0f, 0x54, 0x72, 0x30, - 0x35, 0x45, 0x1c, 0x5e, 0x95, 0x04, 0x63, 0x49, 0x7f, 0xe5, 0xb0, 0x10, - 0x03, 0x90, 0x80, 0x88, 0xde, 0xb6, 0xb8, 0x3c, 0x21, 0x0e, 0x70, 0x17, - 0xa3, 0x60, 0xcf, 0x05, 0x29, 0x85, 0xc5, 0x13, 0x14, 0x8c, 0xe2, 0x03, - 0x78, 0xf0, 0x6a, 0x72, 0x0a, 0xd6, 0x33, 0xb8, 0xc6, 0xda, 0xcb, 0xaa, - 0x8a, 0xe1, 0x92, 0xd7, 0x12, 0x32, 0x0a, 0xd0, 0x57, 0xed, 0x2a, 0xd9, - 0x2e, 0xe3, 0xe9, 0x6d, 0xcc, 0x12, 0xc9, 0x20, 0x7a, 0x23, 0xeb, 0xea, - 0x8b, 0xde, 0x36, 0xe2, 0x3f, 0x46, 0xcb, 0xeb, 0x6b, 0xa0, 0x4b, 0x1e, - 0xc8, 0x0d, 0x54, 0x18, 0x40, 0x04, 0x0c, 0x93, 0xdd, 0xcf, 0xbb, 0x1a, - 0xc8, 0xd9, 0xb9, 0xa1, 0xcb, 0x9a, 0x16, 0x89, 0xc5, 0xa1, 0x8e, 0xd6, - 0xc2, 0x6e, 0x64, 0x79, 0x31, 0xfd, 0xf7, 0xa2, 0xee, 0xcb, 0xf6, 0x97, - 0x48, 0x41, 0x4f, 0x68, 0x54, 0x52, 0x07, 0xc5, 0xa9, 0xff, 0xb4, 0x86, - 0x37, 0x29, 0x5d, 0x68, 0xf3, 0x66, 0xf0, 0x96, 0x16, 0x56, 0x83, 0x87, - 0x40, 0x02, 0x7a, 0xe3, 0xd6, 0x41, 0xfe, 0xd1, 0xfa, 0x33, 0xc8, 0x58, - 0xa4, 0x40, 0x5e, 0x65, 0x8d, 0xe4, 0x7a, 0x4d, 0x7f, 0xd2, 0xfe, 0x1f, - 0x2d, 0xba, 0x95, 0x1a, 0xb7, 0x10, 0x59, 0x08, 0x94, 0xa7, 0x78, 0x4b, - 0x32, 0xa9, 0xc2, 0x17, 0x98, 0x50, 0xa9, 0xa7, 0x2e, 0x25, 0xf6, 0x53, - 0xda, 0x46, 0x11, 0x15, 0x13, 0x2f, 0xfe, 0x78, 0xb8, 0x48, 0xb3, 0x08, - 0x73, 0x79, 0x50, 0x2d, 0x28, 0xb1, 0xee, 0x6a, 0x34, 0x93, 0x87, 0x3f, - 0x35, 0x45, 0x89, 0x4a, 0x6b, 0x5a, 0xf5, 0x15, 0xb7, 0x26, 0x3f, 0x68, - 0x15, 0xfb, 0xd4, 0xaa, 0xda, 0x6b, 0xa2, 0x48, 0x20, 0x51, 0xca, 0xc1, - 0x88, 0x38, 0x39, 0xa4, 0x2a, 0x44, 0x9b, 0xcd, 0xfc, 0x9f, 0x95, 0xc3, - 0x2a, 0x8d, 0x3d, 0x22, 0x88, 0x01, 0xdc, 0x6d, 0xe8, 0x82, 0x8c, 0x04, - 0x53, 0xda, 0xc2, 0xfe, 0x10, 0x57, 0x14, 0x9c, 0x8a, 0xa0, 0x7e, 0x4a, - 0xb3, 0x52, 0x1b, 0x84, 0xa3, 0x4a, 0xc5, 0x4b, 0x31, 0x28, 0x8b, 0x6e, - 0x2d, 0xf6, 0x2e, 0x17, 0x61, 0x6e, 0x68, 0xd6, 0x29, 0x0c, 0x5a, 0xc5, - 0xa0, 0xad, 0xda, 0x81, 0x06, 0xd9, 0x89, 0x58, 0xa6, 0xbb, 0xa8, 0x49, - 0x3d, 0xac, 0x42, 0x58, 0x13, 0x1c, 0x7c, 0x0f, 0xaa, 0x77, 0xd1, 0xeb, - 0x4d, 0x69, 0x1a, 0x85, 0x9c, 0x9e, 0xe4, 0x13, 0x08, 0xd0, 0x2b, 0x2d, - 0x1e, 0x93, 0xa2, 0x6a, 0xc7, 0xfc, 0xd6, 0x82, 0x96, 0x24, 0xdf, 0x20, - 0x19, 0x2f, 0xcb, 0xaa, 0x1d, 0x37, 0x18, 0x93, 0xc6, 0x24, 0x63, 0x48, - 0x9b, 0x38, 0x03, 0x0a, 0xbe, 0xd8, 0x71, 0x10, 0xd1, 0xfb, 0x9d, 0x2d, - 0x93, 0xdb, 0xa1, 0xd6, 0xac, 0x43, 0x25, 0x06, 0x91, 0xdb, 0x90, 0x49, - 0x52, 0x85, 0x91, 0x01, 0xc5, 0xc6, 0xa4, 0x7e, 0x4d, 0x5b, 0xf7, 0x44, - 0x7e, 0x79, 0x6b, 0xef, 0xaf, 0x25, 0x7f, 0x24, 0xe8, 0xdc, 0x95, 0x1f, - 0xd0, 0xd4, 0x92, 0x62, 0x0d, 0x30, 0x45, 0xd0, 0x73, 0xc6, 0x28, 0x77, - 0x21, 0x70, 0xb4, 0xbd, 0x6a, 0x8b, 0xbf, 0xdf, 0x44, 0x3f, 0xba, 0x7b, - 0x1e, 0x98, 0x6f, 0x98, 0x01, 0xe3, 0x23, 0x5d, 0xce, 0xb4, 0xa9, 0x46, - 0xdc, 0xe6, 0xa3, 0xa7, 0xf4, 0xe3, 0x1b, 0xfe, 0x61, 0x65, 0x9f, 0x19, - 0x2b, 0xcb, 0xcc, 0x17, 0x4d, 0xe0, 0x03, 0x2e, 0x0d, 0x27, 0xe7, 0x7e, - 0x08, 0x2a, 0x7a, 0x8d, 0x5f, 0xf2, 0xe4, 0x91, 0x77, 0x68, 0x6e, 0x3f, - 0xb3, 0x03, 0x71, 0x59, 0x66, 0x4c, 0x89, 0x63, 0x24, 0x6a, 0xcc, 0x18, - 0x59, 0xd5, 0x11, 0x8c, 0xfe, 0xa9, 0x1e, 0xaa, 0x02, 0x47, 0x49, 0x99, - 0x4b, 0xba, 0x06, 0xca, 0x69, 0x7d, 0x7f, 0x52, 0xf8, 0xaa, 0x15, 0x72, - 0xf1, 0xd1, 0xb9, 0x3d, 0x56, 0x3e, 0xb7, 0x81, 0x19, 0x59, 0x6b, 0x98, - 0x97, 0x82, 0x16, 0xf3, 0xd9, 0xc7, 0xad, 0xe2, 0x11, 0xdf, 0x32, 0x76, - 0x0b, 0x3b, 0x2c, 0x32, 0x2d, 0xda, 0x2a, 0x92, 0x97, 0x2f, 0xda, 0x8a, - 0x87, 0x55, 0x42, 0x50, 0xf4, 0xe4, 0xf6, 0xc1, 0xe1, 0xd2, 0x43, 0x3c, - 0x1f, 0x98, 0xcb, 0xad, 0x99, 0x5a, 0x66, 0x74, 0xd1, 0xe6, 0x2b, 0x7f, - 0xb5, 0x45, 0x74, 0x4d, 0x0e, 0x04, 0x8d, 0x1a, 0x9d, 0xaf, 0x49, 0xe0, - 0x9d, 0x90, 0xd8, 0x33, 0x65, 0x0b, 0xaf, 0xa4, 0x1e, 0xfd, 0xae, 0x51, - 0x88, 0xba, 0x58, 0xcd, 0xc7, 0x37, 0x47, 0x6f, 0x87, 0xeb, 0x92, 0x78, - 0xd3, 0xc2, 0x45, 0x2b, 0x73, 0x78, 0x09, 0x3f, 0x4d, 0x42, 0x1c, 0xb3, - 0x45, 0x48, 0x7f, 0x1a, 0xcd, 0xd2, 0x02, 0xae, 0x71, 0xfe, 0xf6, 0xf8, - 0xab, 0x33, 0xfb, 0xb1, 0x76, 0xc9, 0x1f, 0x5d, 0xe1, 0x53, 0x4e, 0xd0, - 0x7d, 0x2c, 0xd7, 0xd9, 0x06, 0xe7, 0x6a, 0x4c, 0x79, 0x2f, 0x04, 0x11, - 0xe4, 0x94, 0x5f, 0x17, 0x5a, 0xec, 0x29, 0x49, 0xe2, 0xa3, 0x7c, 0x5d, - 0x16, 0x37, 0x1d, 0xb7, 0xbd, 0xaf, 0xbe, 0x6c, 0xde, 0x56, 0x47, 0x6f, - 0xd7, 0x74, 0xc7, 0xdf, 0xf4, 0x2d, 0x81, 0x49, 0xaf, 0x68, 0x2d, 0x6c, - 0x87, 0x6c, 0xf2, 0x96, 0x93, 0x77, 0x7e, 0x62, 0x3f, 0x2a, 0x53, 0xb7, - 0x2b, 0x91, 0x8f, 0xbb, 0xd0, 0xbc, 0xe0, 0x33, 0x00, 0x9a, 0x64, 0x1a, - 0xd3, 0x35, 0x19, 0xb5, 0x54, 0xc9, 0x0d, 0xac, 0xfe, 0x0e, 0xd9, 0x4e, - 0xbc, 0x21, 0x7e, 0x95, 0x15, 0x58, 0xd1, 0x0a, 0x72, 0x21, 0x97, 0x5e, - 0x2a, 0xbb, 0xcf, 0xd7, 0xa4, 0x5a, 0x37, 0xf5, 0xca, 0xfe, 0x3d, 0x5d, - 0x52, 0x70, 0x4c, 0xb3, 0x0c, 0x18, 0xbd, 0x94, 0xeb, 0xe8, 0xf3, 0xc6, - 0x81, 0x10, 0xc4, 0x17, 0xb3, 0x0a, 0x9b, 0x13, 0x10, 0xf7, 0x3a, 0x1b, - 0x78, 0x1c, 0x66, 0x10, 0x8a, 0xbd, 0x27, 0xa8, 0xa5, 0xc6, 0xd3, 0x14, - 0x04, 0xa1, 0x46, 0xb0, 0x28, 0xc9, 0x76, 0xde, 0x39, 0x61, 0x61, 0x06, - 0xd2, 0x75, 0xa4, 0x25, 0x0e, 0xcb, 0xdc, 0xd9, 0x87, 0x59, 0xfe, 0xd5, - 0xcc, 0x6a, 0x71, 0x76, 0x37, 0x82, 0x0b, 0x1e, 0xd8, 0x5c, 0xf3, 0x60, - 0x37, 0x53, 0x55, 0x44, 0x76, 0x35, 0xa7, 0x24, 0xb7, 0x5a, 0x1b, 0x0e, - 0x92, 0x84, 0x5b, 0x63, 0x2a, 0x11, 0x05, 0xd5, 0x91, 0x87, 0x3b, 0xb0, - 0x8e, 0x71, 0x8e, 0x95, 0x18, 0x80, 0x24, 0x5f, 0x19, 0x89, 0xcd, 0xe3, - 0x25, 0x1b, 0xae, 0xe0, 0x78, 0x40, 0x79, 0xba, 0xd6, 0xe6, 0x56, 0x7c, - 0x6f, 0x77, 0xbe, 0x30, 0x73, 0x59, 0xc7, 0xac, 0xe9, 0x1e, 0x80, 0x4c, - 0xab, 0x72, 0xc4, 0x16, 0x5c, 0x6e, 0x4b, 0xd1, 0xe2, 0x63, 0x14, 0xa7, - 0x01, 0xaa, 0xe9, 0xa0, 0x2c, 0x53, 0xe7, 0x8b, 0x7e, 0xa7, 0xf5, 0xf6, - 0x0b, 0x8a, 0x6d, 0x45, 0x0a, 0x93, 0x6d, 0xd6, 0x6e, 0x33, 0xef, 0x49, - 0x2f, 0xa6, 0x23, 0x31, 0x9c, 0x7e, 0x99, 0x96, 0xcb, 0xb2, 0x11, 0x96, - 0xa8, 0x19, 0xfa, 0xf0, 0xc8, 0x42, 0x47, 0xe0, 0x05, 0xf7, 0x5e, 0x53, - 0x08, 0x7b, 0x6c, 0x0e, 0x2c, 0x11, 0x59, 0xa8, 0x36, 0xc6, 0x11, 0xd0, - 0x10, 0x18, 0xe6, 0xa7, 0x2e, 0xae, 0x1c, 0xf0, 0x45, 0xef, 0x47, 0x87, - 0xdb, 0xc9, 0xa3, 0x2d, 0x16, 0xd1, 0xef, 0xff, 0x6e, 0x5f, 0x02, 0x92, - 0xe2, 0x1f, 0xb6, 0x5e, 0x56, 0x08, 0xab, 0x5d, 0xea, 0xfe, 0xbd, 0xb7, - 0xc9, 0xc8, 0xca, 0x20, 0x4b, 0x90, 0x9b, 0xfb, 0xbd, 0xab, 0x10, 0xea, - 0x9a, 0x88, 0xe6, 0xc9, 0xbd, 0x48, 0x4a, 0x0d, 0x9d, 0x40, 0x24, 0xcd, - 0xbf, 0x70, 0x45, 0x5c, 0x7a, 0x85, 0x24, 0x46, 0x76, 0xfc, 0x4b, 0x22, - 0x9c, 0x90, 0xd7, 0x5f, 0x72, 0x15, 0xed, 0x49, 0xf0, 0xa1, 0x81, 0xb3, - 0x3c, 0x2a, 0x9f, 0x37, 0xa5, 0x10, 0x76, 0x48, 0xee, 0x63, 0x37, 0x7e, - 0xdf, 0x17, 0xb8, 0x11, 0xa5, 0x6e, 0x9e, 0x2e, 0x8d, 0xd9, 0x3e, 0xb3, - 0x22, 0xac, 0xf3, 0x27, 0x7b, 0xfd, 0x40, 0x99, 0xee, 0x35, 0x6a, 0x1a, - 0xb2, 0xe7, 0x91, 0xe5, 0xa4, 0xa0, 0x4e, 0x1e, 0xd3, 0xf8, 0xef, 0x23, - 0xad, 0x7c, 0xc4, 0xce, 0x2c, 0x49, 0xea, 0x9a, 0x98, 0x56, 0x1a, 0x14, - 0xee, 0x6e, 0xd5, 0xe3, 0x5a, 0x89, 0x27, 0xd8, 0x1d, 0x27, 0xdf, 0x58, - 0x8a, 0xb4, 0x84, 0x88, 0xb4, 0xc5, 0x1b, 0x20, 0x90, 0xc2, 0x8a, 0x8b, - 0x4a, 0x43, 0x50, 0xa3, 0xe1, 0xad, 0x64, 0x83, 0xb1, 0xd4, 0x9b, 0x83, - 0x7a, 0xee, 0x9d, 0xf3, 0x70, 0x61, 0xb2, 0x3e, 0xd4, 0x7f, 0xbc, 0x48, - 0x81, 0xd6, 0x47, 0x91, 0x12, 0x84, 0x5d, 0x78, 0x65, 0xa7, 0x93, 0xe0, - 0xfc, 0x48, 0xdd, 0x99, 0xc8, 0x45, 0x26, 0xec, 0x3f, 0xde, 0x9c, 0x6a, - 0x45, 0x8d, 0xe9, 0xb3, 0x4f, 0xe7, 0x3d, 0xd2, 0xf9, 0xdc, 0x6a, 0x10, - 0x33, 0x49, 0x72, 0x86, 0xcb, 0xaa, 0xe5, 0xfb, 0xf9, 0x89, 0x31, 0x0a, - 0xbb, 0x6e, 0xe3, 0xe3, 0xbd, 0xc2, 0x32, 0xa1, 0xb5, 0x52, 0x68, 0x25, - 0xcc, 0xd7, 0x8a, 0xbc, 0x04, 0x92, 0x4b, 0xd8, 0x3a, 0xe0, 0xae, 0xba, - 0x36, 0xb8, 0xd3, 0xa8, 0x91, 0x2e, 0xf4, 0x19, 0x97, 0xed, 0x41, 0x32, - 0xc4, 0x34, 0x8d, 0x7d, 0x06, 0xb7, 0x4c, 0x81, 0x07, 0x17, 0xc3, 0xfa, - 0xca, 0xb2, 0x32, 0x89, 0xba, 0x8f, 0x37, 0xe7, 0xb0, 0x2c, 0x59, 0x2f, - 0x59, 0xb7, 0x32, 0x02, 0x4e, 0x5a, 0x5f, 0x99, 0xea, 0x82, 0xe8, 0x8a, - 0x78, 0x8d, 0xb3, 0xc5, 0xdf, 0x1e, 0xad, 0x49, 0xa5, 0x8c, 0xa2, 0x4d, - 0x43, 0x50, 0x14, 0xcb, 0xd9, 0x96, 0x02, 0x1c, 0xdb, 0x3d, 0xa8, 0xc0, - 0xc1, 0x1f, 0x6a, 0x0e, 0x79, 0x30, 0x8d, 0x14, 0x95, 0xa7, 0x8d, 0xe8, - 0x4e, 0xb6, 0xa1, 0xbc, 0x97, 0x24, 0x3f, 0xa7, 0x39, 0xb8, 0x94, 0x3f, - 0x14, 0x69, 0xd0, 0xec, 0xa7, 0x9e, 0x47, 0x21, 0x16, 0x27, 0x1a, 0xae, - 0xb0, 0x0f, 0x50, 0x2d, 0x64, 0x21, 0x9e, 0x7d, 0xa2, 0x28, 0x48, 0x30, - 0xae, 0xbb, 0x0c, 0x27, 0xb9, 0x48, 0xed, 0xe6, 0x9a, 0xa5, 0xd3, 0x0f, - 0x34, 0x37, 0x4d, 0x55, 0xa9, 0x82, 0x78, 0xb6, 0x6c, 0x3d, 0xc0, 0x98, - 0x10, 0x73, 0x4e, 0x56, 0xd4, 0x97, 0x1f, 0x28, 0x2b, 0x62, 0x43, 0xaa, - 0x4e, 0x14, 0x71, 0xea, 0x25, 0xbd, 0x6e, 0x86, 0x3e, 0x71, 0xaf, 0x96, - 0x71, 0xfe, 0x81, 0x5d, 0x94, 0x4c, 0x51, 0x44, 0xd5, 0x7a, 0x21, 0x12, - 0x96, 0x0f, 0x54, 0xae, 0x50, 0xe1, 0xa0, 0x7d, 0xc8, 0x55, 0xd2, 0xb2, - 0xac, 0x25, 0x0d, 0x37, 0xac, 0x8f, 0xcb, 0xd5, 0xb3, 0xf9, 0x45, 0x83, - 0x0a, 0x8a, 0x9e, 0x47, 0x1e, 0xb8, 0xc9, 0xc2, 0x56, 0x24, 0x64, 0x7b, - 0x33, 0xcb, 0x1f, 0x6f, 0x4e, 0x89, 0xf2, 0x23, 0x66, 0x14, 0x2f, 0x16, - 0xda, 0xdb, 0x87, 0x37, 0xe1, 0x37, 0x99, 0xaf, 0x96, 0xa7, 0xdb, 0x26, - 0xc6, 0x1b, 0xd9, 0xc4, 0xb7, 0xd9, 0x68, 0x59, 0xdc, 0x48, 0x56, 0x79, - 0x16, 0x7d, 0x98, 0x67, 0x05, 0xc0, 0xfb, 0xb5, 0x49, 0x3f, 0x52, 0x37, - 0x2f, 0x5c, 0x06, 0xc6, 0xd4, 0x53, 0x9e, 0xf6, 0x3f, 0xb4, 0x0e, 0x12, - 0xa5, 0x64, 0xf9, 0x87, 0x3c, 0x09, 0x08, 0x0a, 0x2e, 0xe9, 0x9a, 0xce, - 0x22, 0xa9, 0x5e, 0x83, 0x0f, 0x8d, 0x2e, 0x2d, 0xbc, 0x65, 0x25, 0x86, - 0xd3, 0x26, 0xe9, 0xd7, 0x41, 0x26, 0x05, 0xb0, 0x80, 0xc3, 0x47, 0x3f, - 0xc8, 0x19, 0xb4, 0x06, 0xbb, 0x00, 0xdb, 0x7b, 0x29, 0x68, 0x6c, 0xce, - 0xd8, 0x40, 0xc4, 0x6c, 0x89, 0xa9, 0xad, 0x37, 0xc7, 0x66, 0x13, 0xb1, - 0x2e, 0xdf, 0xb1, 0xe2, 0xb6, 0x86, 0x24, 0x2d, 0x48, 0x73, 0xdd, 0xc9, - 0x07, 0x04, 0x35, 0xaf, 0xb3, 0xe6, 0x8f, 0x07, 0xd5, 0xdb, 0x1e, 0xef, - 0x9f, 0x38, 0xdc, 0xc2, 0x2d, 0x8f, 0x9c, 0x7e, 0xe1, 0x3f, 0x3d, 0x47, - 0x79, 0x3d, 0x48, 0xa2, 0x1f, 0x47, 0x0a, 0x52, 0x2b, 0xc0, 0x65, 0x8c, - 0xd6, 0xf2, 0x49, 0x11, 0xbe, 0xc8, 0x5f, 0x6a, 0x4d, 0xcb, 0xfb, 0xb8, - 0xf8, 0xd0, 0xe8, 0x62, 0xd1, 0xc6, 0xaa, 0x8b, 0x20, 0xd6, 0x1f, 0x8d, - 0x94, 0x01, 0x51, 0x47, 0x62, 0xd4, 0xfa, 0x18, 0xae, 0xae, 0x39, 0xe1, - 0x48, 0x05, 0x77, 0x61, 0x2a, 0xc1, 0x7a, 0x85, 0xf9, 0x91, 0x1f, 0xbc, - 0xc6, 0xdb, 0x92, 0x27, 0x31, 0x56, 0x8c, 0xfc, 0xe3, 0x8f, 0xcf, 0xaf, - 0xce, 0xcb, 0x03, 0x5c, 0x20, 0xc0, 0xe9, 0x34, 0x0f, 0xcf, 0x48, 0x8f, - 0xd6, 0x07, 0xd6, 0x8c, 0x63, 0x28, 0xe5, 0x12, 0x0c, 0x8f, 0x51, 0x9d, - 0x41, 0x58, 0xc5, 0xb7, 0x66, 0x96, 0x7e, 0x8b, 0xac, 0xa2, 0x3b, 0x50, - 0x41, 0x52, 0x9d, 0x27, 0xc9, 0xc4, 0x50, 0xb3, 0x48, 0x30, 0xe1, 0xe3, - 0x53, 0x26, 0x1f, 0xc3, 0xe4, 0x0a, 0xda, 0xc2, 0x26, 0xba, 0x58, 0xfa, - 0x73, 0xf2, 0xde, 0x40, 0x5e, 0x42, 0xe1, 0xc0, 0xa7, 0xc7, 0x4b, 0x5c, - 0xa7, 0x88, 0x3e, 0x2c, 0x9f, 0xdb, 0xd3, 0x2d, 0x27, 0x10, 0xad, 0x69, - 0x48, 0x55, 0xf4, 0x71, 0xad, 0xad, 0x8d, 0x02, 0x43, 0x5b, 0xea, 0xaf, - 0x78, 0xb4, 0x2d, 0x0b, 0x80, 0x70, 0xc3, 0x82, 0xe8, 0xfb, 0x81, 0xcd, - 0x6a, 0x93, 0x8c, 0xd1, 0xa3, 0x2b, 0xd6, 0xa0, 0xcc, 0x5a, 0xe4, 0xa6, - 0xf5, 0xe3, 0x0f, 0xf4, 0xce, 0xc7, 0x7b, 0x84, 0x39, 0xd1, 0xa4, 0xb6, - 0x8d, 0x66, 0x49, 0x92, 0x64, 0xe2, 0xf7, 0x81, 0xbb, 0x8e, 0xd9, 0xeb, - 0x17, 0x20, 0xf0, 0xc8, 0x33, 0x81, 0x5a, 0x4a, 0x2a, 0x45, 0xb1, 0xcc, - 0x05, 0xad, 0xf7, 0xc3, 0xa4, 0xe4, 0xce, 0xbf, 0xb5, 0xc7, 0xf1, 0xbb, - 0x3c, 0x95, 0x05, 0x57, 0x74, 0xc4, 0x59, 0x5a, 0x33, 0x2a, 0xb7, 0x9f, - 0x58, 0x10, 0x1b, 0x96, 0x45, 0xce, 0xfd, 0x4a, 0xa3, 0x92, 0xd6, 0x3e, - 0x62, 0x4c, 0x8a, 0xac, 0xf3, 0x9e, 0x83, 0xbb, 0x75, 0x4c, 0x87, 0xf2, - 0x51, 0xff, 0x92, 0x3f, 0x52, 0x6a, 0xb0, 0x95, 0xe6, 0x93, 0x62, 0xb9, - 0x53, 0xbd, 0x96, 0xb2, 0xbd, 0x51, 0x5b, 0x04, 0x2f, 0xb4, 0x8a, 0x79, - 0x13, 0x8a, 0x8f, 0xb4, 0x01, 0x13, 0xe2, 0xb8, 0xb2, 0xe4, 0x5b, 0xad, - 0x6b, 0x4e, 0x5d, 0x92, 0xba, 0x1d, 0xb9, 0x6f, 0x90, 0x1f, 0x9f, 0x1a, - 0x0c, 0xc8, 0x18, 0x7e, 0x94, 0x8f, 0xe3, 0x1f, 0x1f, 0x91, 0x70, 0xce, - 0x63, 0x30, 0x1e, 0x5c, 0xb8, 0x31, 0xd0, 0x10, 0xfc, 0x87, 0xe2, 0x30, - 0x03, 0x75, 0x06, 0x95, 0xd9, 0xd3, 0xf9, 0x47, 0x89, 0x42, 0xed, 0x5a, - 0x45, 0x73, 0x1c, 0xd6, 0xdd, 0x7b, 0xa8, 0x2c, 0x92, 0xf1, 0x1d, 0x57, - 0x88, 0x1c, 0xcb, 0xe8, 0xea, 0xa3, 0x30, 0x2f, 0xed, 0x8b, 0xcb, 0x19, - 0x43, 0xfa, 0xd0, 0x38, 0x74, 0x32, 0x5a, 0x34, 0xa6, 0x5a, 0x1b, 0x1e, - 0xe9, 0xe3, 0x50, 0x09, 0xc7, 0x9c, 0xae, 0xc7, 0x4a, 0xf8, 0x07, 0x2e, - 0x5b, 0xd7, 0xa0, 0xe6, 0x3f, 0x01, 0x90, 0x40, 0x12, 0xc0, 0x1a, 0x79, - 0xa8, 0xcd, 0xcc, 0xed, 0x2b, 0xd2, 0x0b, 0x81, 0xf5, 0xf8, 0x1e, 0x90, - 0x88, 0x4c, 0x73, 0x86, 0x51, 0x8e, 0x0f, 0xcc, 0x6a, 0x2e, 0xd8, 0x54, - 0xcb, 0x85, 0x14, 0xbe, 0x63, 0x1c, 0x86, 0x0c, 0x16, 0xef, 0x0f, 0x15, - 0x3e, 0x6c, 0xc1, 0x5e, 0xb7, 0x18, 0xfb, 0x5a, 0x56, 0x79, 0x53, 0xbb, - 0x2b, 0x8a, 0xe9, 0x7b, 0x7a, 0x32, 0xbd, 0x5a, 0xbd, 0x17, 0x16, 0xff, - 0xe1, 0x2b, 0x54, 0x9e, 0xb3, 0x93, 0xc2, 0x2e, 0x15, 0x3a, 0xc3, 0x24, - 0xdf, 0x25, 0x24, 0x8d, 0x5d, 0x89, 0xe1, 0x35, 0x42, 0x93, 0xe9, 0xf8, - 0xa3, 0xb4, 0x3f, 0xa7, 0x15, 0xbb, 0x33, 0x37, 0x60, 0xf8, 0x22, 0x78, - 0x80, 0x61, 0x57, 0xd3, 0xb6, 0x3e, 0x2c, 0x63, 0x71, 0x23, 0x1e, 0x95, - 0xfd, 0x31, 0xf1, 0xfb, 0xd7, 0x8b, 0x95, 0x70, 0x99, 0xa1, 0x1f, 0x57, - 0x87, 0xaa, 0x1a, 0xca, 0xef, 0x4b, 0x1e, 0xad, 0xcb, 0x8f, 0x46, 0x86, - 0xdc, 0x3f, 0x89, 0x29, 0xf0, 0xd1, 0xf9, 0xd0, 0xc9, 0x43, 0x2a, 0x50, - 0x2f, 0x6d, 0x29, 0x28, 0xca, 0x10, 0x8a, 0xa4, 0x6c, 0x4f, 0x0b, 0x7b, - 0x58, 0xb9, 0xb8, 0x7b, 0x99, 0x42, 0xce, 0x85, 0x51, 0xd6, 0xe4, 0xb3, - 0xa0, 0xcc, 0x8b, 0x20, 0x27, 0xc5, 0x1b, 0x2d, 0x6a, 0xa3, 0x8f, 0xc0, - 0x29, 0x24, 0xa1, 0x47, 0x5a, 0xef, 0x20, 0xd0, 0xdc, 0x46, 0xdc, 0x96, - 0x6c, 0x19, 0xfa, 0xfa, 0xe3, 0x69, 0x68, 0x3f, 0x0f, 0x14, 0x08, 0x85, - 0x1a, 0xe1, 0x48, 0x7e, 0x44, 0xc0, 0x05, 0xeb, 0xdf, 0x16, 0x73, 0x06, - 0xae, 0x4b, 0x4a, 0x06, 0x4d, 0x60, 0xba, 0x52, 0x9c, 0x52, 0xae, 0xfa, - 0x2c, 0xe6, 0x22, 0x7e, 0x57, 0x22, 0x26, 0x41, 0xa9, 0x16, 0xea, 0x47, - 0xdf, 0x37, 0x4d, 0xf0, 0xae, 0x8a, 0x96, 0x53, 0x61, 0x82, 0xe1, 0x49, - 0x28, 0x41, 0xa3, 0x00, 0x85, 0x33, 0x00, 0x36, 0x2b, 0x90, 0xe1, 0xea, - 0xe3, 0x9a, 0x98, 0x62, 0xec, 0xc3, 0x7a, 0xd5, 0xcb, 0x34, 0xd9, 0xe6, - 0xc0, 0xe6, 0x0c, 0xa4, 0x18, 0x5f, 0x62, 0xb1, 0x1e, 0xd8, 0x50, 0x2b, - 0xd0, 0xb5, 0xce, 0xf2, 0xe9, 0x8a, 0x8d, 0x48, 0x4b, 0x88, 0x56, 0xdc, - 0xed, 0x05, 0x74, 0x00, 0x15, 0xb8, 0x81, 0x2f, 0xea, 0xea, 0xd2, 0x34, - 0x40, 0x42, 0xd8, 0xd2, 0x13, 0xaf, 0x0c, 0xa3, 0x46, 0xda, 0x68, 0x25, - 0xc1, 0x5e, 0x10, 0xa2, 0x6b, 0xa5, 0xba, 0x5a, 0xcb, 0x9a, 0x5a, 0xf9, - 0x82, 0x4d, 0x0d, 0x3d, 0xdf, 0x72, 0xb1, 0x02, 0x09, 0x9d, 0x28, 0x70, - 0x03, 0xb8, 0x80, 0xfe, 0xf4, 0x68, 0x0c, 0xe1, 0xaf, 0xc4, 0x1a, 0xbe, - 0x47, 0x98, 0x90, 0x5c, 0x66, 0x6b, 0xab, 0x6b, 0x30, 0x19, 0x19, 0x6e, - 0x6e, 0x0a, 0x27, 0xea, 0x98, 0xb4, 0x07, 0xd2, 0x43, 0xec, 0x4d, 0x2d, - 0xd7, 0x18, 0xa6, 0x5c, 0x7d, 0x64, 0x91, 0x41, 0x50, 0xb7, 0x43, 0xdb, - 0xbf, 0xac, 0x70, 0x1e, 0x27, 0xa7, 0x0a, 0xd2, 0xd9, 0x9a, 0x3a, 0x02, - 0x61, 0xb6, 0x87, 0x2c, 0xbc, 0x8e, 0x06, 0x31, 0x10, 0xf7, 0x69, 0xa1, - 0x51, 0x57, 0x0a, 0x29, 0xa7, 0xe9, 0x5c, 0xf0, 0xff, 0x7f, 0x75, 0x7c, - 0xb9, 0xd5, 0x04, 0x30, 0x8a, 0x27, 0x7e, 0x64, 0x80, 0xb2, 0xd4, 0xf3, - 0x20, 0x3e, 0x51, 0xa8, 0x8a, 0x96, 0x40, 0x28, 0x8a, 0x4e, 0xf2, 0xb0, - 0x98, 0xc6, 0x73, 0xad, 0xaa, 0x56, 0x6b, 0xee, 0x90, 0x96, 0x81, 0x39, - 0x59, 0x10, 0x26, 0xa4, 0x5e, 0x77, 0x57, 0x71, 0xdd, 0x29, 0xdc, 0x48, - 0xd1, 0xe1, 0x16, 0x8f, 0x8e, 0x4f, 0x8f, 0x2f, 0x8f, 0x11, 0x41, 0xdd, - 0x10, 0x49, 0xa6, 0x28, 0x7e, 0x5c, 0x26, 0xe3, 0x9b, 0x79, 0x46, 0x77, - 0xaf, 0x84, 0x74, 0xd0, 0x4d, 0xff, 0x5d, 0x32, 0x3a, 0x3a, 0xf8, 0x56, - 0x42, 0x1a, 0x8a, 0xe8, 0xfc, 0xe2, 0xec, 0xfc, 0xf5, 0xc9, 0xdb, 0xa3, - 0x5e, 0x74, 0x78, 0x76, 0xfe, 0x43, 0x2f, 0x7a, 0x73, 0xf6, 0xed, 0x71, - 0x8b, 0x4f, 0x91, 0xfd, 0xd9, 0xcd, 0x8c, 0xb3, 0xd7, 0x6b, 0x76, 0x3b, - 0x44, 0xa4, 0xd4, 0xad, 0x0e, 0x12, 0x7d, 0x4e, 0x4f, 0x86, 0x97, 0xd8, - 0xfa, 0x7a, 0xbc, 0x17, 0x62, 0xda, 0x05, 0x78, 0x3d, 0x2d, 0x2c, 0x80, - 0x83, 0xab, 0x86, 0xfd, 0x76, 0x54, 0xbd, 0xe2, 0xf0, 0x1e, 0x96, 0xda, - 0x15, 0xfb, 0x8a, 0xff, 0x6d, 0xc1, 0x4c, 0x8c, 0xbd, 0xe6, 0xc1, 0xfe, - 0x5e, 0x2d, 0xf6, 0x73, 0x23, 0x79, 0x39, 0xf4, 0xb2, 0xe0, 0x34, 0x8d, - 0x6a, 0xf2, 0x7a, 0x34, 0x59, 0xe6, 0x4d, 0x89, 0x27, 0x8e, 0x82, 0x0e, - 0x25, 0x57, 0xa9, 0x57, 0x51, 0xda, 0xd8, 0xfb, 0x58, 0xf8, 0x82, 0x1e, - 0xd4, 0x7d, 0xf0, 0x42, 0xc3, 0xb1, 0x23, 0x88, 0x95, 0x21, 0x02, 0x59, - 0x38, 0x24, 0x9b, 0xf6, 0x2e, 0x29, 0xf8, 0x53, 0x86, 0x3b, 0xe2, 0x9b, - 0x48, 0x70, 0x88, 0x7e, 0x78, 0xbc, 0x94, 0xb1, 0x84, 0x18, 0x86, 0xbe, - 0x78, 0x61, 0x3e, 0x4b, 0x07, 0x8c, 0x89, 0xcb, 0x3c, 0x86, 0x0b, 0x28, - 0xc2, 0x9a, 0x34, 0xb5, 0x13, 0xd5, 0x0e, 0x24, 0xc8, 0x21, 0x48, 0x40, - 0x43, 0x44, 0x24, 0xdd, 0x2e, 0x72, 0x4a, 0x88, 0xeb, 0xf7, 0x24, 0x13, - 0x13, 0x90, 0xd5, 0xfa, 0x5e, 0xbf, 0xc5, 0x40, 0xc2, 0x82, 0xf3, 0x1a, - 0x7e, 0xfe, 0xeb, 0xd1, 0xc4, 0x0f, 0x8e, 0x26, 0x64, 0x0d, 0x5f, 0xe2, - 0x8f, 0x5f, 0x44, 0x15, 0x01, 0xa4, 0x97, 0xe8, 0x84, 0x9b, 0xe9, 0xbc, - 0x4a, 0x1e, 0xfd, 0x46, 0x56, 0xc3, 0x64, 0x4b, 0xcd, 0x4b, 0xc1, 0x6e, - 0xab, 0x5d, 0x87, 0xe5, 0xa2, 0x2a, 0x51, 0x54, 0x28, 0xa2, 0x45, 0x9c, - 0x91, 0x2d, 0x96, 0x70, 0xe1, 0x94, 0xa1, 0x98, 0xa5, 0xc2, 0x3c, 0x24, - 0x9f, 0xdf, 0x70, 0xe9, 0x7e, 0xe6, 0xcc, 0x67, 0x7a, 0xbc, 0x0f, 0xf2, - 0x7f, 0x39, 0x61, 0xf1, 0x99, 0x98, 0x9e, 0x86, 0x17, 0xad, 0x45, 0x18, - 0xdf, 0x22, 0x66, 0x2a, 0x1c, 0x3c, 0x56, 0xeb, 0x2d, 0x8b, 0x1f, 0x9c, - 0xa5, 0x3e, 0x62, 0xb4, 0x3f, 0xad, 0xdb, 0x31, 0xd1, 0xda, 0xf0, 0x58, - 0xe1, 0x96, 0x9b, 0x5f, 0x2b, 0x2d, 0x2b, 0x78, 0x23, 0x1f, 0x3f, 0x7a, - 0xdc, 0x55, 0xaa, 0x59, 0xd3, 0xa4, 0xda, 0x1a, 0xf9, 0xdb, 0x16, 0x7a, - 0x73, 0x10, 0xed, 0xe1, 0x34, 0x4c, 0x28, 0x40, 0x1d, 0x17, 0x04, 0x90, - 0x10, 0x53, 0xc3, 0x33, 0x12, 0x42, 0x50, 0x70, 0x97, 0x0d, 0xe5, 0x9a, - 0x0d, 0x73, 0x16, 0x11, 0xa9, 0x28, 0x11, 0x08, 0x5e, 0xf0, 0xc0, 0xb9, - 0x34, 0x4a, 0xb5, 0xc9, 0x1a, 0xec, 0xaa, 0x81, 0x14, 0xb7, 0x64, 0x70, - 0x68, 0x60, 0x82, 0x4f, 0x92, 0xd4, 0x30, 0x6e, 0xe5, 0xb3, 0xbf, 0x53, - 0x00, 0x4c, 0x5c, 0x73, 0x48, 0x7a, 0xa7, 0xb6, 0x78, 0x8c, 0x9c, 0xf0, - 0xbe, 0x26, 0xe3, 0xbd, 0x90, 0x94, 0xf7, 0xda, 0x64, 0xf5, 0x06, 0x6b, - 0x97, 0x9f, 0x84, 0xef, 0xd4, 0xde, 0x50, 0xdc, 0x6c, 0xd4, 0x85, 0xda, - 0xec, 0x6f, 0xb9, 0xb8, 0x49, 0x40, 0x8a, 0xca, 0x36, 0x37, 0xed, 0x21, - 0xb1, 0xb3, 0x4c, 0xb8, 0xc8, 0xdb, 0x6c, 0x3a, 0xf1, 0xe7, 0xc9, 0xb2, - 0x95, 0xb8, 0xb3, 0x6d, 0xb1, 0x7b, 0xba, 0xaa, 0x94, 0x45, 0x53, 0xfe, - 0x6e, 0x34, 0x36, 0x4f, 0xee, 0xc3, 0xc6, 0xbc, 0xec, 0xe0, 0x1a, 0xfc, - 0x2d, 0x43, 0xd0, 0x19, 0x83, 0x0f, 0x5a, 0x77, 0xd1, 0x8a, 0xca, 0xcb, - 0x29, 0xee, 0x01, 0x84, 0x9f, 0x69, 0x4c, 0x10, 0x54, 0x02, 0x1b, 0x73, - 0x5f, 0xac, 0x05, 0x20, 0x31, 0x43, 0x27, 0x6d, 0x4b, 0xbd, 0xee, 0x9f, - 0xd2, 0x31, 0x74, 0xb5, 0x4b, 0x74, 0xdc, 0xd5, 0x8a, 0xb3, 0x61, 0xa5, - 0x7a, 0x29, 0x5a, 0xca, 0xc9, 0x8a, 0xed, 0xd9, 0x3d, 0x20, 0x35, 0xd7, - 0x75, 0xc5, 0xe8, 0x1d, 0x75, 0x38, 0xbc, 0x7d, 0x54, 0x2c, 0xf3, 0xc9, - 0x72, 0xd6, 0x09, 0xb3, 0xe0, 0x75, 0x61, 0x98, 0x81, 0x36, 0x2b, 0xdc, - 0xf3, 0x25, 0x44, 0xbd, 0x3e, 0xdb, 0xa9, 0x59, 0xd0, 0x0d, 0x9f, 0x30, - 0x40, 0x24, 0xec, 0xef, 0x86, 0xf4, 0x43, 0xed, 0x35, 0x84, 0xc4, 0x92, - 0xef, 0xb5, 0xdf, 0x70, 0xf3, 0x76, 0x68, 0x31, 0x59, 0x00, 0xdf, 0x1d, - 0xec, 0xb4, 0x8b, 0xbb, 0x1c, 0xbd, 0x37, 0x4e, 0x7c, 0x71, 0xed, 0x94, - 0xd4, 0x57, 0x1e, 0x6d, 0xe1, 0x25, 0x37, 0x89, 0xcb, 0x70, 0x75, 0x88, - 0xf5, 0x90, 0xd6, 0xaf, 0x80, 0x2b, 0x57, 0x8d, 0xb7, 0x70, 0x5c, 0x01, - 0x69, 0xe9, 0x89, 0x98, 0xd3, 0xf7, 0x9d, 0xa8, 0x19, 0x0c, 0x6f, 0x97, - 0x59, 0xee, 0xb4, 0xb8, 0xdb, 0x6d, 0x2d, 0x61, 0x51, 0x1b, 0x1a, 0x4b, - 0x62, 0x97, 0xa7, 0x43, 0x17, 0x20, 0xbc, 0x2b, 0x22, 0xb8, 0xc3, 0x3f, - 0xf1, 0xb5, 0xeb, 0xd7, 0xd4, 0x66, 0xe7, 0x97, 0x55, 0x08, 0xf7, 0x43, - 0xd8, 0xe3, 0x0b, 0xb3, 0x98, 0xde, 0xed, 0xb5, 0x0e, 0xc1, 0xc6, 0x50, - 0x19, 0x04, 0x1b, 0x5a, 0x6c, 0x10, 0x7b, 0xcd, 0x41, 0x3c, 0x56, 0x1e, - 0x9e, 0x5f, 0x6d, 0x0c, 0xe1, 0x89, 0x0e, 0xe1, 0xc9, 0xc7, 0xae, 0x42, - 0x38, 0x80, 0x27, 0xbf, 0x74, 0x15, 0x5a, 0x87, 0xf0, 0x94, 0x03, 0xea, - 0x17, 0x77, 0x4f, 0x5b, 0x32, 0x7b, 0xcc, 0x26, 0x06, 0x56, 0x05, 0xb4, - 0x94, 0xa9, 0x14, 0xe3, 0xf4, 0x2e, 0x73, 0x2e, 0x43, 0x68, 0x05, 0x45, - 0x33, 0xef, 0x61, 0x3a, 0xa9, 0x57, 0x1c, 0xd4, 0x31, 0x7b, 0xe0, 0x6b, - 0x41, 0x81, 0xb9, 0xd2, 0x5f, 0x38, 0xc6, 0xb8, 0xaf, 0x3d, 0xd4, 0x8a, - 0x4c, 0x4b, 0x99, 0xdc, 0x35, 0xb1, 0xce, 0x48, 0x78, 0x14, 0x44, 0x33, - 0x2d, 0xa0, 0x93, 0x71, 0x5b, 0x4f, 0x6d, 0x50, 0x89, 0x04, 0x9e, 0x06, - 0xd3, 0x7d, 0x2e, 0xd3, 0x7d, 0xfe, 0x7f, 0xd3, 0x74, 0x9f, 0xaf, 0x9f, - 0xee, 0x27, 0x62, 0x55, 0x00, 0x66, 0x68, 0x7f, 0x14, 0xe7, 0x6b, 0x51, - 0x95, 0x2d, 0x5c, 0xd2, 0x01, 0x8c, 0x56, 0xc2, 0xfe, 0x0b, 0x41, 0x66, - 0x92, 0x6f, 0xa8, 0x99, 0xf5, 0xac, 0xa0, 0x22, 0xd1, 0x33, 0x54, 0x52, - 0x51, 0xa6, 0x63, 0xe6, 0x73, 0x5c, 0x0d, 0xc5, 0xc5, 0xf9, 0xfe, 0xf7, - 0xf6, 0xa0, 0xb5, 0x22, 0xe7, 0x51, 0xb3, 0x66, 0x66, 0x2f, 0x02, 0xa6, - 0x6e, 0x50, 0x7a, 0x33, 0x40, 0xb8, 0xa1, 0x76, 0x8f, 0xdf, 0x7e, 0x7b, - 0x72, 0x71, 0xf6, 0xf6, 0xcd, 0xf1, 0x5b, 0x17, 0x6d, 0x73, 0x89, 0xfa, - 0x83, 0x6d, 0x56, 0xb4, 0xb6, 0xba, 0x2b, 0x22, 0xff, 0xc2, 0x94, 0xc3, - 0x69, 0xb3, 0x8b, 0x85, 0xfe, 0x35, 0x08, 0x9b, 0x0b, 0x1e, 0xb2, 0xe3, - 0xc7, 0x42, 0xd9, 0x82, 0x7d, 0x03, 0x13, 0x8e, 0x71, 0x1b, 0x48, 0xe8, - 0x91, 0x2b, 0x9d, 0xce, 0xb6, 0xb7, 0x87, 0x71, 0xb2, 0xb0, 0xf5, 0xf3, - 0xf7, 0x89, 0x16, 0x6e, 0x0c, 0xa2, 0xd6, 0x2a, 0x83, 0xf0, 0x9b, 0x17, - 0x34, 0xf8, 0xa3, 0x19, 0xaf, 0xf6, 0xb7, 0xb7, 0x7f, 0x02, 0x0e, 0xe0, - 0xe7, 0x6a, 0xdf, 0x6c, 0x5e, 0xc9, 0xa1, 0x21, 0xc7, 0xd7, 0x06, 0xb1, - 0x3c, 0x3f, 0x58, 0xcc, 0x36, 0x02, 0x7f, 0xd6, 0xf0, 0x3d, 0xe9, 0xd2, - 0xdf, 0xff, 0xf0, 0x2b, 0x77, 0x31, 0xac, 0x94, 0xa4, 0xf8, 0xd5, 0xbb, - 0xa8, 0x68, 0xd7, 0x07, 0xa7, 0xa7, 0xbf, 0x6a, 0x07, 0x50, 0x39, 0xbc, - 0xbd, 0xb0, 0xef, 0xec, 0x85, 0x96, 0x24, 0xd9, 0x50, 0x66, 0x2b, 0xda, - 0xc9, 0xdb, 0x33, 0x1d, 0x8d, 0x98, 0x9b, 0xfa, 0x56, 0xed, 0x65, 0xe2, - 0x2a, 0x29, 0xf2, 0xc0, 0x1a, 0x38, 0xd5, 0xf8, 0x12, 0xa2, 0x93, 0x03, - 0xec, 0x34, 0xab, 0x2f, 0x50, 0xcb, 0x90, 0x92, 0x94, 0x39, 0xdb, 0xa2, - 0x40, 0x24, 0x9a, 0xd1, 0xba, 0xc5, 0x30, 0xcc, 0x20, 0x14, 0x1c, 0xd2, - 0x85, 0xfa, 0xbb, 0x9c, 0xce, 0xc5, 0x44, 0xa7, 0x68, 0xce, 0x25, 0x00, - 0xf2, 0x59, 0x11, 0xc0, 0x50, 0xf8, 0x14, 0x7d, 0x7f, 0x72, 0x19, 0x1d, - 0x9e, 0x1d, 0xf9, 0x23, 0x7a, 0x29, 0x81, 0x9c, 0x39, 0x4a, 0x26, 0x2d, - 0xe7, 0xc4, 0xc4, 0x58, 0x5d, 0x48, 0xaf, 0x80, 0x87, 0xe6, 0x60, 0xd1, - 0x11, 0x53, 0x67, 0x76, 0x22, 0x5a, 0x50, 0x29, 0xf8, 0x96, 0x4b, 0xa0, - 0xdc, 0x24, 0xb0, 0x22, 0x54, 0x41, 0x82, 0x9d, 0xa9, 0x96, 0xe3, 0xa6, - 0x19, 0x3c, 0x87, 0x58, 0x8a, 0x58, 0x1d, 0x88, 0xbb, 0x70, 0xe5, 0xb6, - 0xb9, 0x58, 0x93, 0x48, 0xb8, 0x3a, 0xf0, 0xba, 0x44, 0x80, 0x8a, 0x26, - 0x85, 0x70, 0x72, 0x14, 0x00, 0xd0, 0x82, 0xa3, 0x0f, 0x8c, 0xd0, 0x8e, - 0xd1, 0x54, 0xe2, 0x3e, 0x77, 0xd5, 0xee, 0x3f, 0xf7, 0x80, 0x1a, 0x1e, - 0xa3, 0x0a, 0xa6, 0x03, 0x4e, 0x94, 0x98, 0x58, 0xd2, 0x91, 0x81, 0x8c, - 0x59, 0x95, 0x14, 0x29, 0x7e, 0xdd, 0xd8, 0x71, 0xd7, 0x84, 0xeb, 0x67, - 0x4f, 0xa9, 0x5d, 0x90, 0xe4, 0x59, 0x9e, 0x12, 0xf7, 0x52, 0xfa, 0x73, - 0x70, 0xa4, 0x9f, 0xe8, 0x60, 0x2e, 0x4e, 0x69, 0xe6, 0x53, 0xb1, 0x83, - 0x6b, 0xcc, 0x37, 0x2a, 0xe4, 0xc0, 0x7b, 0xc2, 0xfa, 0xae, 0x16, 0x3c, - 0xf5, 0x6f, 0x3e, 0x33, 0x73, 0x9b, 0x92, 0x82, 0x47, 0xf2, 0x54, 0x2a, - 0x10, 0xd7, 0xae, 0x2a, 0x93, 0x4a, 0xa8, 0x12, 0x2c, 0x36, 0x86, 0xbb, - 0x4c, 0x6c, 0xdb, 0xcd, 0xda, 0x10, 0xb5, 0x38, 0x9c, 0xe7, 0xb5, 0x7e, - 0xac, 0x1b, 0x54, 0x23, 0x97, 0x22, 0x98, 0xe8, 0xa2, 0x1e, 0x70, 0xc5, - 0xcd, 0x37, 0x5b, 0xfb, 0xb4, 0xbe, 0x28, 0xbe, 0x6e, 0xbc, 0xb4, 0xe8, - 0x9e, 0xfc, 0xcc, 0x31, 0x8b, 0xe8, 0x3e, 0xe1, 0x9c, 0x28, 0x3d, 0x93, - 0xa8, 0x69, 0x64, 0xb3, 0xb3, 0xf8, 0x09, 0x49, 0x95, 0x04, 0xd0, 0x95, - 0xc6, 0x5b, 0x8e, 0x75, 0xbc, 0x0d, 0xfd, 0x30, 0x0f, 0x39, 0xea, 0x0b, - 0xdf, 0x49, 0x14, 0xc3, 0x45, 0xc5, 0xa6, 0xce, 0x79, 0xea, 0x36, 0x41, - 0xda, 0x97, 0x8f, 0xd8, 0xf3, 0x47, 0x9c, 0x39, 0x73, 0x7f, 0xeb, 0x1b, - 0x0d, 0x9c, 0xa2, 0x5a, 0x18, 0x14, 0xaf, 0x82, 0x54, 0xe3, 0x0b, 0x6b, - 0xf8, 0x21, 0x1a, 0x3e, 0x9e, 0xab, 0xdf, 0x42, 0x80, 0xda, 0x19, 0x9c, - 0x3b, 0x6b, 0xc4, 0x9c, 0x66, 0x57, 0xa5, 0xab, 0x10, 0xc4, 0x2a, 0xf5, - 0x24, 0x40, 0xb8, 0xc4, 0xa9, 0xf6, 0x8d, 0xe2, 0x0c, 0x99, 0x76, 0x0e, - 0x07, 0x52, 0xd4, 0x70, 0xcf, 0x05, 0xd5, 0x5e, 0xfd, 0x99, 0xd8, 0xad, - 0x2d, 0xf6, 0xf9, 0xc1, 0x70, 0x68, 0x4b, 0x0d, 0x14, 0x29, 0x5b, 0x4f, - 0x59, 0x41, 0xf5, 0x6c, 0x22, 0x63, 0x5a, 0x53, 0x0a, 0x5b, 0x0c, 0x19, - 0xda, 0x48, 0x2d, 0x3a, 0x62, 0xf7, 0x89, 0x5f, 0x73, 0xd7, 0xd9, 0xb7, - 0xd2, 0x5a, 0xef, 0x23, 0x3b, 0x6b, 0xed, 0xeb, 0xdb, 0x96, 0xbe, 0x9e, - 0xd6, 0xe6, 0xb5, 0xb7, 0xf7, 0xa9, 0xa6, 0x10, 0xd0, 0x5a, 0x1f, 0x56, - 0x28, 0x45, 0x89, 0x43, 0x6d, 0x0d, 0xf4, 0x60, 0xdf, 0xd0, 0x22, 0x92, - 0xd6, 0x6a, 0xd9, 0x18, 0x4c, 0xd0, 0xd5, 0x33, 0x3f, 0x2d, 0x92, 0x2a, - 0xb8, 0x3d, 0x36, 0x7b, 0xc8, 0x31, 0x69, 0x9c, 0x1e, 0x60, 0x83, 0xf0, - 0x51, 0x39, 0xe1, 0x91, 0x11, 0x1f, 0x5f, 0x13, 0x6f, 0x62, 0xc3, 0x08, - 0xfa, 0xf9, 0xd4, 0xf5, 0xe3, 0x46, 0xce, 0x7a, 0xa8, 0xe4, 0xd5, 0x0f, - 0x42, 0x8e, 0xa0, 0x34, 0x12, 0x44, 0xa4, 0xa9, 0xa3, 0xa0, 0x49, 0xb2, - 0xfa, 0xb6, 0xef, 0x45, 0x8e, 0xdf, 0xb9, 0x16, 0xc2, 0x13, 0x50, 0x15, - 0x94, 0x07, 0x8b, 0x2b, 0x08, 0x25, 0x52, 0x2a, 0x3d, 0xf6, 0xe6, 0xd5, - 0x3c, 0x3c, 0xed, 0xbb, 0x2f, 0x82, 0x35, 0xb1, 0x61, 0x99, 0xad, 0x71, - 0xdb, 0x8e, 0x8f, 0x63, 0x21, 0x22, 0xdd, 0xf1, 0xdf, 0x17, 0xc7, 0x97, - 0x17, 0x1c, 0xd3, 0x0a, 0x98, 0x95, 0xba, 0xa6, 0x4c, 0x67, 0x6a, 0xcb, - 0x99, 0xe5, 0xa5, 0x50, 0x47, 0xc0, 0x75, 0x3d, 0x25, 0x4b, 0x31, 0x62, - 0xdc, 0x33, 0x9c, 0x79, 0x5d, 0xa9, 0x4d, 0xec, 0xab, 0x04, 0xc9, 0x3d, - 0xe4, 0x23, 0x34, 0xf5, 0x64, 0xb8, 0xf5, 0xf7, 0x71, 0x3e, 0x40, 0x53, - 0x14, 0xb6, 0xa6, 0xa1, 0xf0, 0x03, 0x75, 0xbd, 0xbb, 0xa8, 0x14, 0x49, - 0x79, 0x8a, 0xcd, 0x43, 0xac, 0x01, 0xe5, 0x0d, 0x23, 0x91, 0xeb, 0x9c, - 0xae, 0x49, 0x49, 0x5c, 0xb5, 0xeb, 0xd0, 0x79, 0x03, 0xa5, 0x4b, 0xf9, - 0x14, 0x61, 0xea, 0x40, 0xdb, 0x8a, 0x9e, 0xee, 0xec, 0x34, 0x9b, 0x8b, - 0x47, 0xd9, 0x9d, 0xb9, 0x26, 0x35, 0xe9, 0x43, 0x4a, 0xfb, 0x60, 0xbf, - 0x70, 0x99, 0x42, 0xd7, 0xe8, 0x5f, 0x91, 0xcc, 0xcc, 0x0b, 0x66, 0x66, - 0x84, 0x60, 0xd9, 0xe4, 0x50, 0x7e, 0x87, 0x24, 0x14, 0x5d, 0xb2, 0xea, - 0x51, 0x94, 0xfc, 0x14, 0xc3, 0x12, 0x8c, 0xad, 0xa6, 0x21, 0x12, 0xd9, - 0x56, 0x34, 0xfb, 0x59, 0xcb, 0x3c, 0x15, 0x24, 0x27, 0xe8, 0xe6, 0x59, - 0x0b, 0x41, 0x44, 0xc3, 0xcb, 0xb3, 0x8b, 0x28, 0xa8, 0x48, 0x5c, 0xe5, - 0xba, 0x88, 0x67, 0xe0, 0x27, 0x9c, 0x77, 0xb6, 0xd7, 0xe2, 0x3a, 0x70, - 0x49, 0x92, 0x12, 0x74, 0xc4, 0xd9, 0xf6, 0xbe, 0xd7, 0xe7, 0xde, 0xd1, - 0xa5, 0x73, 0xfb, 0x96, 0x34, 0x00, 0xce, 0x1a, 0x34, 0xb8, 0x33, 0xba, - 0x1f, 0x49, 0xf0, 0x9e, 0x05, 0xf6, 0x97, 0x3d, 0x39, 0x67, 0x67, 0x4b, - 0xd0, 0xba, 0xe4, 0x3b, 0x32, 0x19, 0x69, 0xe6, 0x23, 0x9b, 0xad, 0xd4, - 0x30, 0xe5, 0x8c, 0x81, 0x75, 0x52, 0x94, 0x33, 0x74, 0xe6, 0x01, 0xed, - 0xc4, 0xf2, 0x3f, 0xa8, 0x79, 0xfd, 0xf0, 0x39, 0x32, 0xd9, 0xd4, 0x8d, - 0xa2, 0x24, 0xa4, 0xb5, 0x3b, 0xea, 0x9b, 0x3d, 0x26, 0x51, 0x60, 0xa2, - 0x35, 0x7c, 0x25, 0xdc, 0xca, 0xc9, 0x46, 0x5e, 0xac, 0xd8, 0xf1, 0xeb, - 0x7c, 0x7e, 0x76, 0x71, 0x69, 0x05, 0x6d, 0xf4, 0xde, 0xc4, 0x47, 0xb5, - 0x13, 0xc4, 0xce, 0x7a, 0x48, 0x80, 0x41, 0x6d, 0xf3, 0xf6, 0x5a, 0xf2, - 0x02, 0xae, 0x87, 0x56, 0xb5, 0x0d, 0x2e, 0x84, 0x91, 0xaf, 0xcc, 0xf3, - 0xe5, 0xca, 0xe5, 0x80, 0xe5, 0x68, 0x2a, 0x0f, 0xf3, 0xe7, 0x76, 0x3f, - 0xa6, 0x4f, 0x02, 0x7d, 0xb2, 0xdb, 0x42, 0x1d, 0x2c, 0x80, 0x5f, 0x1c, - 0x0f, 0x2f, 0x65, 0xd5, 0xf8, 0xb7, 0xc6, 0xc8, 0x25, 0x15, 0x52, 0x3f, - 0x6c, 0x75, 0x2c, 0x81, 0x3a, 0x38, 0x44, 0x66, 0xa6, 0x75, 0xe6, 0x9c, - 0x37, 0x28, 0x58, 0xb3, 0x27, 0x41, 0x48, 0x1f, 0x18, 0xa7, 0xd2, 0xca, - 0xa5, 0xd5, 0x1d, 0x8c, 0x3a, 0xda, 0x49, 0x87, 0xae, 0x5c, 0x39, 0x14, - 0x59, 0x7e, 0x1b, 0xb4, 0xf0, 0x34, 0x60, 0x16, 0xcc, 0xdc, 0xb5, 0x81, - 0x13, 0xb3, 0x8c, 0xf3, 0x87, 0xce, 0xf9, 0x7c, 0x9d, 0xcc, 0x8d, 0x30, - 0xe4, 0x39, 0xdf, 0xce, 0x33, 0x97, 0x17, 0x6d, 0xe2, 0x51, 0x30, 0x14, - 0xfe, 0xd8, 0xa2, 0xe1, 0xe1, 0x68, 0xac, 0x91, 0xdd, 0x93, 0xe7, 0x6e, - 0x15, 0x59, 0x74, 0x76, 0xae, 0x1d, 0x99, 0x7e, 0x70, 0x17, 0xb1, 0x6b, - 0x2c, 0x9d, 0x2f, 0x13, 0x2d, 0xda, 0x11, 0xe7, 0xd3, 0x14, 0xa1, 0xac, - 0xe2, 0x9b, 0x69, 0x18, 0xa2, 0x35, 0xc2, 0xd0, 0xf7, 0xa3, 0x17, 0x11, - 0xa9, 0xf1, 0x7e, 0xb7, 0x24, 0xd9, 0x10, 0x27, 0xd9, 0xcb, 0x78, 0x74, - 0x70, 0xe7, 0xee, 0xb6, 0x18, 0x44, 0xe7, 0x8c, 0xe5, 0x0a, 0x13, 0x7b, - 0xf1, 0x1f, 0xbe, 0x35, 0x39, 0x2c, 0x8c, 0x31, 0xce, 0xd7, 0x27, 0x84, - 0xd3, 0x94, 0x8b, 0x70, 0xe3, 0x13, 0xfe, 0x35, 0x40, 0x86, 0x6c, 0x4c, - 0xf9, 0x85, 0x7f, 0xb9, 0xa0, 0x89, 0x90, 0x6e, 0x52, 0x7f, 0xe4, 0xa9, - 0xd2, 0x16, 0x29, 0x2e, 0x68, 0x82, 0x3b, 0x00, 0x7b, 0xe6, 0x33, 0xcd, - 0x5b, 0x92, 0x72, 0x7c, 0x23, 0x5a, 0xb8, 0xb2, 0x67, 0x4c, 0x8c, 0x95, - 0xe7, 0x7c, 0x53, 0x72, 0x27, 0x1c, 0xc8, 0x3a, 0x01, 0xe8, 0x82, 0xce, - 0x0d, 0x97, 0x4b, 0xa2, 0xb6, 0xe6, 0xcc, 0x70, 0xa7, 0xe6, 0x3b, 0xf7, - 0xd9, 0x5e, 0xcc, 0x33, 0x47, 0x76, 0x78, 0xda, 0x0a, 0x8f, 0xd7, 0x80, - 0x69, 0x9f, 0x0a, 0x35, 0x3a, 0xd2, 0x71, 0xd7, 0x58, 0x65, 0x74, 0xdc, - 0xb1, 0xcb, 0x20, 0xc5, 0x76, 0xb3, 0x6a, 0x89, 0x52, 0x30, 0x41, 0x53, - 0xcf, 0x7c, 0x53, 0x57, 0x9c, 0xf9, 0xe7, 0xda, 0xf2, 0x3c, 0xc8, 0x43, - 0xb1, 0xa5, 0xee, 0x31, 0xd5, 0x13, 0xe4, 0x2a, 0x6b, 0x68, 0x0a, 0xd5, - 0xfb, 0xe3, 0xa9, 0x10, 0xc3, 0x65, 0x96, 0x49, 0x59, 0x4c, 0x17, 0xeb, - 0x37, 0x90, 0x28, 0xc2, 0xa6, 0xd9, 0xbd, 0xe8, 0xa9, 0x7a, 0xa5, 0x15, - 0xcb, 0xd8, 0x6b, 0xd0, 0xa8, 0xb5, 0xbb, 0x9c, 0x35, 0xca, 0xe5, 0x3c, - 0xfd, 0x4c, 0xd5, 0xb7, 0xdb, 0x39, 0x17, 0x8f, 0xbf, 0x3c, 0x3e, 0x7d, - 0x7b, 0x7c, 0xe9, 0x00, 0x3b, 0x6c, 0x42, 0xc1, 0xf3, 0x2f, 0xd4, 0xb0, - 0xa5, 0xda, 0x95, 0xe1, 0x12, 0xd7, 0xdd, 0xaf, 0xcf, 0x76, 0x9d, 0x6d, - 0x87, 0x23, 0xe7, 0xba, 0x85, 0x9c, 0xbf, 0x20, 0x7e, 0x0e, 0x65, 0x8a, - 0xbf, 0x8e, 0xde, 0x1c, 0x3d, 0xe3, 0x60, 0xfe, 0xeb, 0x24, 0x67, 0x64, - 0x74, 0xaf, 0xec, 0x64, 0x01, 0x27, 0x78, 0xb6, 0x17, 0xe0, 0x49, 0xc8, - 0x65, 0x96, 0xea, 0xf9, 0x60, 0x31, 0x96, 0x56, 0x88, 0xf3, 0x4f, 0x49, - 0x51, 0x15, 0x6b, 0x20, 0x34, 0x6b, 0xb1, 0x32, 0x2a, 0x76, 0x88, 0xc8, - 0x06, 0xf5, 0x7a, 0xc9, 0x55, 0x36, 0xf1, 0xec, 0x89, 0x67, 0x13, 0xf9, - 0x6a, 0xc1, 0xa8, 0x67, 0x52, 0x50, 0xb9, 0x85, 0x66, 0x9f, 0x09, 0x6b, - 0x3a, 0x94, 0x93, 0xc5, 0xf2, 0x62, 0xf3, 0x35, 0x0e, 0x49, 0x12, 0x73, - 0x5b, 0xf0, 0xde, 0xb3, 0x50, 0x5f, 0x2b, 0xb4, 0x92, 0x2a, 0xad, 0x1f, - 0x4a, 0x06, 0xa0, 0xfa, 0xb3, 0x7f, 0xf6, 0xb9, 0x7b, 0x96, 0xeb, 0x49, - 0xa6, 0x73, 0x05, 0xa3, 0x79, 0xe4, 0x0d, 0x95, 0x32, 0xe5, 0xf2, 0xf5, - 0x31, 0x32, 0x22, 0x5b, 0x04, 0x6b, 0x1f, 0xbc, 0xf2, 0xa2, 0xaa, 0x8e, - 0x02, 0xe7, 0xd4, 0xd7, 0xb8, 0xe0, 0x49, 0xa5, 0x8b, 0x9b, 0x90, 0xfc, - 0x9f, 0xcb, 0x5d, 0x78, 0xce, 0xe1, 0x90, 0x95, 0xfd, 0x34, 0x36, 0x53, - 0x41, 0x01, 0xb0, 0xd3, 0x24, 0xd4, 0x75, 0x78, 0x60, 0x6f, 0xd4, 0x49, - 0x93, 0x1f, 0x0d, 0x2e, 0x8f, 0xe7, 0xbb, 0x4a, 0x95, 0x34, 0xe5, 0xec, - 0x7a, 0x4e, 0x3a, 0xfe, 0xa4, 0x59, 0x16, 0x34, 0x78, 0x7c, 0x4f, 0x8f, - 0xa4, 0x54, 0xd4, 0x05, 0xdb, 0x61, 0xfc, 0x61, 0xff, 0xc0, 0x13, 0xa5, - 0x5a, 0x71, 0xa5, 0x49, 0xb1, 0x74, 0x06, 0x7e, 0x66, 0x1b, 0x62, 0x52, - 0x09, 0xad, 0x7f, 0xfe, 0x54, 0xa5, 0x1b, 0x93, 0x42, 0x99, 0xf3, 0xf3, - 0x42, 0x4c, 0x19, 0x6c, 0xa1, 0xc1, 0x08, 0x9f, 0xeb, 0xe5, 0xa2, 0x5b, - 0x59, 0x5a, 0xe9, 0x6e, 0xe5, 0x81, 0x05, 0xe2, 0x6a, 0xef, 0xd3, 0xb9, - 0xc6, 0x7f, 0x37, 0x5e, 0x7f, 0xbe, 0xc6, 0xaa, 0xa1, 0xbe, 0x88, 0x63, - 0xd0, 0x52, 0xf0, 0xfc, 0xa7, 0xee, 0x24, 0x38, 0x90, 0xae, 0x9e, 0x8b, - 0xf3, 0x82, 0x57, 0xdb, 0xa0, 0x14, 0xed, 0x20, 0x41, 0xaf, 0x5e, 0xf8, - 0xaa, 0x18, 0x6d, 0xae, 0x3c, 0xd7, 0x3d, 0xe9, 0xe4, 0x51, 0x1a, 0x1c, - 0xe3, 0xe7, 0x42, 0x52, 0xaf, 0xe1, 0x49, 0xb6, 0x73, 0xc0, 0xe1, 0xb8, - 0x21, 0xca, 0xb5, 0x7f, 0xfa, 0x85, 0xd2, 0x86, 0xdd, 0x48, 0x26, 0x08, - 0xae, 0x7d, 0xe3, 0xd3, 0x9d, 0x50, 0x2c, 0x9c, 0xb0, 0x2d, 0x4d, 0xd2, - 0xa9, 0xd7, 0xbe, 0x20, 0x94, 0x71, 0x42, 0x8c, 0xfa, 0x9a, 0x88, 0x1a, - 0xcf, 0x78, 0x18, 0x01, 0xff, 0xd8, 0x5e, 0x95, 0xad, 0x85, 0x42, 0x4a, - 0x74, 0x72, 0x14, 0x3c, 0xf8, 0xc4, 0x4f, 0x30, 0x9e, 0xf2, 0x7d, 0xbb, - 0x12, 0x4d, 0xbf, 0x50, 0xa0, 0xf1, 0xe0, 0xd1, 0xa7, 0x1a, 0x85, 0xc9, - 0xf1, 0xb7, 0x37, 0xb2, 0xfe, 0x8d, 0x67, 0x84, 0x1c, 0x0e, 0x5d, 0xe1, - 0x65, 0x09, 0xa7, 0x2c, 0xda, 0xae, 0xd9, 0x4f, 0x9f, 0x3f, 0xf2, 0xac, - 0x5e, 0x4b, 0x85, 0xbb, 0x4c, 0x83, 0xf7, 0x3e, 0x6d, 0x1e, 0x73, 0x13, - 0xbc, 0x2d, 0x5a, 0x59, 0x4f, 0x5a, 0xb4, 0xc9, 0xc1, 0xd7, 0xff, 0x61, - 0xa6, 0x95, 0x9c, 0xa3, 0x30, 0x8b, 0xff, 0x08, 0xc7, 0xfb, 0x59, 0x18, - 0xf2, 0x2c, 0x76, 0x15, 0x57, 0x93, 0x21, 0x84, 0xc6, 0xf5, 0xd5, 0x4d, - 0xb0, 0x3a, 0x41, 0x0b, 0xb2, 0xe7, 0x74, 0x53, 0x07, 0x75, 0xa2, 0x55, - 0xd3, 0xd2, 0x14, 0x75, 0x8b, 0x78, 0xd2, 0xd1, 0x7d, 0x4d, 0x9b, 0x0a, - 0xea, 0x08, 0xac, 0x53, 0x3b, 0xb5, 0x63, 0x50, 0xdc, 0x2c, 0x45, 0xb5, - 0x75, 0x33, 0xf2, 0xe5, 0xec, 0x83, 0xd7, 0xf6, 0x3c, 0xf7, 0xd2, 0x8b, - 0x55, 0xf2, 0x30, 0x0e, 0x19, 0xfe, 0x57, 0xf4, 0xdf, 0x08, 0xa4, 0xc8, - 0x57, 0x31, 0x0d, 0x08, 0xb5, 0x62, 0x0c, 0xf4, 0x60, 0x33, 0x6e, 0x4f, - 0xcc, 0xd2, 0x38, 0xea, 0xa0, 0x1b, 0x15, 0x1e, 0xd8, 0x81, 0x4b, 0xbb, - 0x74, 0x93, 0x8c, 0x6f, 0xed, 0xc8, 0xb8, 0x36, 0x9a, 0x6f, 0x7d, 0xff, - 0xbd, 0xf0, 0x1c, 0x07, 0xf9, 0xa2, 0xd6, 0x53, 0x07, 0x68, 0x4e, 0x67, - 0x54, 0x60, 0xc4, 0x79, 0xbb, 0x51, 0xcc, 0x3a, 0x4f, 0xa6, 0x09, 0x03, - 0x87, 0x89, 0x64, 0x8a, 0x85, 0x6e, 0x0b, 0x7e, 0xe4, 0x88, 0x10, 0x29, - 0xc5, 0x93, 0x28, 0xb8, 0xdc, 0x9c, 0xfd, 0xd7, 0x6a, 0xa0, 0xa0, 0x11, - 0x1c, 0xbc, 0xbb, 0xfc, 0xfa, 0xec, 0x62, 0x18, 0x6d, 0x73, 0x9e, 0xf4, - 0xe5, 0xc5, 0xc9, 0x97, 0xef, 0x48, 0xe1, 0x73, 0x96, 0xe7, 0xa3, 0x98, - 0x14, 0xc1, 0x29, 0x87, 0x6a, 0x24, 0xf3, 0x51, 0x92, 0x5f, 0x1b, 0xf0, - 0x38, 0x90, 0x4d, 0x98, 0x77, 0x67, 0xb9, 0xaf, 0xd2, 0x21, 0x85, 0xb0, - 0xcd, 0xb2, 0x8e, 0xf0, 0xaf, 0x94, 0xbe, 0xcb, 0xbc, 0x36, 0x93, 0x56, - 0x73, 0xdf, 0x7d, 0xf5, 0xf5, 0xcb, 0xaf, 0x0f, 0xde, 0x7e, 0x33, 0x34, - 0x74, 0xbb, 0xef, 0xbe, 0xfb, 0x2e, 0x74, 0xbc, 0xec, 0x6f, 0x6f, 0x03, - 0xcf, 0xec, 0x26, 0x7e, 0x78, 0x18, 0x14, 0xc9, 0xc6, 0x06, 0x9d, 0xa3, - 0x0d, 0x9f, 0x4b, 0xa0, 0x90, 0xc7, 0xc5, 0x92, 0x6e, 0x3a, 0xfa, 0x7a, - 0x7b, 0xb1, 0x1c, 0x31, 0xc4, 0xf2, 0xf6, 0xb2, 0xd4, 0x82, 0x12, 0x78, - 0x7b, 0x7b, 0x63, 0x63, 0x78, 0x7c, 0x1c, 0x1d, 0x9c, 0x0e, 0xcf, 0x82, - 0x77, 0x37, 0x77, 0xb7, 0x48, 0x12, 0xb8, 0x4e, 0x4a, 0xfa, 0x65, 0x63, - 0xe3, 0xf4, 0xe0, 0x92, 0x95, 0x9c, 0x6f, 0x8f, 0x2f, 0x86, 0x27, 0x67, - 0x6f, 0x79, 0x77, 0x18, 0x08, 0x22, 0x9e, 0xde, 0x33, 0xf6, 0xd6, 0x55, - 0x8a, 0x3c, 0xcd, 0x7b, 0x2b, 0xe5, 0xc0, 0xe0, 0x26, 0x24, 0xaa, 0x88, - 0xec, 0x26, 0x8e, 0x25, 0xab, 0xf3, 0x23, 0x31, 0x01, 0x25, 0xab, 0x1a, - 0xe6, 0x7d, 0xdc, 0x88, 0xbc, 0xa1, 0x43, 0xa0, 0xde, 0x93, 0x91, 0x84, - 0xcc, 0xf4, 0x04, 0x81, 0x00, 0xc1, 0xea, 0x01, 0x44, 0x42, 0xeb, 0xc4, - 0x87, 0x27, 0x6f, 0xce, 0x49, 0xe6, 0x7f, 0x37, 0x3c, 0xf8, 0xea, 0x98, - 0x1f, 0xfd, 0x2a, 0x29, 0xfd, 0x76, 0x48, 0xc9, 0x09, 0xee, 0xe4, 0x6d, - 0x52, 0x16, 0xe3, 0x78, 0xc1, 0x71, 0xe7, 0xd4, 0x4d, 0x5f, 0xf8, 0x62, - 0xd0, 0xb6, 0x48, 0x7f, 0x1e, 0x8c, 0x7a, 0xae, 0xcf, 0x03, 0x29, 0x3a, - 0x6c, 0xf7, 0xe2, 0xf8, 0xe0, 0xe8, 0xcd, 0xb1, 0x05, 0x54, 0xc9, 0x3d, - 0x42, 0x8d, 0xde, 0x64, 0x5c, 0xbd, 0xc6, 0x99, 0x3e, 0xf9, 0xae, 0xe2, - 0xc5, 0xa7, 0x6f, 0xb8, 0x24, 0x43, 0x7b, 0x77, 0x7e, 0xa3, 0xf0, 0xec, - 0xe0, 0x2a, 0xdd, 0x96, 0xd6, 0xad, 0xbf, 0xd8, 0x2d, 0x89, 0x45, 0x26, - 0xa9, 0xfc, 0x26, 0x6a, 0x2c, 0xd4, 0xdf, 0xcf, 0x76, 0x76, 0x76, 0x1e, - 0x99, 0x07, 0x0c, 0x8d, 0x7a, 0x0b, 0xd0, 0x54, 0xf6, 0xf9, 0xf1, 0x6d, - 0xdf, 0xbe, 0x51, 0x66, 0x68, 0xb6, 0xe5, 0x3f, 0xe7, 0xa2, 0x78, 0xa7, - 0x65, 0xd2, 0x3e, 0xe8, 0x71, 0x96, 0xb9, 0x3d, 0xa8, 0x2c, 0xcf, 0x84, - 0x71, 0x6e, 0xd2, 0x32, 0xc0, 0x49, 0xb3, 0xa1, 0x4f, 0x52, 0xb0, 0x9f, - 0x38, 0x5f, 0xd5, 0x9b, 0xe4, 0x6f, 0xa8, 0x4d, 0xfe, 0x31, 0xc8, 0xf2, - 0xeb, 0xed, 0xd9, 0x3e, 0x2e, 0x59, 0x7a, 0xe8, 0x75, 0x82, 0xba, 0x3f, - 0xf7, 0x99, 0x0b, 0x3d, 0x2a, 0x78, 0x69, 0x39, 0xca, 0xf1, 0x23, 0xc6, - 0xf5, 0x0b, 0xd6, 0x01, 0xdb, 0xc9, 0xf5, 0x65, 0x65, 0xe6, 0x16, 0x8e, - 0xd1, 0xd2, 0x49, 0xc1, 0x5b, 0xc6, 0x66, 0xa6, 0x01, 0xb1, 0x10, 0xea, - 0x85, 0x3e, 0x17, 0x22, 0xa1, 0x5f, 0x73, 0x22, 0x9a, 0x41, 0xf9, 0x50, - 0xf2, 0x5b, 0xec, 0xac, 0x55, 0x6b, 0x31, 0x60, 0xab, 0x88, 0x65, 0xe5, - 0x19, 0xc9, 0xe8, 0xb1, 0xa4, 0xdf, 0x0c, 0x11, 0xd6, 0x1e, 0x44, 0xa3, - 0x21, 0xd4, 0x9d, 0x1b, 0xae, 0xf7, 0xd9, 0xef, 0x83, 0x82, 0x0a, 0x47, - 0x2f, 0x1f, 0xd1, 0x79, 0x30, 0x29, 0x59, 0xfd, 0xb9, 0x5e, 0x1c, 0x01, - 0xf5, 0x0c, 0x69, 0x14, 0x8d, 0xbe, 0x00, 0xb2, 0x94, 0x23, 0xe8, 0xad, - 0x90, 0xee, 0x50, 0xb4, 0x66, 0x90, 0x48, 0xa1, 0x2a, 0xf4, 0x45, 0x7b, - 0xb2, 0x8d, 0x68, 0x9c, 0x8f, 0xee, 0xe9, 0xf0, 0xdc, 0xd5, 0xc0, 0xa1, - 0x15, 0xb8, 0xe3, 0x25, 0xb8, 0x4d, 0x30, 0xfb, 0x50, 0xd6, 0x7d, 0x64, - 0x30, 0xfb, 0xb4, 0x0a, 0xfc, 0xc6, 0x7f, 0x6f, 0x0f, 0x8a, 0xe2, 0x66, - 0x3b, 0x9d, 0xbc, 0x9f, 0x14, 0x31, 0x7d, 0x46, 0x7c, 0xad, 0xf1, 0xf1, - 0x80, 0x3e, 0x8c, 0xfe, 0x52, 0xe1, 0xfb, 0xc5, 0xb8, 0x7d, 0x26, 0xff, - 0xbd, 0xcd, 0xe0, 0x5f, 0x00, 0x28, 0x0e, 0x16, 0xae, 0x85, 0x7b, 0xd0, - 0xac, 0x04, 0x67, 0x8e, 0x8e, 0x63, 0x3b, 0x65, 0xf4, 0xaf, 0xa3, 0x8e, - 0x92, 0xdb, 0x8f, 0x7b, 0x3b, 0x3b, 0xbb, 0xfb, 0xbb, 0x9f, 0xbd, 0xd8, - 0xd9, 0xdf, 0xdd, 0xdd, 0xdd, 0xdb, 0xdf, 0xdd, 0xdf, 0xdf, 0xdb, 0xf9, - 0x69, 0xbb, 0xb3, 0xb1, 0x71, 0x74, 0xf6, 0xdd, 0xdb, 0xd3, 0xb3, 0x83, - 0xa3, 0xe8, 0xf2, 0x8c, 0xf4, 0x5d, 0xb6, 0x55, 0xb4, 0x9c, 0x74, 0xa0, - 0x3e, 0x95, 0x99, 0xdc, 0x6c, 0x71, 0x50, 0xa2, 0xa3, 0xd1, 0x65, 0x06, - 0xa1, 0x98, 0x5f, 0x1a, 0xdc, 0x94, 0xb3, 0x0f, 0xb3, 0xaf, 0x8f, 0xe9, - 0xa4, 0x27, 0x51, 0x61, 0x5e, 0xef, 0xc1, 0xd6, 0x1a, 0x91, 0x2a, 0x94, - 0xa9, 0x2b, 0x3a, 0x0e, 0x27, 0x9b, 0x8b, 0x0a, 0xdc, 0x14, 0xd7, 0xb4, - 0x8f, 0x9b, 0x94, 0xe2, 0x24, 0x45, 0x35, 0xa0, 0xc1, 0x15, 0x0b, 0x50, - 0xbf, 0xa5, 0x14, 0x66, 0x27, 0x79, 0x60, 0xab, 0x31, 0xc1, 0xb3, 0xb5, - 0x53, 0xa2, 0x8b, 0x27, 0x79, 0xc0, 0xac, 0xab, 0x6c, 0x42, 0x90, 0xcc, - 0xfc, 0xec, 0x80, 0x60, 0x64, 0x9a, 0x5c, 0x9a, 0xdb, 0x90, 0xe1, 0xbe, - 0x6e, 0xe9, 0x8e, 0xfb, 0x31, 0xee, 0xe1, 0xbb, 0xe0, 0x6f, 0xc2, 0x4b, - 0x67, 0xdb, 0x99, 0x9f, 0x64, 0x00, 0xef, 0x86, 0x27, 0x6f, 0xbf, 0x82, - 0x7f, 0xe9, 0xbb, 0xb3, 0x8b, 0xa3, 0x21, 0x35, 0xcb, 0xb7, 0xf1, 0x06, - 0x2c, 0x10, 0x7c, 0x68, 0x75, 0x54, 0x72, 0x04, 0xb8, 0xeb, 0x3f, 0x41, - 0xe3, 0x98, 0xf4, 0x5c, 0xea, 0x01, 0x86, 0x19, 0x48, 0x8b, 0x9c, 0x52, - 0xd0, 0xce, 0xe0, 0x70, 0x1a, 0xe4, 0xf5, 0x2f, 0x66, 0x31, 0x83, 0xc1, - 0x26, 0x03, 0x41, 0x55, 0x43, 0x24, 0xc1, 0x36, 0xc3, 0xaa, 0x6c, 0xb3, - 0xd4, 0xba, 0x5d, 0x66, 0x60, 0x15, 0x68, 0x25, 0xcb, 0x1d, 0x80, 0x6e, - 0x65, 0x45, 0xf8, 0x8c, 0x5d, 0x4d, 0xe3, 0x6b, 0x74, 0xd8, 0x3c, 0x7e, - 0x41, 0x67, 0xda, 0xfd, 0xc7, 0x76, 0x89, 0x9a, 0x7d, 0xdc, 0xde, 0x09, - 0x08, 0x00, 0xd9, 0xee, 0xc8, 0x93, 0x50, 0xc3, 0xb8, 0x48, 0x48, 0xa8, - 0x31, 0xc3, 0x2e, 0x76, 0x2e, 0x84, 0x51, 0x47, 0xfa, 0xd5, 0x02, 0x95, - 0x1b, 0x62, 0x54, 0xe8, 0x07, 0x69, 0x51, 0x22, 0xd9, 0xa3, 0x92, 0x9c, - 0x57, 0xa0, 0x0b, 0xc4, 0xc3, 0xa3, 0x4f, 0x24, 0x7a, 0x41, 0x5f, 0x94, - 0x25, 0xe7, 0xc1, 0xd0, 0xd8, 0x23, 0x89, 0x88, 0xe1, 0xdc, 0x1f, 0x15, - 0xd9, 0x3a, 0x0c, 0xb3, 0x9c, 0x8e, 0xd3, 0xb2, 0x63, 0x49, 0x46, 0x1e, - 0x78, 0xcb, 0x3b, 0xc0, 0x8a, 0x92, 0x86, 0x12, 0xd3, 0xed, 0xa1, 0x55, - 0x47, 0x34, 0xe9, 0x36, 0x9b, 0xcd, 0x24, 0x1b, 0xb3, 0xc3, 0x09, 0x28, - 0xbe, 0x95, 0x54, 0x73, 0xa9, 0x5c, 0x5d, 0x0d, 0xe6, 0xb3, 0xdc, 0xbb, - 0xa4, 0x7f, 0x48, 0x34, 0xbe, 0xb1, 0x74, 0x6f, 0xf7, 0x61, 0x76, 0x4c, - 0x12, 0x27, 0xf1, 0x4a, 0xa1, 0x1c, 0x8d, 0xe9, 0x0f, 0x90, 0xfd, 0x2b, - 0xcb, 0x16, 0x56, 0x2f, 0x69, 0x70, 0xd5, 0x6a, 0x6a, 0xc8, 0x06, 0x02, - 0x81, 0x5d, 0x32, 0x53, 0xb0, 0x3c, 0x5a, 0x50, 0xcf, 0xbd, 0xca, 0x7b, - 0x91, 0x96, 0x45, 0x32, 0xbd, 0xd2, 0x22, 0x74, 0x5a, 0xf7, 0x6d, 0xb4, - 0x0a, 0x1a, 0x90, 0x49, 0x48, 0xfc, 0xef, 0x72, 0xee, 0x32, 0x62, 0x32, - 0xe5, 0x19, 0xd7, 0x60, 0x9c, 0x8a, 0xe0, 0x5d, 0x65, 0x14, 0xe2, 0x99, - 0x19, 0x18, 0xc4, 0xed, 0x46, 0xe4, 0x00, 0x7a, 0x6b, 0x53, 0x70, 0x68, - 0x70, 0x80, 0xe4, 0x02, 0x75, 0x04, 0x0f, 0x2e, 0x47, 0xb4, 0xda, 0xee, - 0x39, 0x5e, 0x3b, 0xb6, 0x71, 0x63, 0xd5, 0x0e, 0xc3, 0xb2, 0x2a, 0x02, - 0x43, 0x68, 0x70, 0x7e, 0x7e, 0x50, 0x34, 0x40, 0x18, 0xc5, 0xe9, 0xa0, - 0x21, 0x58, 0x75, 0x59, 0xb8, 0x15, 0x05, 0x8a, 0x77, 0xec, 0x8a, 0x07, - 0xb5, 0x1d, 0x43, 0xe5, 0x48, 0xeb, 0xcf, 0xe1, 0x87, 0x8f, 0x60, 0x73, - 0x48, 0x26, 0xf4, 0x4f, 0x57, 0x72, 0x4a, 0xd2, 0xf9, 0xe3, 0x87, 0x51, - 0x07, 0xf1, 0x51, 0x1d, 0x63, 0xae, 0x9a, 0x97, 0x04, 0x6b, 0xa8, 0x8f, - 0x92, 0x11, 0x07, 0x2c, 0x22, 0xed, 0x5b, 0xd0, 0x3e, 0x2b, 0x70, 0x8e, - 0x38, 0x08, 0x12, 0xe6, 0xbb, 0x1f, 0x7d, 0x19, 0x17, 0xe9, 0xb8, 0x17, - 0x1d, 0xa5, 0x24, 0xab, 0x97, 0x3d, 0x8f, 0xc9, 0xe8, 0x90, 0x2c, 0x07, - 0xd1, 0x77, 0x56, 0x1d, 0x94, 0xee, 0x5c, 0xc4, 0x9e, 0xc2, 0xb4, 0xe8, - 0x12, 0xd5, 0x36, 0xc4, 0x66, 0xab, 0x56, 0xd7, 0x30, 0x29, 0x0c, 0x6d, - 0x7b, 0xb8, 0x39, 0x6c, 0x66, 0x5c, 0xdc, 0x56, 0x81, 0xd6, 0x45, 0xaa, - 0x2a, 0xd8, 0x76, 0xc8, 0x22, 0x10, 0xd6, 0x77, 0xae, 0x85, 0x2e, 0x94, - 0xe6, 0xb2, 0xb9, 0x05, 0x28, 0x79, 0x47, 0xaa, 0xda, 0x72, 0x0a, 0x0d, - 0x9b, 0x31, 0x4f, 0x2f, 0x6e, 0x23, 0x3b, 0xae, 0x1b, 0x08, 0x2d, 0xa7, - 0x75, 0xe2, 0x15, 0x51, 0x7e, 0x72, 0x76, 0x79, 0xfc, 0xbb, 0x68, 0x98, - 0x72, 0x9d, 0x45, 0x47, 0x39, 0x7c, 0xc8, 0xd9, 0xd9, 0xad, 0x5e, 0xa8, - 0xc6, 0x9e, 0xba, 0x34, 0x55, 0x35, 0x0b, 0x5a, 0x2e, 0x84, 0x94, 0xcf, - 0xb9, 0x97, 0xf2, 0xe5, 0xbc, 0x32, 0xa0, 0xd9, 0xbb, 0x34, 0x8e, 0x5c, - 0x01, 0x6b, 0x9e, 0xfb, 0x7b, 0x26, 0xfd, 0xf7, 0x1e, 0x62, 0x7c, 0xa9, - 0x2f, 0x02, 0x00, 0x8e, 0xdb, 0x51, 0x9b, 0x00, 0x6c, 0x29, 0xe3, 0x34, - 0xa7, 0x2b, 0x98, 0xf9, 0xd4, 0x58, 0xcc, 0x80, 0x88, 0x71, 0xc3, 0xd8, - 0xd9, 0xcc, 0x11, 0x8f, 0x88, 0xae, 0xb0, 0x5c, 0x63, 0xa4, 0xc3, 0x09, - 0x3c, 0xb8, 0x9a, 0x16, 0xed, 0xdc, 0x85, 0xac, 0x14, 0x09, 0xa1, 0x48, - 0xab, 0x43, 0x85, 0x0e, 0x85, 0x20, 0xdc, 0x40, 0xdc, 0x18, 0xb5, 0x0a, - 0x59, 0x62, 0xee, 0x6e, 0xb6, 0x40, 0xb6, 0xe3, 0xb0, 0x1e, 0xa6, 0xd3, - 0x49, 0x34, 0x5b, 0x69, 0xca, 0xb3, 0xf2, 0x61, 0xce, 0xd1, 0x81, 0xba, - 0xf2, 0xd9, 0x67, 0x8d, 0x7b, 0xf7, 0xc1, 0x3d, 0xbd, 0x4f, 0x5f, 0x07, - 0x6a, 0xd1, 0x94, 0x7d, 0x8e, 0x56, 0x0a, 0xc8, 0xeb, 0x46, 0x0d, 0x99, - 0x33, 0x4c, 0x63, 0x94, 0x0e, 0x9d, 0xfd, 0xb0, 0x65, 0x5f, 0x5c, 0xb5, - 0xa3, 0x0d, 0x11, 0xba, 0x65, 0x9c, 0x71, 0x21, 0x9e, 0xeb, 0x35, 0x52, - 0xa8, 0x9d, 0xbc, 0xfa, 0x60, 0x03, 0x01, 0x85, 0x84, 0xa4, 0x01, 0xcb, - 0x34, 0x2c, 0x6f, 0x0d, 0x33, 0x6d, 0x98, 0x73, 0x4e, 0x74, 0x30, 0x0e, - 0xb3, 0xb0, 0x7a, 0xd6, 0x06, 0x0e, 0x32, 0xdf, 0xdd, 0x18, 0xfd, 0x77, - 0xeb, 0x87, 0xf3, 0xee, 0x9f, 0x19, 0xce, 0x41, 0xf4, 0x68, 0xb0, 0x9f, - 0xd6, 0x3f, 0x60, 0x26, 0x52, 0xe8, 0x49, 0x9d, 0x64, 0x30, 0x08, 0x19, - 0xfd, 0xc9, 0x1a, 0x8d, 0xd9, 0x09, 0x30, 0xaa, 0x62, 0x4d, 0x36, 0xd5, - 0x95, 0x79, 0x26, 0x4f, 0x43, 0x7e, 0xe4, 0xf6, 0x7b, 0x36, 0x94, 0x8f, - 0x1d, 0xae, 0xe5, 0xb9, 0x5b, 0xb4, 0xaa, 0xef, 0x4f, 0x32, 0xb0, 0xa4, - 0x85, 0x20, 0xe6, 0x5f, 0x10, 0xc8, 0xe5, 0x79, 0xc6, 0x1e, 0x7f, 0x40, - 0xe0, 0x06, 0x0d, 0xd6, 0x97, 0x90, 0xe3, 0x99, 0x20, 0x33, 0xaa, 0xf6, - 0x9a, 0x7e, 0xb6, 0x2b, 0x70, 0x4d, 0xc4, 0x1e, 0x15, 0x1b, 0x8f, 0xf4, - 0x4c, 0xba, 0xac, 0x16, 0x08, 0x3f, 0xac, 0x96, 0xeb, 0x92, 0x7b, 0x45, - 0x8a, 0xce, 0x63, 0xe5, 0x82, 0x5a, 0xd6, 0x28, 0xfc, 0x25, 0x63, 0x94, - 0xba, 0xc6, 0x5a, 0x0e, 0x45, 0x8a, 0xac, 0xe2, 0x9e, 0x4f, 0x12, 0x69, - 0xa9, 0x5c, 0x1b, 0x06, 0x7c, 0x18, 0x30, 0x5e, 0x21, 0x67, 0xb0, 0xef, - 0xe8, 0x6a, 0x99, 0x23, 0x3c, 0x43, 0xb3, 0xd1, 0x35, 0x99, 0x90, 0x1a, - 0xbd, 0x38, 0x78, 0xfb, 0xd5, 0x31, 0xce, 0x3b, 0xb3, 0x5d, 0x9f, 0x3a, - 0xcb, 0xb9, 0x71, 0x7d, 0x38, 0x8b, 0x0b, 0x01, 0xeb, 0x48, 0xf9, 0x8d, - 0xc9, 0x72, 0xcc, 0x7e, 0xea, 0x77, 0x7a, 0x0c, 0xd2, 0x02, 0x38, 0x9d, - 0xd3, 0x94, 0x07, 0xc1, 0x2c, 0x57, 0x5d, 0xc2, 0x1b, 0x91, 0xa9, 0xa7, - 0xe0, 0x18, 0x2c, 0xd2, 0xd0, 0x0a, 0x41, 0x97, 0x2d, 0x96, 0xa3, 0x45, - 0xac, 0x29, 0x5a, 0x71, 0x98, 0xf5, 0xa3, 0x9a, 0xc0, 0xa0, 0x32, 0x05, - 0xbe, 0x3b, 0x24, 0x20, 0xd2, 0x49, 0x9d, 0x39, 0xa4, 0xce, 0x41, 0xa8, - 0x71, 0x09, 0x3e, 0xd2, 0xee, 0xce, 0x8e, 0xc7, 0xdc, 0xf1, 0xd9, 0x4b, - 0x0d, 0x22, 0xcb, 0xa3, 0x9d, 0xfe, 0x8b, 0x17, 0xeb, 0xe8, 0xc7, 0x35, - 0x8a, 0x2c, 0x94, 0x67, 0x1f, 0xdd, 0x66, 0x9f, 0x1f, 0x5d, 0xd7, 0x66, - 0x8b, 0x6c, 0x81, 0x32, 0x1d, 0xea, 0x8e, 0x2f, 0x5c, 0xcc, 0x87, 0xea, - 0x20, 0x62, 0xfb, 0x82, 0x2d, 0x72, 0xee, 0x04, 0x0c, 0x5e, 0xca, 0x8d, - 0xc8, 0x49, 0x02, 0x80, 0x90, 0x32, 0x75, 0x65, 0xc1, 0x1e, 0xf9, 0xd4, - 0x99, 0x68, 0x3f, 0x6a, 0x61, 0x02, 0x11, 0x73, 0xcd, 0x12, 0x5d, 0x35, - 0x67, 0x63, 0x8c, 0xf4, 0xdd, 0x39, 0x2b, 0xa3, 0xa4, 0xbb, 0x88, 0xc0, - 0x4e, 0xd2, 0x27, 0x0c, 0x13, 0xdb, 0x35, 0x59, 0xf4, 0x9d, 0x16, 0xb0, - 0xe3, 0xe2, 0x03, 0xec, 0x9b, 0x11, 0xc8, 0xe2, 0x74, 0xae, 0x95, 0xe4, - 0xdc, 0xee, 0xaf, 0x51, 0x8c, 0x2f, 0xa3, 0x7e, 0xc0, 0xd2, 0x15, 0x85, - 0x87, 0xf9, 0xf9, 0x6c, 0x65, 0x32, 0x8a, 0xf6, 0x80, 0xd6, 0xcd, 0xd0, - 0x55, 0xa9, 0xe8, 0xdb, 0x53, 0xc1, 0x12, 0x14, 0xd4, 0x60, 0xe9, 0x2d, - 0x5d, 0x4a, 0x37, 0xb8, 0x22, 0x6a, 0x0c, 0xfc, 0xe3, 0x86, 0x12, 0xb7, - 0xd4, 0xe6, 0x34, 0x29, 0x36, 0xe5, 0xfc, 0x47, 0xd5, 0x4e, 0xea, 0x8a, - 0xb2, 0x42, 0x36, 0xf2, 0x83, 0x38, 0x3f, 0xd9, 0xbf, 0x3e, 0xb6, 0x47, - 0x46, 0xc5, 0x87, 0xd3, 0x6a, 0xae, 0xd7, 0x46, 0xd9, 0x6a, 0x30, 0xb8, - 0x94, 0xf7, 0xa5, 0xeb, 0xb8, 0xbd, 0x3b, 0x79, 0xdf, 0x96, 0xa3, 0x85, - 0xe8, 0xf9, 0xda, 0x57, 0x64, 0x26, 0x17, 0xed, 0x6d, 0x38, 0x12, 0xac, - 0x9d, 0x80, 0x5b, 0xa4, 0x55, 0x0e, 0xbe, 0x11, 0x69, 0xce, 0x04, 0x70, - 0x9b, 0x98, 0x6e, 0x00, 0x34, 0x0b, 0xde, 0x76, 0x8b, 0x68, 0x8a, 0x2b, - 0x45, 0xa7, 0x40, 0x61, 0x92, 0x13, 0x64, 0xa2, 0xb0, 0xcb, 0xc4, 0x83, - 0x7d, 0xe4, 0xcb, 0xb9, 0xcc, 0x02, 0x0e, 0x07, 0x1a, 0x7c, 0x5c, 0xdc, - 0xc0, 0xc9, 0xee, 0x14, 0xa4, 0xe6, 0x4d, 0x14, 0x02, 0x56, 0xd0, 0xd5, - 0x23, 0xf7, 0x0e, 0xb8, 0x6a, 0x65, 0x29, 0xaa, 0x2b, 0x10, 0xe8, 0x13, - 0x1f, 0x4b, 0xf9, 0xcc, 0x32, 0x5a, 0x8d, 0xa5, 0x20, 0xfe, 0x46, 0x89, - 0xc3, 0x1a, 0xc9, 0x55, 0xf5, 0x31, 0x69, 0x4b, 0x44, 0x19, 0xa8, 0x3f, - 0xa8, 0x0b, 0x87, 0xf4, 0xda, 0xda, 0x12, 0x42, 0x96, 0x05, 0x68, 0x81, - 0xa4, 0xdb, 0x1a, 0x9b, 0xd5, 0x2c, 0x12, 0x28, 0xa1, 0x1e, 0xea, 0x46, - 0xf3, 0x6e, 0x18, 0x13, 0x5f, 0x82, 0xfc, 0x60, 0xc1, 0x67, 0x24, 0xf2, - 0x4c, 0xfa, 0xc4, 0x0c, 0x65, 0x80, 0x92, 0xd4, 0x22, 0x81, 0x55, 0xc3, - 0x4b, 0x57, 0xaa, 0xdc, 0xe4, 0xc0, 0x6f, 0x8f, 0x2f, 0xbe, 0x3c, 0x1b, - 0x1e, 0x13, 0x87, 0x38, 0x3a, 0xfe, 0xf2, 0x1d, 0x73, 0x0f, 0xde, 0x31, - 0x31, 0x52, 0x00, 0x97, 0x41, 0x50, 0x96, 0x91, 0x4c, 0xe4, 0x64, 0x64, - 0xc9, 0x89, 0xec, 0x19, 0x65, 0x68, 0x4c, 0x97, 0x4a, 0xd1, 0xd3, 0x44, - 0xb4, 0xda, 0x14, 0xd1, 0x74, 0x1e, 0xb2, 0x84, 0x65, 0xe7, 0x39, 0x63, - 0x0c, 0x97, 0x86, 0xd1, 0x61, 0x18, 0xb7, 0xc5, 0xbe, 0x97, 0x8d, 0xef, - 0xc4, 0x86, 0xa1, 0x07, 0xc2, 0x57, 0xd1, 0xb1, 0x6a, 0x39, 0x83, 0xa0, - 0x14, 0xae, 0xc2, 0x57, 0x4f, 0x33, 0xb9, 0xbd, 0x38, 0x8d, 0x08, 0x67, - 0x19, 0xb8, 0xec, 0x29, 0xaa, 0xee, 0x29, 0xfe, 0xa4, 0xd6, 0xae, 0x29, - 0x84, 0xe0, 0x88, 0xcd, 0x48, 0x0a, 0xc6, 0x54, 0xd9, 0x32, 0xb8, 0x50, - 0x91, 0x48, 0xc2, 0xb2, 0xdc, 0x9e, 0x6a, 0xe6, 0x97, 0xa0, 0x15, 0x85, - 0x55, 0xdc, 0xe4, 0x23, 0xc1, 0x90, 0x01, 0xa2, 0x2d, 0x08, 0x7e, 0xb0, - 0xd4, 0x77, 0x71, 0xe0, 0x52, 0xbc, 0xf2, 0x81, 0xe7, 0x4b, 0x49, 0xe7, - 0x6e, 0x3d, 0x3b, 0xb8, 0x94, 0x99, 0x72, 0x72, 0xa9, 0x5c, 0xc8, 0xae, - 0xa2, 0x36, 0xfc, 0x48, 0x3e, 0x33, 0x8a, 0x03, 0x73, 0x1c, 0x6e, 0x9a, - 0x9c, 0x27, 0x0e, 0x8d, 0x0b, 0x24, 0xe0, 0xf5, 0x05, 0x61, 0xcc, 0xce, - 0xa2, 0xe1, 0x3c, 0xf5, 0x9c, 0x68, 0xf5, 0x76, 0xf3, 0x96, 0xc2, 0x78, - 0x14, 0xd5, 0xeb, 0x7e, 0xea, 0x19, 0x94, 0xd6, 0xa5, 0x16, 0x4c, 0xf9, - 0x50, 0x86, 0x26, 0xb6, 0x8d, 0x8d, 0x8d, 0xa3, 0xe3, 0xcb, 0x83, 0x93, - 0xd3, 0xe3, 0xa3, 0xe8, 0xe4, 0xed, 0xeb, 0xb3, 0x8b, 0x37, 0x07, 0x97, - 0xea, 0x64, 0x3a, 0x72, 0x3a, 0xaa, 0x2b, 0x67, 0xe2, 0x4c, 0x00, 0x5e, - 0x7f, 0x05, 0x09, 0xd3, 0x2e, 0x5e, 0x2b, 0x60, 0x90, 0x2c, 0x43, 0x52, - 0x59, 0x83, 0x8d, 0x48, 0x9d, 0x53, 0xbe, 0x40, 0x09, 0xdf, 0xcf, 0xdb, - 0xce, 0xa1, 0x30, 0xb0, 0xe5, 0x34, 0x0d, 0x13, 0xd8, 0x5f, 0x8f, 0x36, - 0xe5, 0x8a, 0x71, 0xc9, 0xdd, 0x04, 0xdc, 0x7a, 0x64, 0xc1, 0x80, 0x26, - 0xfb, 0x27, 0x9c, 0xdb, 0x0a, 0xf1, 0x52, 0xab, 0x9a, 0x9f, 0x94, 0xae, - 0x98, 0x1f, 0x93, 0x0b, 0xb7, 0x13, 0x64, 0x57, 0x11, 0x05, 0xa2, 0x6a, - 0x70, 0xd0, 0xa6, 0x4b, 0x54, 0xb2, 0x0a, 0x24, 0xe2, 0xd2, 0xc4, 0x27, - 0xe1, 0xfe, 0x72, 0x26, 0xd7, 0x06, 0x7b, 0x6d, 0x4b, 0xad, 0x8d, 0xf1, - 0x50, 0x26, 0xf3, 0x82, 0xeb, 0x40, 0xd9, 0x59, 0xe7, 0x57, 0x3c, 0x13, - 0x35, 0x3b, 0xae, 0x82, 0x1e, 0x86, 0x4d, 0x6d, 0x3a, 0x27, 0x04, 0x49, - 0x2e, 0xfd, 0x13, 0x45, 0x31, 0xe3, 0xb5, 0xe0, 0x9a, 0xbf, 0xfc, 0x73, - 0xee, 0xd3, 0xfa, 0x35, 0x4a, 0xc3, 0x2b, 0x2c, 0x41, 0xdd, 0x23, 0x3d, - 0x6d, 0xfe, 0xdc, 0x16, 0x46, 0x69, 0x47, 0xf4, 0x10, 0x17, 0x91, 0xec, - 0x6b, 0xf7, 0x1a, 0x26, 0x05, 0x5d, 0xd8, 0xb6, 0x50, 0x84, 0x27, 0x08, - 0x01, 0xa3, 0x4c, 0x80, 0x4a, 0xb0, 0x06, 0x32, 0x0f, 0xd0, 0x77, 0x69, - 0x46, 0x63, 0x16, 0xf1, 0xbd, 0x9d, 0xd7, 0x15, 0x69, 0x6a, 0x54, 0xc3, - 0x76, 0x05, 0xc2, 0x86, 0xee, 0x59, 0xac, 0x64, 0xf0, 0x42, 0xec, 0xfd, - 0xae, 0x58, 0xff, 0x4d, 0xc3, 0x36, 0x67, 0x92, 0xd5, 0x06, 0xd5, 0x73, - 0xd0, 0x34, 0x53, 0x57, 0x26, 0x15, 0xbe, 0x58, 0xf5, 0x54, 0x86, 0x9c, - 0xde, 0xba, 0xc6, 0xe8, 0x27, 0x6d, 0x23, 0x50, 0x2e, 0x8e, 0xf2, 0x9e, - 0x5a, 0xcc, 0x2b, 0x86, 0xc7, 0x8e, 0xd1, 0x1a, 0x36, 0x14, 0x90, 0x41, - 0x39, 0x25, 0x4c, 0xa7, 0x61, 0x1e, 0xee, 0x98, 0xeb, 0x4b, 0x71, 0x8d, - 0x4e, 0xad, 0x27, 0x17, 0xc4, 0x92, 0x8b, 0x47, 0x5d, 0x91, 0x47, 0xc1, - 0xf4, 0xe6, 0x1b, 0x86, 0x94, 0x68, 0x2f, 0x59, 0x9c, 0x00, 0xb8, 0xbf, - 0xe4, 0x63, 0x83, 0xc9, 0xb3, 0x3b, 0x33, 0x89, 0x0b, 0xd8, 0x18, 0x11, - 0x52, 0x2a, 0x77, 0x06, 0x48, 0x00, 0x73, 0x75, 0x66, 0x4b, 0x5c, 0x3e, - 0xbe, 0xac, 0x70, 0x5f, 0x60, 0x2b, 0x62, 0xce, 0x2a, 0xb3, 0x43, 0x21, - 0xc1, 0x6d, 0xae, 0x15, 0xab, 0x3b, 0x4f, 0xcd, 0x20, 0x42, 0x49, 0x43, - 0x36, 0xce, 0xb3, 0x42, 0xce, 0x1b, 0x24, 0xed, 0x8e, 0xaf, 0xfe, 0xd0, - 0x59, 0xdc, 0x50, 0x1f, 0x9d, 0xe8, 0x9a, 0x75, 0x95, 0x51, 0x16, 0xc6, - 0xbb, 0xe9, 0xb6, 0x4c, 0xe4, 0xf1, 0x57, 0x17, 0xf1, 0x55, 0x9c, 0x4c, - 0x7f, 0xbf, 0xb7, 0x33, 0x8c, 0xaf, 0x97, 0xd3, 0xf8, 0x0f, 0x78, 0xf1, - 0xd5, 0x93, 0x27, 0x7b, 0x3b, 0x9f, 0x7e, 0xb6, 0xd3, 0xa9, 0xb9, 0x8a, - 0x02, 0x3f, 0x33, 0xdc, 0x86, 0x28, 0xd7, 0xcc, 0x7c, 0x17, 0xfd, 0x0c, - 0xc6, 0xd7, 0x29, 0x77, 0xf3, 0x35, 0x0b, 0x2f, 0xba, 0x06, 0x31, 0x02, - 0x22, 0x84, 0x4d, 0x6a, 0x5d, 0x28, 0xba, 0x71, 0x89, 0xae, 0x3f, 0xd9, - 0xdd, 0x17, 0x56, 0x76, 0x0d, 0xbb, 0x54, 0x2c, 0x14, 0x1b, 0xbd, 0x4c, - 0xe7, 0x74, 0x03, 0x7d, 0x1e, 0x95, 0xf1, 0xb5, 0xa3, 0x55, 0xb4, 0xe0, - 0x2a, 0x39, 0x9b, 0x25, 0xfc, 0x2a, 0x45, 0x4d, 0xe1, 0x41, 0xb4, 0x79, - 0x29, 0x90, 0x69, 0x10, 0x7c, 0x16, 0x49, 0x3e, 0x95, 0x6c, 0xd7, 0x78, - 0x66, 0x21, 0x97, 0xfc, 0x3e, 0x3b, 0xe3, 0x07, 0x8b, 0xa9, 0xab, 0x5b, - 0x0d, 0x0d, 0x2c, 0xf5, 0x04, 0x37, 0x5d, 0x14, 0xbe, 0x4e, 0x92, 0x5c, - 0x37, 0x21, 0x18, 0x1b, 0x2d, 0x16, 0xaa, 0x40, 0x74, 0x30, 0xab, 0x9e, - 0x2b, 0xb8, 0xd2, 0x9f, 0xd8, 0x4c, 0x07, 0xf8, 0x1d, 0xd5, 0xe8, 0xb4, - 0xa8, 0x6e, 0x67, 0x21, 0xf9, 0x41, 0xae, 0xc8, 0x87, 0xa6, 0x13, 0x57, - 0xe6, 0x15, 0x97, 0x7e, 0x63, 0x5e, 0x9a, 0x92, 0xbb, 0xfb, 0xf9, 0x2b, - 0x10, 0xc4, 0xee, 0xe7, 0x7f, 0x70, 0x9f, 0xed, 0xe9, 0x67, 0x7b, 0x9f, - 0xff, 0x61, 0x30, 0xc0, 0xf8, 0x98, 0x42, 0xba, 0xf6, 0x75, 0x57, 0x93, - 0x0e, 0x63, 0x3d, 0xc2, 0xf2, 0x97, 0x43, 0xde, 0x91, 0xbd, 0xee, 0x58, - 0xcf, 0xe1, 0x2a, 0xf7, 0xd4, 0xf6, 0xee, 0xf8, 0x56, 0x6a, 0x80, 0xc5, - 0x40, 0xf5, 0x2c, 0xda, 0x16, 0xdd, 0x99, 0x08, 0xd1, 0x4e, 0xe1, 0x20, - 0x4b, 0xe2, 0xe8, 0x8f, 0x4c, 0xa9, 0x7f, 0xdc, 0x88, 0xd4, 0x44, 0xce, - 0xdb, 0x81, 0xb2, 0x84, 0x91, 0x91, 0xad, 0xd4, 0x96, 0x17, 0xc8, 0x37, - 0x6e, 0x99, 0xa3, 0x2c, 0xf9, 0x0e, 0x0c, 0x0a, 0x5d, 0xfc, 0x49, 0x61, - 0x7f, 0x64, 0xc3, 0x99, 0x9f, 0x21, 0x9f, 0x41, 0xb2, 0x82, 0x48, 0xc2, - 0x28, 0x99, 0x37, 0xe0, 0xc9, 0xdf, 0x7f, 0xff, 0xbd, 0x8a, 0x53, 0xf4, - 0x8b, 0x8e, 0xfb, 0x86, 0x38, 0xd1, 0x84, 0x98, 0xdb, 0x0c, 0xe5, 0x14, - 0xb4, 0x32, 0x89, 0x5e, 0xf8, 0x57, 0x3a, 0x4f, 0x69, 0x84, 0x36, 0x56, - 0xea, 0xf8, 0xf2, 0xc8, 0xb0, 0xa4, 0xc7, 0xc2, 0xc4, 0x40, 0x99, 0x9b, - 0x70, 0x05, 0xfa, 0x50, 0x8b, 0x90, 0xf0, 0x79, 0xe7, 0xb0, 0xe9, 0xa0, - 0x7d, 0x6a, 0xcc, 0xd4, 0x60, 0xdd, 0x48, 0x50, 0xac, 0xc8, 0x38, 0xaf, - 0x3a, 0xf2, 0xe0, 0x75, 0xda, 0x51, 0x03, 0xaf, 0x7c, 0xd2, 0xf1, 0x39, - 0xa4, 0xb2, 0x1b, 0xd8, 0xb2, 0x57, 0x22, 0x38, 0xa5, 0x3f, 0x27, 0xaf, - 0x76, 0x77, 0xda, 0x9f, 0x60, 0x6d, 0x28, 0x62, 0xf4, 0xd5, 0x57, 0xde, - 0x40, 0xfe, 0xd8, 0xf3, 0xe9, 0x44, 0x9e, 0xd6, 0xa2, 0x82, 0x28, 0xb2, - 0xf2, 0xaa, 0x33, 0xe2, 0xfb, 0x95, 0xff, 0x7f, 0xcd, 0x38, 0x10, 0xf0, - 0xa5, 0xcf, 0x16, 0xcb, 0xd1, 0x2c, 0xad, 0x0c, 0x78, 0x9b, 0x27, 0xf8, - 0x39, 0x4c, 0x2a, 0x89, 0xa3, 0x0d, 0x54, 0xa3, 0x15, 0xc9, 0xaf, 0x7b, - 0x95, 0x65, 0xa3, 0x38, 0xef, 0xaa, 0x11, 0xd5, 0xc6, 0xd9, 0xdd, 0xdd, - 0x7b, 0xf2, 0xf4, 0x59, 0x77, 0xa0, 0x52, 0x1a, 0x18, 0x04, 0x14, 0xb3, - 0x54, 0x55, 0x19, 0x69, 0x22, 0x96, 0xe3, 0x19, 0xd6, 0x96, 0x6f, 0x75, - 0x36, 0x30, 0x0f, 0xe3, 0xee, 0x5e, 0x49, 0x6f, 0x7f, 0xe0, 0x7e, 0x5e, - 0xa1, 0x8b, 0x3f, 0xa4, 0x93, 0x57, 0x6e, 0x86, 0x7f, 0xe0, 0xb9, 0xbc, - 0xd2, 0x49, 0xd0, 0xbe, 0x5a, 0x2c, 0x7d, 0xb1, 0xb5, 0xd1, 0xca, 0xd5, - 0x5a, 0x37, 0xd7, 0x36, 0x71, 0x03, 0x93, 0x86, 0xa7, 0xab, 0x3f, 0x11, - 0xcb, 0x2d, 0x64, 0x55, 0x1f, 0x48, 0xbe, 0xfd, 0xd0, 0xa7, 0x56, 0xfa, - 0xdc, 0x4a, 0xdf, 0xb3, 0xeb, 0x68, 0xc6, 0x89, 0x23, 0xbc, 0x11, 0x3d, - 0xcd, 0x26, 0x98, 0xc2, 0xd6, 0xa1, 0x82, 0x40, 0x96, 0xc1, 0x8f, 0x74, - 0xf8, 0xd5, 0x49, 0x57, 0x1d, 0xb4, 0xa2, 0xb8, 0xf5, 0xda, 0x8c, 0x6b, - 0x2e, 0x6a, 0x42, 0x51, 0x08, 0x36, 0x0c, 0x1e, 0x3c, 0x66, 0x7f, 0x23, - 0xf7, 0x2b, 0xa9, 0x3f, 0xd4, 0x99, 0xde, 0x39, 0x53, 0x36, 0xd7, 0xe5, - 0xf8, 0x24, 0x6c, 0x06, 0xa8, 0x2e, 0xe2, 0x78, 0x84, 0xa5, 0x7a, 0xe1, - 0xb2, 0x06, 0xfa, 0xaf, 0x9d, 0x37, 0xc0, 0x45, 0xa9, 0xeb, 0xa3, 0xf4, - 0x95, 0x70, 0x13, 0x63, 0x10, 0x1d, 0x57, 0x82, 0x4a, 0x28, 0x21, 0xe4, - 0x1d, 0xf0, 0x65, 0x8c, 0x92, 0x4a, 0x61, 0x23, 0x11, 0x0b, 0x99, 0x7b, - 0xbe, 0x74, 0x35, 0x8b, 0x3e, 0x8f, 0x80, 0xfb, 0x2f, 0x6f, 0x69, 0x1c, - 0x7a, 0xa5, 0xbe, 0x2b, 0x5e, 0x52, 0xe5, 0xc0, 0x79, 0x3e, 0x02, 0xaf, - 0xad, 0x8a, 0x05, 0xd2, 0x82, 0x4c, 0x74, 0xb4, 0x52, 0xf5, 0x9f, 0x5b, - 0xe8, 0xfe, 0x19, 0x87, 0xe0, 0x25, 0x6f, 0x03, 0xbe, 0xfe, 0xbc, 0x2b, - 0x26, 0x3c, 0xf7, 0x2e, 0x0f, 0xa3, 0xe6, 0x59, 0x11, 0x02, 0x0d, 0xe7, - 0x93, 0x5d, 0x39, 0x38, 0x17, 0x91, 0xc5, 0x38, 0xc9, 0x74, 0x0e, 0x75, - 0x2a, 0x4d, 0xa6, 0x13, 0x2d, 0xab, 0xa6, 0xb2, 0x50, 0x4f, 0x1b, 0x4f, - 0x38, 0x83, 0x97, 0x65, 0xc7, 0x2e, 0x07, 0xe0, 0xe0, 0xbd, 0xae, 0x43, - 0x87, 0x61, 0x91, 0x3a, 0x01, 0xbb, 0xcb, 0x13, 0x2b, 0x39, 0xb6, 0xa1, - 0xc9, 0x65, 0x5e, 0x96, 0x0f, 0x27, 0x56, 0x04, 0xa2, 0x83, 0x8f, 0xd5, - 0x97, 0x1c, 0xe4, 0xc6, 0x11, 0x79, 0xcd, 0x89, 0x30, 0xda, 0xe9, 0x2b, - 0x5e, 0xee, 0xdd, 0xc1, 0x75, 0x7a, 0x25, 0x8b, 0x41, 0x2c, 0xf2, 0x3a, - 0xd9, 0xa6, 0x3f, 0x7b, 0xf4, 0xf9, 0x1e, 0xcb, 0x64, 0xfc, 0xcb, 0x13, - 0xf8, 0xed, 0xc3, 0x9b, 0x3f, 0x38, 0x1b, 0xee, 0x5c, 0xf0, 0x2f, 0xa9, - 0xbb, 0xf1, 0xd5, 0x24, 0xad, 0xa3, 0x04, 0x99, 0x2b, 0xf0, 0xa6, 0x17, - 0x34, 0x7b, 0x81, 0xb9, 0x19, 0xc0, 0x6b, 0x19, 0xa4, 0x93, 0xc2, 0x87, - 0xb9, 0xa9, 0x63, 0x51, 0xc5, 0x74, 0x96, 0xba, 0x53, 0x35, 0x98, 0x70, - 0xa0, 0x2d, 0xee, 0xd5, 0xe4, 0x7e, 0xab, 0x17, 0x06, 0x0f, 0x59, 0xa5, - 0x4d, 0x57, 0x0e, 0x18, 0x59, 0x68, 0xdc, 0xfd, 0xa6, 0xd6, 0xb6, 0x62, - 0x2c, 0x07, 0x4d, 0x97, 0xc1, 0x36, 0xa7, 0xf5, 0x1d, 0xac, 0x96, 0x87, - 0x92, 0x80, 0x8f, 0xb4, 0x28, 0xb7, 0xb8, 0x9b, 0x64, 0x5a, 0x40, 0x53, - 0xe7, 0x41, 0x6f, 0x44, 0xc1, 0xba, 0x1b, 0x4a, 0x06, 0xba, 0xea, 0x72, - 0xbd, 0xaa, 0x6d, 0xf8, 0x83, 0x84, 0xb7, 0x1d, 0xcf, 0x04, 0x14, 0x1e, - 0x64, 0x3b, 0xed, 0xcb, 0x7d, 0xa9, 0x42, 0x50, 0xff, 0xf5, 0x20, 0x3a, - 0x45, 0xe8, 0x5b, 0x11, 0x4b, 0x66, 0xb1, 0xdd, 0xa9, 0x46, 0x01, 0x44, - 0x2e, 0x22, 0x75, 0x6f, 0x48, 0xa1, 0x2e, 0x4e, 0xe6, 0x34, 0x32, 0x02, - 0x8e, 0x9d, 0x57, 0x33, 0x45, 0xa2, 0x50, 0x09, 0xa4, 0x07, 0x2b, 0xb4, - 0x7b, 0x0e, 0x65, 0xdb, 0x5c, 0xd9, 0xe8, 0x80, 0x48, 0x83, 0x46, 0xc4, - 0xa1, 0xaf, 0x22, 0x67, 0xc0, 0xca, 0x1d, 0xe1, 0x4b, 0xce, 0x68, 0x22, - 0x66, 0x16, 0x2d, 0xed, 0x2b, 0x3e, 0x2c, 0x6a, 0x0d, 0x94, 0xc5, 0x73, - 0x67, 0xd2, 0xe9, 0x40, 0x53, 0x9c, 0x26, 0x4e, 0x9d, 0x56, 0x30, 0x5e, - 0xc1, 0xc5, 0xcd, 0x14, 0x1a, 0x49, 0x04, 0x0c, 0xef, 0x5f, 0xe0, 0x41, - 0xf2, 0xb8, 0xe2, 0x3b, 0xfa, 0x85, 0x2f, 0xf9, 0x51, 0x4e, 0x3b, 0x9d, - 0xe4, 0x72, 0x1d, 0xa0, 0x57, 0xe0, 0xa6, 0x38, 0xd8, 0xcb, 0x37, 0xa7, - 0x91, 0x65, 0x68, 0x5f, 0x79, 0xe1, 0xd0, 0xa2, 0x76, 0x30, 0x45, 0xb5, - 0x85, 0x88, 0x04, 0xa4, 0x4f, 0xc9, 0xcd, 0x26, 0x6b, 0xcb, 0x49, 0x5e, - 0x11, 0x2f, 0x4e, 0xe5, 0x98, 0x06, 0x4f, 0xc8, 0xab, 0x4c, 0x3b, 0x44, - 0x1a, 0x5d, 0x5e, 0x82, 0x6e, 0x2f, 0xea, 0xf2, 0x50, 0xf9, 0x8b, 0x2e, - 0xd6, 0x13, 0x1f, 0x07, 0xcb, 0xd7, 0x1d, 0xb4, 0x9c, 0x3c, 0x7e, 0xe6, - 0xd5, 0x17, 0x95, 0x55, 0xc2, 0xe7, 0xd6, 0xd4, 0x2b, 0x89, 0x96, 0x6d, - 0x48, 0xd9, 0xf6, 0x6e, 0xd0, 0xfe, 0xab, 0x43, 0x6a, 0x45, 0x0a, 0xa3, - 0xc9, 0x9e, 0x40, 0xa0, 0x76, 0x9f, 0xa5, 0x48, 0x45, 0x69, 0x34, 0xf4, - 0xe1, 0x93, 0x7b, 0x69, 0xec, 0xc7, 0x85, 0x07, 0x09, 0x47, 0x13, 0x12, - 0x30, 0x6e, 0x4b, 0xbb, 0x99, 0x8a, 0xa6, 0x77, 0x9f, 0xc1, 0xae, 0x00, - 0x3e, 0xb3, 0x3b, 0x40, 0x6a, 0x82, 0x87, 0xd2, 0x71, 0x0d, 0x38, 0x75, - 0xbd, 0x83, 0x05, 0xed, 0x98, 0x99, 0xc4, 0x29, 0xf1, 0xb6, 0xca, 0x6d, - 0xfc, 0x6a, 0x91, 0x8e, 0x51, 0xe7, 0xf4, 0xd5, 0x17, 0x93, 0xec, 0x9a, - 0xb9, 0x55, 0x8f, 0x2e, 0x56, 0xfe, 0xd9, 0xe1, 0x87, 0xf7, 0xb4, 0x53, - 0x19, 0x30, 0xce, 0x8a, 0xc8, 0xed, 0xf6, 0xf7, 0x9a, 0xf0, 0x25, 0x6a, - 0x78, 0x92, 0x8d, 0xb5, 0x6d, 0xd7, 0xb4, 0xec, 0x07, 0xb5, 0xef, 0xbe, - 0x08, 0xfb, 0xb2, 0xc5, 0x89, 0xb5, 0x65, 0x29, 0x50, 0x37, 0x4d, 0x4b, - 0xb9, 0xbe, 0x1d, 0xae, 0x3a, 0x4c, 0x5a, 0x5c, 0x63, 0x42, 0xee, 0xaa, - 0xa9, 0xc6, 0xcb, 0x77, 0xbf, 0xe8, 0x4a, 0xa8, 0x63, 0xf7, 0x65, 0x17, - 0x5c, 0x8b, 0x79, 0x91, 0xa1, 0xe8, 0xea, 0x85, 0xd4, 0x95, 0x9b, 0xb0, - 0x2f, 0xf2, 0x82, 0x16, 0x0f, 0xac, 0x44, 0xa7, 0x30, 0xc3, 0x30, 0xc5, - 0x31, 0x0c, 0xac, 0x81, 0x61, 0xc0, 0x97, 0xcd, 0x63, 0x64, 0x9a, 0x51, - 0x29, 0x2e, 0x69, 0xbd, 0x68, 0x21, 0x8a, 0x21, 0xd1, 0xb7, 0x60, 0x87, - 0xab, 0x18, 0x36, 0x97, 0xf3, 0x05, 0xa7, 0x75, 0x8d, 0x51, 0x55, 0x57, - 0xcf, 0xd2, 0x20, 0x7a, 0x37, 0x17, 0xdc, 0xbb, 0x84, 0xd5, 0xe3, 0xd0, - 0x5f, 0xde, 0x73, 0x7e, 0x7f, 0x5a, 0xa8, 0x8a, 0x3f, 0x31, 0x1c, 0xb0, - 0x98, 0x43, 0xc4, 0x6c, 0xad, 0xfd, 0xf2, 0xd5, 0x9a, 0x73, 0x34, 0x82, - 0x9a, 0xa5, 0x21, 0x09, 0xb8, 0x84, 0x5f, 0x65, 0x40, 0xec, 0x9d, 0x3b, - 0x7e, 0x7d, 0x7c, 0x71, 0x71, 0x7c, 0xc1, 0xeb, 0x7d, 0x50, 0xc5, 0xaf, - 0xbf, 0xd1, 0xc8, 0x68, 0x8f, 0xcc, 0x66, 0x11, 0x61, 0xcd, 0xb2, 0xc6, - 0xc2, 0x09, 0x15, 0x4a, 0x69, 0x23, 0x32, 0x3f, 0xb7, 0x64, 0xb9, 0x8b, - 0x41, 0x18, 0xd6, 0x44, 0xc4, 0x03, 0x3a, 0xcb, 0xfd, 0x94, 0xaf, 0x15, - 0x81, 0xa1, 0x0f, 0x85, 0x89, 0x8d, 0xc8, 0x5e, 0xcd, 0xb5, 0xfe, 0x08, - 0xae, 0x6a, 0xd3, 0x1d, 0x03, 0xb9, 0x74, 0xa0, 0x21, 0x5c, 0x89, 0x7a, - 0xaf, 0x7d, 0x6d, 0x71, 0xcc, 0xf7, 0x8a, 0x0f, 0x28, 0xab, 0x4a, 0x58, - 0x89, 0xa2, 0x5c, 0x2e, 0xd2, 0x89, 0x33, 0xee, 0xd2, 0xe7, 0x24, 0xef, - 0x45, 0x72, 0xc4, 0x0b, 0x1b, 0x31, 0x9c, 0x89, 0x66, 0x7b, 0x08, 0x8d, - 0x6b, 0x92, 0x54, 0xee, 0x4d, 0x63, 0x88, 0xf9, 0x97, 0xa2, 0x95, 0x8a, - 0x99, 0x5d, 0xcb, 0xd8, 0x52, 0xc2, 0x4f, 0x60, 0x54, 0x64, 0x56, 0x61, - 0xb1, 0x02, 0x21, 0x5b, 0x60, 0xd3, 0xd5, 0xcc, 0x07, 0x42, 0xfa, 0x82, - 0x82, 0x17, 0x48, 0xd4, 0xc8, 0xf7, 0xa3, 0x1f, 0x8b, 0x74, 0xfc, 0x93, - 0xbf, 0x39, 0x10, 0xc2, 0xec, 0x63, 0x15, 0x25, 0xb6, 0x80, 0x26, 0xaf, - 0x0b, 0xa5, 0xba, 0xaf, 0x24, 0x48, 0xbd, 0x1b, 0x1e, 0x5f, 0x44, 0x07, - 0x5f, 0x31, 0xba, 0xd3, 0xbf, 0xb6, 0xbb, 0xfc, 0x9c, 0xde, 0x0c, 0xb6, - 0xb7, 0x9a, 0x92, 0x9b, 0x98, 0xe1, 0x5b, 0xeb, 0x26, 0x84, 0x1b, 0x9b, - 0x5a, 0xf5, 0x98, 0x20, 0x77, 0xb2, 0xb2, 0x85, 0x1b, 0xd1, 0x07, 0x37, - 0xf1, 0x63, 0xb6, 0x90, 0x0f, 0x58, 0xb8, 0x89, 0x92, 0xcb, 0x2f, 0x0e, - 0x08, 0xdb, 0x1a, 0x1d, 0x7d, 0xd1, 0x50, 0x33, 0x65, 0x93, 0x0e, 0xa2, - 0xee, 0x9b, 0xec, 0x67, 0x12, 0x04, 0xe2, 0xed, 0x27, 0x83, 0x9d, 0x68, - 0xf3, 0xbb, 0x74, 0xfe, 0xe2, 0xd9, 0x9f, 0xa3, 0x93, 0xad, 0x6e, 0x25, - 0xc8, 0x53, 0x60, 0x9c, 0x47, 0xf1, 0xfc, 0xd6, 0xed, 0xd8, 0x19, 0x4e, - 0xb5, 0x84, 0xae, 0x18, 0x18, 0xa8, 0x54, 0x26, 0x5c, 0xdb, 0x22, 0x12, - 0x8d, 0x34, 0x5e, 0x34, 0xfa, 0xd6, 0x01, 0xd2, 0xb1, 0x4e, 0x4f, 0x4f, - 0x4d, 0x78, 0xe9, 0x5e, 0x3c, 0x6b, 0x34, 0xf1, 0xd4, 0xb5, 0xf1, 0x4e, - 0xda, 0xf8, 0x85, 0x4d, 0xec, 0x0d, 0x76, 0xf6, 0xa2, 0xcd, 0xb3, 0xe1, - 0xf6, 0x9e, 0x6b, 0xa1, 0xd9, 0xc4, 0x1e, 0x9a, 0xe0, 0x87, 0xaa, 0x2f, - 0x3f, 0xe5, 0xfe, 0x7f, 0x4c, 0xe6, 0x3f, 0x45, 0x9b, 0xdf, 0xef, 0xee, - 0x52, 0x03, 0x7f, 0x8e, 0x0e, 0x4e, 0xbe, 0x8f, 0x9e, 0x0e, 0xa8, 0xb1, - 0xb7, 0xf1, 0x9d, 0x36, 0xa7, 0x18, 0x4e, 0x43, 0x34, 0x42, 0xdf, 0x37, - 0xda, 0x78, 0x56, 0x6b, 0xe3, 0x94, 0xf4, 0xc0, 0x07, 0xba, 0x52, 0x76, - 0x06, 0x4f, 0xf6, 0xa2, 0xf4, 0xd9, 0x67, 0xcf, 0xad, 0x21, 0x6d, 0x03, - 0xdf, 0x57, 0x6d, 0x93, 0x92, 0xe5, 0x4b, 0x62, 0xce, 0xf1, 0x03, 0x31, - 0x33, 0x70, 0x08, 0x40, 0xa7, 0xde, 0xc4, 0xf9, 0x44, 0xc9, 0x8d, 0x8b, - 0xaa, 0xd0, 0x4e, 0x29, 0x3a, 0x58, 0x02, 0x23, 0x25, 0x5d, 0x9a, 0xfb, - 0x8d, 0xe1, 0xb0, 0x2e, 0x6a, 0x8f, 0xfe, 0x39, 0x7a, 0x33, 0x3c, 0x39, - 0xa6, 0x19, 0xed, 0xd0, 0xd0, 0xfc, 0x1a, 0xca, 0x80, 0xf0, 0x15, 0x16, - 0x97, 0x56, 0x75, 0x83, 0xf3, 0x7e, 0xd0, 0x86, 0xc9, 0xd8, 0x12, 0xd1, - 0xc5, 0xb0, 0x8d, 0x59, 0x51, 0xa0, 0xdf, 0x77, 0x44, 0x6b, 0xfd, 0x83, - 0x6b, 0x56, 0x19, 0xe4, 0x9a, 0x45, 0xd7, 0xdf, 0x64, 0x73, 0x3a, 0x26, - 0x79, 0x96, 0x73, 0x98, 0x47, 0xb7, 0x22, 0x29, 0x7c, 0x73, 0x74, 0x2c, - 0x79, 0x6a, 0x6f, 0xe2, 0x39, 0xb1, 0x48, 0x46, 0x74, 0x28, 0x6e, 0xd9, - 0xeb, 0x2e, 0xce, 0x1b, 0x79, 0xff, 0x74, 0x35, 0x7f, 0xa0, 0x7d, 0xfc, - 0x74, 0xb0, 0xcb, 0xa8, 0x76, 0xac, 0xe5, 0xbe, 0x7e, 0x43, 0x7f, 0xef, - 0x3e, 0xed, 0x46, 0xfc, 0x55, 0x55, 0x63, 0xb7, 0xf3, 0xba, 0x71, 0x78, - 0x76, 0xf6, 0xcd, 0x89, 0x04, 0x60, 0x1c, 0xaa, 0x11, 0x95, 0x05, 0x2b, - 0xa7, 0x05, 0x0b, 0x73, 0x25, 0x6d, 0xcd, 0xc7, 0x8f, 0xc3, 0xf5, 0x76, - 0x9b, 0x24, 0x0b, 0xc0, 0xd0, 0xd5, 0x38, 0x42, 0xa9, 0x2c, 0x5a, 0x46, - 0xc6, 0x82, 0x74, 0x3a, 0xa9, 0xa2, 0x51, 0x14, 0x8c, 0x10, 0x66, 0x06, - 0xdb, 0xd1, 0xca, 0xe5, 0xc2, 0xc6, 0xbe, 0x08, 0x24, 0x86, 0xe8, 0xa2, - 0x58, 0xcd, 0xe0, 0x2c, 0x55, 0xe0, 0xe9, 0x45, 0xd5, 0x75, 0xbb, 0xc3, - 0xa4, 0xec, 0xcb, 0xa0, 0xf7, 0xd5, 0x46, 0xdb, 0x55, 0x83, 0x93, 0x33, - 0x97, 0x2d, 0x14, 0x93, 0x16, 0x86, 0xe2, 0xd5, 0x82, 0x8b, 0x55, 0x4e, - 0x5d, 0x3d, 0x61, 0x14, 0x63, 0x4d, 0x10, 0x4b, 0xf4, 0xf6, 0xe0, 0xcd, - 0xf1, 0xab, 0x6f, 0x0f, 0x4e, 0xdf, 0x1d, 0xd3, 0x2b, 0x8c, 0xca, 0xba, - 0xe9, 0xe3, 0x8d, 0x30, 0xc6, 0x59, 0x3a, 0xce, 0xa6, 0xec, 0x53, 0xea, - 0xfe, 0xb9, 0xbb, 0x21, 0xe1, 0x95, 0x51, 0x87, 0xdf, 0xda, 0x95, 0xd7, - 0x88, 0x2e, 0xf8, 0xaf, 0x3d, 0xf9, 0x6b, 0xef, 0xcf, 0x9d, 0xad, 0xca, - 0xa4, 0x1b, 0x5a, 0x31, 0xd3, 0xcb, 0xbd, 0xc4, 0xd5, 0xa1, 0x4a, 0x0a, - 0x62, 0x7a, 0x65, 0x55, 0x3a, 0xe6, 0x91, 0xb1, 0xab, 0x8d, 0x9f, 0xdd, - 0x1c, 0xad, 0x42, 0x9d, 0xbb, 0xc3, 0x2f, 0xbd, 0x82, 0x70, 0xd1, 0xe1, - 0x9c, 0x27, 0x15, 0x37, 0xe0, 0xac, 0xe6, 0x36, 0xac, 0x89, 0xe4, 0x61, - 0xc1, 0xe1, 0x5b, 0x9b, 0x1d, 0xf9, 0xe5, 0xd5, 0xd1, 0xc1, 0xe5, 0x31, - 0xbf, 0x60, 0xdd, 0x5b, 0x59, 0x6b, 0x8b, 0xbc, 0xe5, 0xf1, 0x6c, 0x76, - 0xe4, 0xc3, 0x57, 0x3c, 0xa1, 0x8e, 0xd4, 0x18, 0x10, 0x80, 0xc5, 0xda, - 0xb8, 0xb2, 0xb9, 0x06, 0x31, 0x06, 0x29, 0x7a, 0x85, 0xc5, 0x89, 0x6c, - 0x76, 0xe4, 0xbb, 0x8e, 0xb3, 0xd7, 0x6a, 0xe1, 0x56, 0x75, 0x4e, 0x4e, - 0x10, 0x97, 0xdb, 0x48, 0x0f, 0x92, 0x5a, 0x49, 0x7e, 0x7f, 0xd4, 0x35, - 0x21, 0x16, 0xa6, 0x00, 0x64, 0xce, 0x6d, 0xbc, 0x66, 0x14, 0xb2, 0x4d, - 0x29, 0xcb, 0x76, 0xf7, 0x9e, 0xfc, 0x19, 0xeb, 0xf9, 0xaa, 0xb3, 0x4d, - 0x77, 0x43, 0xe7, 0xcf, 0xdc, 0x75, 0x5a, 0x06, 0xe5, 0x56, 0xb4, 0x1b, - 0xd6, 0xa5, 0x94, 0xa2, 0x24, 0x48, 0x85, 0x77, 0x1d, 0xb6, 0x30, 0x99, - 0x17, 0x16, 0xf4, 0x5e, 0xb2, 0x07, 0x2c, 0xc9, 0xdc, 0xdc, 0xf7, 0xd8, - 0x2f, 0x94, 0x0c, 0x9c, 0x3b, 0x68, 0x52, 0xe9, 0x2e, 0xbc, 0x3f, 0x7a, - 0xf2, 0xae, 0xcc, 0x51, 0x8b, 0xc0, 0x70, 0x9f, 0xb3, 0x95, 0x25, 0x18, - 0xa0, 0x2f, 0xc8, 0xe3, 0xb2, 0x67, 0x0d, 0xa9, 0x78, 0xa4, 0xb6, 0x1c, - 0x53, 0x44, 0x20, 0x12, 0x10, 0x6b, 0x59, 0x41, 0x4e, 0x12, 0x7f, 0x7f, - 0x10, 0xe6, 0x60, 0x77, 0x76, 0x3c, 0xe2, 0x4c, 0x39, 0x17, 0x4d, 0x1d, - 0x68, 0xe1, 0x6e, 0xe9, 0xed, 0xf8, 0xa5, 0x01, 0xa0, 0x00, 0x5f, 0x94, - 0xb2, 0x96, 0x85, 0xb3, 0x19, 0xc1, 0xb7, 0xa8, 0xcf, 0x56, 0xf7, 0xa9, - 0x96, 0xa7, 0x80, 0x69, 0x88, 0x0a, 0x2f, 0xba, 0x31, 0xb1, 0x9a, 0x79, - 0x92, 0x3f, 0x1a, 0xe2, 0xd0, 0xe2, 0x7a, 0xc2, 0x14, 0x83, 0x34, 0x17, - 0x7e, 0x67, 0x30, 0x18, 0xf8, 0x32, 0x20, 0xbc, 0x2d, 0xea, 0x71, 0x02, - 0xa2, 0x78, 0x80, 0x7a, 0x86, 0x35, 0xde, 0x84, 0x20, 0x0f, 0x61, 0x7a, - 0x4b, 0xc3, 0x5d, 0xd4, 0x1a, 0xe1, 0x8e, 0x46, 0x60, 0xd3, 0xe8, 0x6a, - 0xb7, 0x5d, 0x2b, 0x32, 0x70, 0xdb, 0xb6, 0x09, 0x8f, 0x8c, 0x4d, 0x6c, - 0x8d, 0x45, 0x8c, 0xd4, 0x7c, 0xc7, 0xa7, 0x32, 0xb7, 0x16, 0x4c, 0xc1, - 0x9c, 0xae, 0x2f, 0x35, 0x50, 0xb1, 0x25, 0xb2, 0x68, 0x3a, 0x14, 0x2d, - 0x70, 0xc3, 0x4c, 0x2e, 0xbb, 0x47, 0x26, 0x27, 0xf2, 0x45, 0x39, 0xfa, - 0x63, 0x2e, 0xa6, 0x01, 0xbb, 0x41, 0x1c, 0xe6, 0xaf, 0xb5, 0x33, 0x11, - 0xd3, 0x2c, 0xeb, 0xcb, 0x90, 0xfb, 0x35, 0xfb, 0x45, 0x73, 0xbc, 0x8b, - 0x58, 0xb1, 0xb1, 0x48, 0x6c, 0xcb, 0x66, 0x70, 0x72, 0xe9, 0xe4, 0xbd, - 0x99, 0x84, 0x63, 0xbc, 0xfa, 0x92, 0x25, 0x6d, 0x09, 0x2a, 0xc6, 0x3d, - 0x34, 0x4f, 0xf6, 0x31, 0xef, 0xf8, 0xd8, 0x5a, 0x74, 0xae, 0xf1, 0xda, - 0xda, 0xf8, 0x5b, 0xb9, 0xca, 0xba, 0x68, 0x45, 0xc5, 0x9a, 0x0c, 0x41, - 0x39, 0xe0, 0x7b, 0x51, 0x7c, 0xcf, 0xd5, 0x68, 0x88, 0x06, 0xc5, 0x4d, - 0x26, 0x16, 0x99, 0xd3, 0xc0, 0xae, 0xe8, 0x66, 0x68, 0xe5, 0x9e, 0x63, - 0x5f, 0xef, 0xd9, 0x00, 0x61, 0x05, 0xe4, 0xcd, 0x0c, 0x78, 0x29, 0xca, - 0x89, 0x30, 0x28, 0x97, 0x0a, 0xea, 0xa6, 0x9a, 0xf3, 0xc8, 0x89, 0x45, - 0x0f, 0x95, 0x6e, 0x52, 0x44, 0x03, 0xb2, 0x8d, 0x43, 0xa2, 0x28, 0x6c, - 0xb5, 0xa4, 0xd6, 0xb7, 0x75, 0xe2, 0xbc, 0xd1, 0x30, 0x37, 0xb1, 0x3c, - 0x3d, 0xcf, 0xe6, 0x7d, 0x57, 0x5f, 0xc8, 0x45, 0x5c, 0xe5, 0xe9, 0xf5, - 0xb5, 0x68, 0x6c, 0x51, 0x7d, 0x6a, 0xed, 0x44, 0x76, 0xca, 0xab, 0xc2, - 0x21, 0x9b, 0xab, 0x75, 0xab, 0x79, 0xe9, 0xea, 0x98, 0xaa, 0xc5, 0xa5, - 0x42, 0xcc, 0xe6, 0x81, 0x94, 0x7d, 0x2b, 0x51, 0x07, 0x06, 0x69, 0x96, - 0x6c, 0xf6, 0xaa, 0x7a, 0x8c, 0xcf, 0x2e, 0x36, 0x50, 0xde, 0x7e, 0xee, - 0xb3, 0x4a, 0x6d, 0xd3, 0x01, 0x2a, 0xe3, 0xe3, 0x4d, 0x26, 0x6c, 0x57, - 0x9e, 0xf1, 0x55, 0x7c, 0xef, 0x82, 0x9d, 0x04, 0x65, 0x77, 0x14, 0x7b, - 0x8d, 0x6b, 0x23, 0xaa, 0x58, 0x77, 0x0b, 0xd4, 0xad, 0x56, 0x3e, 0x94, - 0xdd, 0x25, 0x1e, 0xd9, 0xc8, 0x1b, 0x18, 0x3d, 0x18, 0x9d, 0x9e, 0x7e, - 0xc7, 0x4c, 0x6a, 0xee, 0x5c, 0xc7, 0xaf, 0x30, 0xc9, 0xda, 0xaa, 0x0c, - 0xa2, 0xa0, 0x49, 0x31, 0x93, 0x64, 0x21, 0x8b, 0x97, 0xb1, 0xa9, 0x97, - 0xda, 0x5a, 0xd4, 0x58, 0x7e, 0xa0, 0xed, 0x07, 0xaa, 0x89, 0xe0, 0xc8, - 0x2a, 0x55, 0x15, 0x2e, 0x32, 0xce, 0x7b, 0x7b, 0x6d, 0x96, 0x1d, 0xb7, - 0x49, 0x1d, 0xa4, 0x9c, 0x8c, 0x94, 0x08, 0x40, 0x03, 0x2c, 0xd0, 0x39, - 0x87, 0xfd, 0xc1, 0x34, 0xe6, 0x90, 0x95, 0x4c, 0x62, 0x01, 0xb0, 0x65, - 0x20, 0x6a, 0x18, 0xd2, 0x6a, 0x3c, 0xb5, 0x71, 0xfc, 0x5c, 0x6c, 0x86, - 0xd0, 0x1a, 0x60, 0xe9, 0xb8, 0x19, 0xa2, 0x12, 0x04, 0xe5, 0x8e, 0x8d, - 0xb9, 0x3f, 0x9e, 0x7e, 0x39, 0xaa, 0x9c, 0xd1, 0x0f, 0x1d, 0xd9, 0xf3, - 0x8b, 0xb3, 0xaf, 0x2e, 0x8e, 0x87, 0xc3, 0xe8, 0xcd, 0xf1, 0xa5, 0xa8, - 0xfc, 0x97, 0x12, 0x07, 0x27, 0xe0, 0xc4, 0x70, 0x33, 0x18, 0x42, 0x82, - 0xc5, 0x9a, 0x98, 0x3d, 0x01, 0x68, 0xaa, 0x19, 0xbb, 0xd0, 0x20, 0xca, - 0x41, 0x9d, 0x9f, 0x6a, 0xf8, 0xdc, 0x0d, 0x0c, 0xfd, 0x08, 0x66, 0x82, - 0x27, 0xd2, 0xd9, 0xcd, 0xbd, 0x35, 0x15, 0x32, 0xb2, 0x84, 0x37, 0xdd, - 0x18, 0xe7, 0xf2, 0xd6, 0x73, 0xbe, 0xbd, 0xe9, 0x27, 0xa6, 0xf7, 0xfb, - 0xe8, 0xd2, 0x8a, 0x75, 0xff, 0x9e, 0xd4, 0x60, 0xa5, 0x8f, 0xdf, 0x47, - 0xdf, 0x53, 0x9b, 0x13, 0x5a, 0x75, 0x2d, 0xc0, 0x38, 0x44, 0x91, 0x0d, - 0x5f, 0xc8, 0x04, 0x25, 0x20, 0xc2, 0xe2, 0x3a, 0xcb, 0x3c, 0xff, 0x40, - 0xc1, 0x5f, 0x24, 0xcc, 0x0b, 0xa8, 0x80, 0x06, 0xd3, 0xb9, 0x9e, 0xf9, - 0x6d, 0x00, 0x65, 0x9e, 0x26, 0x57, 0x25, 0x04, 0x12, 0xee, 0x8e, 0x9a, - 0xdb, 0x61, 0xf8, 0xc2, 0xdd, 0x37, 0xfc, 0xd1, 0x4e, 0xf4, 0xe4, 0xb3, - 0xe7, 0x3b, 0x9f, 0xc9, 0xaf, 0xf6, 0xef, 0x8b, 0xa7, 0x3b, 0x0a, 0x03, - 0x4a, 0x7f, 0x3d, 0xdd, 0x7f, 0xba, 0xbb, 0xcf, 0xf0, 0x44, 0x3b, 0xfb, - 0x3b, 0xf4, 0xff, 0x4f, 0xf5, 0x13, 0xc6, 0x60, 0x7a, 0xb1, 0xf7, 0xd9, - 0xa7, 0x08, 0x83, 0x61, 0xfa, 0x98, 0x52, 0x27, 0xfd, 0x32, 0xeb, 0x03, - 0xc3, 0x01, 0x42, 0xd0, 0xef, 0xab, 0x06, 0x49, 0xf6, 0xab, 0x73, 0x21, - 0x45, 0x9e, 0xb8, 0x2b, 0xcf, 0x6c, 0xc6, 0x55, 0x49, 0xe3, 0x0f, 0x4b, - 0xc8, 0xba, 0x69, 0xe8, 0xdb, 0x52, 0xc5, 0x13, 0xa0, 0x28, 0x95, 0x77, - 0x48, 0x64, 0x94, 0x1c, 0xaa, 0xf0, 0xe5, 0x5f, 0xd2, 0xb5, 0xe5, 0x1a, - 0x6e, 0x00, 0x55, 0x45, 0xb7, 0x4a, 0xdf, 0x1b, 0xcb, 0x12, 0x12, 0x8d, - 0x04, 0xa5, 0x49, 0x6b, 0x85, 0x44, 0x7f, 0x69, 0x7f, 0x62, 0xc0, 0xe2, - 0xb7, 0x94, 0x1a, 0xa2, 0x66, 0x6f, 0x56, 0x51, 0xb5, 0xad, 0xaf, 0x0a, - 0xf1, 0x6c, 0xf8, 0xed, 0xf7, 0x2b, 0x15, 0x54, 0x1e, 0x75, 0x98, 0x22, - 0x52, 0xcf, 0xa5, 0x65, 0xca, 0x8d, 0xe6, 0xde, 0x2d, 0xc2, 0xf6, 0x3e, - 0xa6, 0x39, 0x3f, 0x23, 0x50, 0xb0, 0xdb, 0xb9, 0x7e, 0xb0, 0x39, 0xa9, - 0x44, 0xb4, 0xb9, 0x62, 0xa1, 0x86, 0x8b, 0xe5, 0x2a, 0x0a, 0xe2, 0x55, - 0x47, 0xb2, 0x7d, 0x79, 0x43, 0xc5, 0xcf, 0x02, 0x99, 0x41, 0x22, 0x28, - 0xdc, 0x65, 0xb8, 0xed, 0xe5, 0x79, 0xa3, 0xec, 0x46, 0x57, 0x4c, 0x8d, - 0x41, 0x7f, 0xda, 0x07, 0xce, 0x93, 0x3b, 0x74, 0x8f, 0x4e, 0xcd, 0x07, - 0xb7, 0xbb, 0x6a, 0x36, 0x9b, 0x2e, 0x58, 0xbc, 0xed, 0x48, 0xfa, 0xe7, - 0x10, 0x3f, 0xee, 0x9a, 0x0b, 0x2f, 0x22, 0x94, 0x32, 0x52, 0x24, 0x63, - 0x86, 0xdb, 0x62, 0x70, 0xda, 0x2d, 0x63, 0x61, 0xfd, 0x4f, 0x5c, 0xbc, - 0x16, 0xee, 0x35, 0x05, 0x64, 0x8f, 0x85, 0xf2, 0xa7, 0x61, 0x5a, 0x59, - 0x05, 0x8a, 0x3d, 0x04, 0x81, 0xdd, 0x90, 0xda, 0xc2, 0x74, 0xd3, 0xd2, - 0xcd, 0x11, 0x94, 0xed, 0xfa, 0xdd, 0xc6, 0xc6, 0xf0, 0xfc, 0xf8, 0xf8, - 0x28, 0x3a, 0x3d, 0x79, 0x73, 0x72, 0x19, 0x08, 0xe4, 0xee, 0x22, 0x31, - 0x83, 0x6b, 0x61, 0xb5, 0x5b, 0xaa, 0xcb, 0xe1, 0x51, 0x07, 0xa5, 0x3f, - 0xbb, 0xca, 0x67, 0x89, 0xa6, 0x31, 0x4c, 0xeb, 0xef, 0x41, 0xf5, 0x06, - 0x50, 0x05, 0xea, 0x6b, 0x78, 0x81, 0xae, 0x20, 0xe1, 0x66, 0xec, 0xaa, - 0xfc, 0xf4, 0x7f, 0xd0, 0x00, 0x8d, 0xaa, 0xe4, 0xa4, 0xe0, 0x69, 0xae, - 0x88, 0x93, 0x06, 0xb5, 0xd6, 0x46, 0xc5, 0x6b, 0x9b, 0x4c, 0xb5, 0x90, - 0xa8, 0xb3, 0xd0, 0x21, 0x5e, 0xef, 0x3e, 0x41, 0x42, 0xec, 0x2c, 0x15, - 0x08, 0xe7, 0x30, 0x98, 0xd8, 0x55, 0x4d, 0xb9, 0xcc, 0x84, 0x8f, 0x87, - 0x3d, 0x86, 0x05, 0xad, 0x2c, 0x92, 0xd6, 0xfa, 0x0a, 0x4b, 0x25, 0x3d, - 0xd9, 0x71, 0xf9, 0x02, 0x0b, 0xf0, 0x1c, 0x15, 0xf5, 0xb9, 0xb3, 0xdd, - 0x88, 0xe4, 0x91, 0x25, 0x4b, 0xf5, 0xf9, 0x72, 0xde, 0xb8, 0xee, 0x7e, - 0x90, 0x77, 0x69, 0xfe, 0xcf, 0x77, 0x70, 0xbd, 0x5d, 0xc5, 0x79, 0x9f, - 0x24, 0xaf, 0x55, 0xdf, 0x8c, 0xab, 0x42, 0x11, 0x1a, 0x68, 0x2c, 0xa6, - 0x9f, 0xc4, 0xd7, 0xf8, 0xa8, 0x49, 0x8b, 0x3e, 0xe9, 0x23, 0x83, 0x4b, - 0x72, 0xaa, 0x07, 0x80, 0xa7, 0xde, 0x8b, 0x50, 0xa1, 0xda, 0x85, 0x3e, - 0x8b, 0xac, 0xe3, 0x81, 0xf5, 0x6c, 0x17, 0x3d, 0x8f, 0x42, 0xd5, 0xd3, - 0x4c, 0x9d, 0x43, 0x29, 0x4f, 0x53, 0xe7, 0xd2, 0x14, 0xad, 0x67, 0xd1, - 0xee, 0x67, 0x3c, 0x8f, 0x8f, 0x9b, 0x0f, 0xd7, 0xb2, 0xb0, 0x28, 0x36, - 0x51, 0x17, 0x32, 0xbf, 0x9b, 0x92, 0x97, 0x00, 0xb4, 0x72, 0x59, 0x5d, - 0x8b, 0x86, 0x45, 0xb4, 0x1e, 0xeb, 0x27, 0xea, 0x4a, 0x87, 0x65, 0x0a, - 0xbe, 0x6d, 0x91, 0x90, 0x50, 0xb5, 0x51, 0xd6, 0x85, 0x6d, 0xad, 0x12, - 0xad, 0xd7, 0xcd, 0x7d, 0xc6, 0x1c, 0x96, 0x81, 0xad, 0x23, 0x44, 0x6b, - 0xf7, 0xe9, 0x04, 0x52, 0xb5, 0x19, 0x01, 0x40, 0x7f, 0x42, 0x7c, 0x12, - 0x24, 0x0d, 0xd7, 0x25, 0x7c, 0x9e, 0x6e, 0x64, 0x2a, 0xc0, 0xf0, 0xb2, - 0x66, 0x30, 0x2e, 0x6c, 0x42, 0x7e, 0xe0, 0x32, 0x2c, 0x55, 0xd7, 0x00, - 0xb3, 0xe6, 0x8e, 0xef, 0x85, 0x03, 0xf7, 0xcb, 0x72, 0x6a, 0x76, 0x05, - 0x5f, 0x67, 0xa1, 0x3a, 0x67, 0x4e, 0xe6, 0x0f, 0xa6, 0xbd, 0xbb, 0x43, - 0xf2, 0xeb, 0x34, 0xab, 0x17, 0x64, 0x6b, 0x2a, 0xa5, 0x98, 0x56, 0x1f, - 0xab, 0xb3, 0xbb, 0xf3, 0xcd, 0xfa, 0x55, 0x07, 0x48, 0xeb, 0xa3, 0x2f, - 0xef, 0x3d, 0x7d, 0x64, 0xd3, 0xce, 0x72, 0x57, 0x61, 0xc7, 0x03, 0x8d, - 0x78, 0x07, 0x4c, 0x63, 0xdb, 0x88, 0xf0, 0x93, 0xeb, 0x18, 0x25, 0xd8, - 0x1f, 0x19, 0xbd, 0x25, 0x68, 0xd4, 0x86, 0xf2, 0x46, 0xc3, 0xb1, 0xe5, - 0xcb, 0x82, 0x2d, 0x64, 0x0b, 0xc0, 0x0d, 0x79, 0x35, 0xd6, 0xa5, 0x74, - 0x4a, 0x8e, 0x77, 0xf0, 0xb6, 0x70, 0xce, 0x5e, 0x95, 0x49, 0x18, 0xf5, - 0xe4, 0xc9, 0xf5, 0x52, 0x92, 0xa8, 0x33, 0x51, 0xfb, 0x19, 0x8f, 0x51, - 0xcf, 0x2b, 0xf1, 0x66, 0x8e, 0x1c, 0x12, 0x7a, 0x02, 0xe3, 0x1d, 0xc7, - 0x26, 0xb2, 0x8a, 0xc8, 0x51, 0xbf, 0x18, 0xd8, 0x3e, 0x3b, 0x66, 0x67, - 0x18, 0xb8, 0x81, 0x1c, 0xaf, 0xb0, 0xd4, 0x93, 0x54, 0x41, 0x1a, 0x20, - 0x43, 0x51, 0x08, 0xc5, 0x31, 0x7b, 0xce, 0xeb, 0x62, 0xa7, 0x58, 0x29, - 0x1e, 0x02, 0x34, 0xd0, 0x53, 0xaa, 0x45, 0x4b, 0xae, 0x2b, 0xe6, 0xf8, - 0x85, 0xa5, 0xa0, 0x0a, 0x4c, 0x2c, 0xdb, 0xfd, 0x0f, 0xcf, 0xde, 0xbe, - 0x3e, 0xf9, 0xca, 0x01, 0x5b, 0x08, 0x13, 0x5f, 0x96, 0x19, 0xdb, 0x35, - 0xc5, 0x68, 0xe8, 0x8a, 0x70, 0x39, 0x87, 0xb7, 0x56, 0xda, 0xd0, 0xb0, - 0x5b, 0x62, 0x4f, 0xef, 0xc3, 0x0f, 0xc0, 0x40, 0xe6, 0x4f, 0xd8, 0x56, - 0x2e, 0xd9, 0xe3, 0xc5, 0x96, 0xb7, 0x3c, 0xd4, 0xa0, 0x77, 0x24, 0x3d, - 0x23, 0xce, 0xcb, 0xe5, 0xc2, 0x45, 0x0f, 0x06, 0x95, 0x3a, 0x14, 0x40, - 0x92, 0x6f, 0x05, 0xae, 0x18, 0xbd, 0x5c, 0x08, 0x6b, 0x92, 0xa8, 0xc7, - 0xaa, 0x61, 0x57, 0xee, 0x00, 0xb6, 0x2c, 0x68, 0xba, 0xbd, 0x5e, 0x00, - 0x8d, 0x90, 0x9c, 0x29, 0xe3, 0x61, 0x85, 0x81, 0xf2, 0xe6, 0xca, 0xe1, - 0x32, 0x5d, 0x32, 0x51, 0x2b, 0xb2, 0x34, 0x13, 0xcd, 0x8c, 0xe7, 0x2d, - 0xb5, 0x5b, 0x7f, 0x70, 0x55, 0x6c, 0x35, 0xec, 0xd7, 0xbb, 0x8a, 0x0a, - 0x57, 0x92, 0xd4, 0x85, 0x26, 0xc9, 0x60, 0x11, 0x42, 0x58, 0xf4, 0xc4, - 0xe5, 0x89, 0x4f, 0x5e, 0xb1, 0x87, 0x66, 0x7f, 0x80, 0x42, 0x97, 0x88, - 0xdf, 0x09, 0x6b, 0x50, 0x29, 0x97, 0xf4, 0x60, 0xa7, 0x27, 0x57, 0x41, - 0x4a, 0x99, 0x84, 0x08, 0x1a, 0xd1, 0x89, 0xb9, 0x98, 0x6d, 0x2d, 0xdd, - 0x4f, 0xba, 0xfd, 0x62, 0x35, 0x1b, 0x65, 0x53, 0xcb, 0xb8, 0x70, 0x49, - 0xd5, 0xf6, 0x50, 0x49, 0xd3, 0x40, 0xcc, 0xa0, 0x14, 0x1d, 0x44, 0xd7, - 0x81, 0x85, 0xd2, 0x87, 0x49, 0xf9, 0xf1, 0x0b, 0xba, 0x3e, 0x3c, 0x45, - 0x36, 0x0b, 0x97, 0xe1, 0x9f, 0xcc, 0xc7, 0xd3, 0x4c, 0xa9, 0x9a, 0x13, - 0x63, 0xb1, 0x52, 0xd5, 0xa9, 0xb3, 0xef, 0x2f, 0x5b, 0xb2, 0xb1, 0x03, - 0xc8, 0xd9, 0x24, 0xee, 0xb0, 0x71, 0xf8, 0x3b, 0x9b, 0x20, 0xbf, 0x2d, - 0x5f, 0x68, 0x38, 0xbe, 0x41, 0x23, 0x50, 0x43, 0x02, 0xb5, 0x4d, 0x43, - 0xfd, 0x8b, 0xd8, 0x16, 0xc5, 0x03, 0xf8, 0x83, 0x75, 0x6e, 0x8f, 0xd6, - 0x96, 0x9e, 0xe8, 0x29, 0xce, 0xaf, 0x15, 0x73, 0x48, 0x9d, 0x6a, 0x50, - 0x12, 0x1d, 0x00, 0xba, 0xb3, 0x51, 0xb2, 0x50, 0xe2, 0xc2, 0x65, 0x20, - 0x3e, 0x2d, 0x25, 0xa9, 0x4f, 0xd3, 0x9f, 0xc4, 0x3a, 0xe9, 0x08, 0x31, - 0xe0, 0x38, 0x9f, 0xb8, 0x90, 0x94, 0xd8, 0xdf, 0x65, 0x86, 0xcc, 0xec, - 0x4d, 0xb5, 0x7a, 0x99, 0x05, 0xaf, 0xb1, 0x3d, 0x0f, 0x9a, 0x70, 0xa2, - 0x36, 0x14, 0xe9, 0x0a, 0xb2, 0x04, 0x03, 0x6e, 0x21, 0xeb, 0x27, 0x29, - 0x7c, 0x13, 0xf2, 0xfd, 0x2b, 0x4d, 0x31, 0xa7, 0xf3, 0xac, 0xa0, 0x01, - 0x0a, 0x86, 0xf4, 0xd9, 0x8e, 0x5a, 0xe2, 0x4a, 0x8d, 0x53, 0x2d, 0xa2, - 0x83, 0x8b, 0x63, 0x92, 0x6c, 0xaf, 0xe7, 0x48, 0x0a, 0xe7, 0x11, 0x96, - 0xba, 0x3f, 0x10, 0xac, 0x79, 0x15, 0xf4, 0x7c, 0x70, 0x87, 0xf7, 0xc1, - 0x9b, 0x4c, 0x4c, 0x1a, 0x1f, 0x40, 0x87, 0xcc, 0x05, 0xa0, 0x31, 0xc9, - 0x8d, 0x0d, 0xac, 0x0f, 0x5c, 0x87, 0xb3, 0xbb, 0x85, 0xa4, 0xd8, 0x5b, - 0x42, 0x5d, 0x65, 0x06, 0xd4, 0x77, 0xde, 0x60, 0xeb, 0x21, 0x42, 0x9f, - 0xad, 0x35, 0x4e, 0xb5, 0xcf, 0x41, 0xf8, 0x9b, 0xe1, 0x8c, 0x69, 0x5f, - 0x15, 0x0f, 0xa8, 0x27, 0xa7, 0x5e, 0xbb, 0xf5, 0xe8, 0x6f, 0xb8, 0x67, - 0x58, 0x16, 0xa9, 0xcb, 0x05, 0x89, 0x0b, 0xad, 0x17, 0x43, 0xf6, 0x24, - 0x10, 0x7e, 0x25, 0x1f, 0x8f, 0x83, 0xab, 0xc5, 0x46, 0xcd, 0xc2, 0x4f, - 0x5c, 0x24, 0x56, 0x51, 0x09, 0xea, 0xc0, 0x44, 0xcf, 0x2a, 0x53, 0x05, - 0xc7, 0x09, 0x8f, 0x18, 0x68, 0xe3, 0x56, 0x04, 0x80, 0x90, 0x3f, 0xb5, - 0x9a, 0x79, 0x3f, 0x71, 0xb3, 0xf5, 0x63, 0x70, 0x5f, 0xf2, 0x47, 0xaf, - 0x1c, 0xee, 0x10, 0x8f, 0x62, 0xc0, 0x1d, 0x81, 0xa5, 0xc2, 0x7d, 0xca, - 0xbf, 0xe0, 0x63, 0x04, 0xbc, 0x19, 0x7a, 0x5b, 0x05, 0x3b, 0x44, 0x21, - 0xdf, 0xc3, 0x81, 0x88, 0x8f, 0x0f, 0x1c, 0x7a, 0x14, 0x8a, 0xc6, 0x41, - 0x95, 0x23, 0x36, 0xe5, 0x70, 0x06, 0xaf, 0x1d, 0xf8, 0x22, 0xa9, 0x54, - 0x45, 0x72, 0x29, 0x42, 0x9d, 0x7e, 0x87, 0xd6, 0xa2, 0x3b, 0x9d, 0x7a, - 0x86, 0x6f, 0x8f, 0xf1, 0xae, 0x22, 0x9b, 0xce, 0x0b, 0x4c, 0xca, 0xbb, - 0x18, 0x4f, 0x7a, 0x55, 0xc9, 0x6d, 0xe0, 0x7a, 0x1c, 0x9c, 0xfa, 0xe3, - 0xb0, 0x5f, 0x90, 0x1f, 0x82, 0x70, 0x81, 0xbb, 0xb4, 0x30, 0x3f, 0x24, - 0xd1, 0xf6, 0x58, 0x63, 0x23, 0x24, 0x91, 0x3a, 0x29, 0xc7, 0xc1, 0x52, - 0x26, 0xe3, 0x9b, 0x4c, 0xc2, 0x69, 0x69, 0xd1, 0x82, 0xb4, 0xcb, 0x4e, - 0xf4, 0x5f, 0x4a, 0x03, 0xdf, 0xf8, 0x6c, 0x3d, 0x26, 0x84, 0x81, 0xa0, - 0x6a, 0x0d, 0x3c, 0x41, 0x1c, 0x7f, 0x7f, 0x79, 0x71, 0x10, 0x7d, 0x7d, - 0x7c, 0x70, 0x74, 0x7c, 0x31, 0xac, 0x5d, 0xfa, 0x1a, 0x05, 0x22, 0x12, - 0x1a, 0xdb, 0x83, 0x21, 0x1a, 0x5b, 0xce, 0xbf, 0x06, 0xec, 0x1b, 0xd7, - 0x8b, 0x57, 0x38, 0x48, 0x74, 0x3e, 0x58, 0x21, 0x12, 0xc7, 0x01, 0x47, - 0xa5, 0x71, 0xe4, 0x73, 0x16, 0xb4, 0xa1, 0xa5, 0x7f, 0x9d, 0xf5, 0x3c, - 0x4c, 0x95, 0xf1, 0x70, 0x4e, 0xfe, 0x32, 0x99, 0x64, 0x96, 0x05, 0x58, - 0xdd, 0xb9, 0xaf, 0x7d, 0xc2, 0x75, 0xc0, 0xb6, 0xf4, 0x92, 0x51, 0x03, - 0x62, 0xe7, 0xfb, 0x3e, 0xf5, 0xdb, 0xa7, 0xc5, 0xef, 0x33, 0xe2, 0xd6, - 0x2a, 0x29, 0x3a, 0x35, 0x6b, 0x60, 0xb5, 0xfb, 0x0d, 0x29, 0x70, 0xd9, - 0x38, 0x49, 0x5f, 0xb7, 0xb6, 0xc4, 0xa7, 0x6b, 0xca, 0x95, 0x01, 0xea, - 0x1a, 0x04, 0x2e, 0xd5, 0x40, 0x48, 0xd6, 0x13, 0xd4, 0xc8, 0x6b, 0xd1, - 0x38, 0x25, 0xaf, 0x66, 0x6a, 0x58, 0x18, 0x06, 0xa2, 0x53, 0x80, 0xac, - 0x93, 0x96, 0x7a, 0xa9, 0xc3, 0x2e, 0x62, 0x70, 0x90, 0x34, 0x2c, 0x7d, - 0x28, 0xbc, 0x1f, 0xe0, 0x0b, 0xd1, 0x00, 0xfd, 0xa2, 0xe2, 0x2a, 0x55, - 0xbb, 0xa8, 0x16, 0xa7, 0xd1, 0xe6, 0x78, 0x0c, 0x8e, 0xe6, 0x2d, 0xae, - 0x9f, 0xbb, 0x34, 0x60, 0x6c, 0x7d, 0x57, 0x82, 0xc1, 0x58, 0xa9, 0x87, - 0xa9, 0x93, 0xc3, 0xcd, 0x64, 0xe3, 0x4d, 0x5e, 0x0d, 0x92, 0x80, 0x42, - 0x62, 0x46, 0x11, 0x0f, 0x04, 0x8e, 0xbb, 0xe7, 0x92, 0xe8, 0xeb, 0xac, - 0xc0, 0x5d, 0xd0, 0x7c, 0x9c, 0x2f, 0xf9, 0xb6, 0xe5, 0xc7, 0x1b, 0xea, - 0xea, 0x72, 0x90, 0x77, 0xc0, 0x88, 0x04, 0xfb, 0x3a, 0x3f, 0xb8, 0xfc, - 0x1a, 0x8e, 0x56, 0x90, 0xf0, 0x11, 0x90, 0x1e, 0xcc, 0xbd, 0xd6, 0xcc, - 0xc5, 0x72, 0x0a, 0x9c, 0xc8, 0xbf, 0x86, 0xdd, 0x65, 0xf2, 0x24, 0x1c, - 0x79, 0x30, 0x51, 0x02, 0x0a, 0x28, 0x55, 0xc3, 0x63, 0xb5, 0xb4, 0x0c, - 0xa2, 0xde, 0x5d, 0xa2, 0x9d, 0x0b, 0xbb, 0xec, 0x4a, 0x26, 0x7a, 0x57, - 0xe6, 0x04, 0xa2, 0x67, 0x61, 0x8e, 0x35, 0x9e, 0x10, 0x49, 0x11, 0x5f, - 0x5c, 0x69, 0x8a, 0x6d, 0x8f, 0xf6, 0xb4, 0x1d, 0x1a, 0x2b, 0x38, 0xd2, - 0x5f, 0xcc, 0x56, 0x83, 0x26, 0x6e, 0x48, 0xf4, 0xe5, 0xb2, 0xac, 0xb2, - 0x95, 0x1a, 0x9e, 0xa3, 0x93, 0x2c, 0xf3, 0x2c, 0x2b, 0xab, 0x88, 0x88, - 0x58, 0x1d, 0x39, 0xd1, 0x82, 0x81, 0x26, 0x63, 0xe1, 0xa6, 0xe6, 0x2a, - 0x77, 0x87, 0x82, 0x61, 0x3c, 0x2a, 0xb2, 0xe9, 0xb2, 0x0c, 0x02, 0xaf, - 0x7f, 0xd9, 0x98, 0x83, 0x41, 0x6f, 0x9e, 0x0c, 0x12, 0x23, 0x28, 0x8e, - 0x1c, 0xce, 0x63, 0xd2, 0xf4, 0xb9, 0x0a, 0x2c, 0xfb, 0x1d, 0xf3, 0x6c, - 0x5e, 0xad, 0x7e, 0x82, 0x18, 0xef, 0xad, 0x8d, 0x8d, 0xa1, 0x6d, 0x36, - 0x83, 0xef, 0x35, 0x37, 0x1d, 0x38, 0x11, 0x40, 0xf8, 0x13, 0xbf, 0xc1, - 0x98, 0x7e, 0x31, 0x3c, 0xa4, 0x44, 0xf6, 0x14, 0x2c, 0x5c, 0xf6, 0x38, - 0x2d, 0xaa, 0x93, 0xc2, 0x57, 0xce, 0x73, 0x61, 0x89, 0x65, 0x97, 0x99, - 0x01, 0xe5, 0xaa, 0xe7, 0xce, 0x13, 0x44, 0x25, 0x35, 0xbd, 0x15, 0x31, - 0x93, 0x2f, 0x01, 0x05, 0xe7, 0xf2, 0x51, 0xb9, 0x3c, 0xc8, 0xed, 0xff, - 0xde, 0x8e, 0x7a, 0x02, 0x73, 0xd3, 0x02, 0x36, 0xb2, 0x8c, 0xfe, 0x1f, - 0x84, 0x60, 0x29, 0x58, 0x21, 0xb7, 0x59, 0x43, 0xf8, 0x1b, 0x90, 0x0a, - 0x75, 0x93, 0x8f, 0x3d, 0xf5, 0x93, 0x74, 0x90, 0xdc, 0xb3, 0xfe, 0x62, - 0x3a, 0x02, 0x7f, 0x61, 0x59, 0xa6, 0x1e, 0x38, 0x06, 0x78, 0x17, 0x57, - 0xce, 0xaa, 0xc7, 0x85, 0xa3, 0xa4, 0x8c, 0x92, 0x88, 0xf5, 0xa8, 0x22, - 0x60, 0x1e, 0xd4, 0x8d, 0xa8, 0xa2, 0xb7, 0x17, 0x51, 0x91, 0xc9, 0x4f, - 0xcb, 0x36, 0xd2, 0x18, 0x2f, 0x25, 0x7f, 0x55, 0xa3, 0xb4, 0x62, 0x8b, - 0x96, 0x31, 0xb3, 0xb8, 0x53, 0x09, 0xab, 0x33, 0xc7, 0xa4, 0x8d, 0xd1, - 0x84, 0x00, 0xf6, 0x5b, 0x02, 0xf8, 0x0c, 0x97, 0x4d, 0xe1, 0x0b, 0xa3, - 0x22, 0x59, 0x9b, 0xab, 0x0e, 0x99, 0x22, 0x63, 0x37, 0xaa, 0x25, 0x70, - 0xb8, 0x8d, 0xf2, 0xa3, 0xd7, 0xab, 0x1f, 0x09, 0xf1, 0xf0, 0xd1, 0xdd, - 0xc7, 0x69, 0x19, 0x4a, 0x04, 0x36, 0x23, 0xd2, 0xf0, 0x14, 0xae, 0x7e, - 0xb4, 0xaa, 0x84, 0xa6, 0xf8, 0xb8, 0xcd, 0x6b, 0xce, 0xef, 0x50, 0x8b, - 0x94, 0x62, 0x89, 0xc0, 0xfc, 0x75, 0x93, 0x6a, 0x74, 0xa9, 0x2c, 0xba, - 0x99, 0x03, 0xd9, 0x9e, 0x01, 0xf3, 0x1e, 0x87, 0x16, 0x78, 0xef, 0xaa, - 0x0b, 0x80, 0x18, 0x34, 0x4f, 0xcb, 0xc0, 0xa1, 0xee, 0xe9, 0x0d, 0x72, - 0x12, 0x66, 0x92, 0x63, 0x55, 0x5c, 0xb8, 0xf3, 0x47, 0x75, 0x1d, 0xf6, - 0xc7, 0x51, 0xac, 0xf3, 0xc8, 0xaf, 0x47, 0x21, 0x57, 0xc9, 0xde, 0x2e, - 0x54, 0x52, 0x09, 0xdc, 0x00, 0x88, 0x9d, 0x95, 0xb3, 0xaa, 0x54, 0x1f, - 0x09, 0xd6, 0x1d, 0xf5, 0x32, 0x81, 0x91, 0x68, 0x49, 0xf6, 0xea, 0x67, - 0x16, 0x89, 0x30, 0xf0, 0x38, 0x55, 0xca, 0x9e, 0x48, 0xe2, 0x76, 0x51, - 0xe6, 0xcb, 0x71, 0x05, 0xb0, 0x0a, 0xc4, 0x50, 0xf1, 0xcf, 0xbb, 0xe5, - 0xcd, 0x42, 0xad, 0x7e, 0x33, 0xae, 0xa4, 0xb1, 0xe8, 0x93, 0x61, 0x17, - 0x5b, 0x52, 0x06, 0x54, 0x8b, 0x20, 0x43, 0x3b, 0xa1, 0xf1, 0x3b, 0x02, - 0xeb, 0x9f, 0xbb, 0x24, 0xfa, 0x0a, 0xee, 0x97, 0xa4, 0x24, 0x04, 0xb7, - 0xae, 0x8a, 0x60, 0x10, 0x39, 0xf2, 0x48, 0x11, 0xc8, 0x20, 0xd0, 0xb0, - 0xb1, 0x72, 0xc3, 0xa1, 0x84, 0x51, 0x77, 0x7d, 0x5f, 0xf7, 0x93, 0xfa, - 0xdb, 0xa6, 0x85, 0x34, 0xe0, 0x7d, 0x57, 0xd6, 0xa1, 0xf0, 0x48, 0x63, - 0xb5, 0x58, 0xd5, 0x64, 0x4a, 0x53, 0x76, 0x92, 0xa1, 0x9c, 0xc4, 0x99, - 0xae, 0xdf, 0xc0, 0x55, 0xe2, 0xb4, 0x72, 0xa7, 0x35, 0x41, 0xa2, 0x79, - 0x2b, 0x9e, 0x0b, 0x0a, 0x49, 0x83, 0x88, 0x8e, 0xcc, 0x9a, 0x0a, 0x66, - 0x83, 0x05, 0x63, 0x9d, 0xc6, 0x36, 0xe9, 0xe4, 0xdc, 0x75, 0x41, 0x43, - 0xe0, 0x19, 0x77, 0xa7, 0xc9, 0x4e, 0x37, 0xa8, 0x4b, 0xb1, 0x29, 0x51, - 0xff, 0x19, 0xf4, 0x1e, 0xb6, 0x1c, 0x62, 0x82, 0x62, 0xb7, 0xe0, 0x08, - 0xb7, 0xad, 0x96, 0xa1, 0x50, 0x13, 0xbf, 0x74, 0x30, 0xbb, 0x2f, 0xf6, - 0x06, 0xbb, 0xcf, 0x3f, 0x1b, 0xec, 0x0c, 0x76, 0x77, 0x98, 0xb3, 0xf0, - 0x50, 0x82, 0xc1, 0xc9, 0xba, 0xb4, 0x74, 0x55, 0x79, 0xaf, 0xd9, 0xe7, - 0xdb, 0xe3, 0xcb, 0xef, 0xce, 0x2e, 0xbe, 0x89, 0x4e, 0xde, 0x5e, 0x1e, - 0x5f, 0xbc, 0x3e, 0x38, 0xfc, 0x58, 0xe8, 0xe1, 0xd0, 0x60, 0x1d, 0x14, - 0x22, 0x4c, 0xfc, 0xc2, 0x34, 0xad, 0x82, 0x7e, 0xcd, 0x92, 0xf2, 0x66, - 0x67, 0x7f, 0xf7, 0x51, 0xbc, 0xd2, 0x16, 0xc3, 0xa0, 0x7f, 0xdf, 0x26, - 0xb5, 0xcb, 0x93, 0x5a, 0xdf, 0x8a, 0x43, 0x41, 0x1b, 0x4a, 0x80, 0x95, - 0x0b, 0xce, 0x05, 0x83, 0x47, 0x51, 0x82, 0x74, 0x94, 0xc7, 0x66, 0x92, - 0x1a, 0x09, 0x68, 0xa2, 0x64, 0xd4, 0x2a, 0xbe, 0x8b, 0x06, 0xa1, 0x2b, - 0xbb, 0xe5, 0x18, 0xe5, 0x65, 0x3a, 0x2d, 0xd5, 0x90, 0x22, 0x18, 0x88, - 0x13, 0x08, 0x77, 0xc6, 0x90, 0xad, 0x30, 0x2f, 0xea, 0xf2, 0xa2, 0x30, - 0x97, 0x14, 0xe6, 0x9d, 0xb8, 0x44, 0x11, 0x07, 0x3c, 0x50, 0x49, 0xb7, - 0xc1, 0x58, 0xab, 0x75, 0x1b, 0xc3, 0x18, 0xda, 0x1a, 0x00, 0x61, 0x61, - 0xb1, 0xcd, 0x98, 0x58, 0xc5, 0x28, 0x7a, 0xa8, 0x03, 0xc1, 0x69, 0x08, - 0x46, 0x23, 0x5d, 0x41, 0x94, 0x32, 0xd0, 0xdb, 0x2a, 0x7c, 0xa6, 0xdc, - 0x4e, 0x48, 0x9e, 0x10, 0xc9, 0xcf, 0xf0, 0xb9, 0xb9, 0xf5, 0xa2, 0x02, - 0xab, 0x16, 0x49, 0xa1, 0x88, 0xf0, 0x75, 0x11, 0xb2, 0x11, 0xa2, 0x39, - 0xc9, 0xe3, 0x7b, 0xae, 0x3f, 0x23, 0x62, 0x83, 0x0f, 0x66, 0x0c, 0x8a, - 0x5d, 0xb0, 0xc8, 0xe4, 0xd7, 0x3c, 0x3a, 0x3f, 0x7e, 0xd3, 0xb7, 0x3a, - 0x78, 0xf4, 0xbb, 0x98, 0xa1, 0x0c, 0x76, 0x53, 0x92, 0x7b, 0x16, 0xc9, - 0xdc, 0x02, 0x6a, 0xc0, 0x13, 0x35, 0x02, 0x28, 0x9c, 0x00, 0x1f, 0x1a, - 0xb1, 0x48, 0x08, 0xaf, 0x55, 0xfc, 0x32, 0xbb, 0xb4, 0x5a, 0x10, 0xf0, - 0x78, 0x3f, 0x35, 0x6a, 0x39, 0xda, 0x74, 0x91, 0xba, 0xdc, 0x1f, 0xc2, - 0x51, 0x11, 0x2d, 0xe0, 0x02, 0x04, 0x32, 0x4b, 0xb6, 0x3e, 0xff, 0xe6, - 0x70, 0xf8, 0xc9, 0xee, 0x9e, 0x0e, 0x67, 0x6b, 0xe0, 0xe1, 0x2c, 0x1b, - 0x79, 0xf8, 0x60, 0xd7, 0xe1, 0x18, 0x2d, 0xab, 0x1a, 0x07, 0x1c, 0x9b, - 0xb1, 0xe9, 0x32, 0x83, 0xb6, 0x2a, 0xa9, 0x41, 0x1b, 0x52, 0x7d, 0xd4, - 0x84, 0x4b, 0x57, 0xa7, 0x8e, 0x9d, 0x21, 0xa8, 0xb6, 0xa0, 0xf5, 0x0e, - 0x4a, 0x17, 0xef, 0x17, 0xcf, 0xed, 0x23, 0x69, 0x59, 0x5b, 0x43, 0xda, - 0xb8, 0x8f, 0x69, 0xa9, 0xef, 0x39, 0xaf, 0xb7, 0xff, 0x96, 0x51, 0x13, - 0xf5, 0x52, 0x37, 0x5c, 0x1e, 0xdf, 0x0d, 0x0e, 0x80, 0x86, 0xb0, 0x4f, - 0xac, 0xa2, 0xca, 0xdc, 0x03, 0xba, 0xf3, 0xd3, 0x67, 0xb4, 0x51, 0x74, - 0xb2, 0x04, 0xaa, 0x81, 0x99, 0x42, 0x36, 0x65, 0xa5, 0xc5, 0x3d, 0x72, - 0x94, 0x33, 0x70, 0xfe, 0x42, 0x82, 0x49, 0xdf, 0x0e, 0xa2, 0xaf, 0x93, - 0x79, 0xa1, 0xd5, 0x8a, 0x2d, 0xf9, 0x0a, 0xc1, 0x81, 0x5c, 0x34, 0x09, - 0x25, 0x6e, 0x4e, 0x93, 0x58, 0x41, 0x04, 0x89, 0xd7, 0x15, 0xa2, 0xdb, - 0x5a, 0x79, 0x87, 0x98, 0x43, 0xf4, 0x70, 0x13, 0xa9, 0x81, 0x16, 0x35, - 0x0e, 0xd3, 0x42, 0x1b, 0xd8, 0xac, 0x42, 0x01, 0x02, 0x9a, 0x1a, 0xcd, - 0xe9, 0x31, 0x87, 0x97, 0x49, 0xed, 0xc9, 0x37, 0xc0, 0x5a, 0x65, 0x3b, - 0xa1, 0xe8, 0x5a, 0x9e, 0xa9, 0x4c, 0xf2, 0x1b, 0x36, 0x7a, 0x14, 0x74, - 0xdd, 0xc4, 0xf3, 0xf1, 0x6a, 0x30, 0x21, 0x29, 0x96, 0xcd, 0x66, 0x83, - 0xe5, 0xed, 0x76, 0x70, 0x4c, 0x99, 0xe5, 0xdf, 0x08, 0x2c, 0x40, 0xd5, - 0xe4, 0x6d, 0xf5, 0xf9, 0x9a, 0xa8, 0x5d, 0x71, 0xe5, 0x4c, 0x30, 0x49, - 0x58, 0x82, 0xbf, 0x1c, 0xcf, 0xb5, 0xf8, 0x56, 0xc7, 0x91, 0x83, 0xf9, - 0xe4, 0x16, 0x06, 0x8b, 0x64, 0xb6, 0xef, 0x52, 0x90, 0x8d, 0x3f, 0x28, - 0x3a, 0xb8, 0x53, 0x29, 0x02, 0xf3, 0xec, 0x3c, 0xb9, 0x9e, 0xaa, 0x40, - 0x11, 0x2a, 0x2d, 0x1e, 0xb6, 0xb5, 0x99, 0x06, 0x22, 0xaa, 0x0e, 0x3c, - 0x10, 0x28, 0xbe, 0x44, 0x9c, 0x6a, 0x86, 0xaa, 0x28, 0xc6, 0xf8, 0xb5, - 0x24, 0xac, 0x6f, 0x44, 0xc1, 0x42, 0x80, 0x38, 0xca, 0x62, 0xb0, 0x1a, - 0x77, 0x2c, 0x1c, 0x49, 0x1d, 0x4f, 0xf4, 0xad, 0x50, 0x08, 0x30, 0x7e, - 0x35, 0x34, 0x1a, 0x6e, 0x4f, 0x2b, 0x82, 0x27, 0x67, 0x85, 0xbe, 0xbe, - 0x7b, 0xc2, 0xb6, 0xee, 0xcb, 0xd3, 0x61, 0x4f, 0xe8, 0x61, 0x9e, 0xdc, - 0x07, 0x94, 0x25, 0xb0, 0xd4, 0x4a, 0x7e, 0x6c, 0xf9, 0x91, 0xf0, 0x35, - 0x2b, 0xc0, 0x9b, 0xcb, 0x68, 0x84, 0x33, 0x78, 0x27, 0x99, 0xcf, 0x82, - 0xb0, 0x85, 0xd0, 0x78, 0x62, 0x1e, 0x8e, 0x55, 0x13, 0x11, 0x81, 0xc8, - 0x01, 0xbc, 0x30, 0x74, 0x1e, 0x09, 0x4c, 0x4f, 0x7a, 0x51, 0x7f, 0x0f, - 0xb0, 0x39, 0xbb, 0xd5, 0x85, 0x8c, 0xb9, 0xc8, 0x47, 0x3c, 0x46, 0x51, - 0xa3, 0x0d, 0x57, 0x6c, 0xdd, 0x58, 0xc2, 0xa6, 0x92, 0xf5, 0x1d, 0xbd, - 0xcf, 0x3f, 0xf6, 0x74, 0x52, 0x77, 0xbb, 0x08, 0xdd, 0x66, 0x79, 0xf4, - 0x2e, 0x99, 0xae, 0x9a, 0x62, 0xc3, 0xde, 0xa3, 0x3b, 0x8b, 0x24, 0x89, - 0xfb, 0xd4, 0x41, 0xaa, 0x0a, 0xaa, 0x36, 0x0c, 0xa1, 0x0a, 0x64, 0x68, - 0x03, 0xa0, 0x65, 0x54, 0x13, 0xf7, 0x3c, 0xba, 0xdb, 0x33, 0x4f, 0x33, - 0x7f, 0x63, 0x8b, 0x27, 0xa6, 0x7a, 0xcf, 0x48, 0x1a, 0xb9, 0x8b, 0x1c, - 0xee, 0x16, 0x50, 0x2e, 0xa7, 0x3e, 0x11, 0xdd, 0x12, 0x27, 0xa9, 0x70, - 0x1a, 0xd6, 0xa0, 0x4a, 0x87, 0x3e, 0xc4, 0xdb, 0x0f, 0xc4, 0x57, 0x92, - 0x85, 0x7d, 0x90, 0x13, 0x42, 0xc0, 0x71, 0xa6, 0x49, 0x82, 0x2d, 0x96, - 0x33, 0xad, 0xce, 0x04, 0x46, 0xdc, 0xc3, 0x75, 0x5b, 0x46, 0xc4, 0x89, - 0x53, 0x09, 0xf9, 0x9b, 0x42, 0x98, 0x86, 0x80, 0xa5, 0xc6, 0x52, 0xbf, - 0x50, 0x6c, 0x01, 0x13, 0x38, 0x3d, 0xd0, 0xcb, 0x4d, 0x2a, 0x36, 0x0c, - 0x44, 0xa8, 0x62, 0xc1, 0x88, 0x55, 0x74, 0x23, 0x3a, 0x7d, 0x4b, 0x6e, - 0xb4, 0xcc, 0x10, 0x02, 0xeb, 0x04, 0x06, 0x69, 0x63, 0x08, 0xa1, 0x33, - 0xea, 0x86, 0x3c, 0xb2, 0xff, 0x39, 0xaf, 0x41, 0xd1, 0xf5, 0x8b, 0xa6, - 0x20, 0xc1, 0xd5, 0x15, 0x50, 0xf7, 0x48, 0xa1, 0x60, 0x17, 0xe7, 0xb9, - 0x15, 0x13, 0xed, 0x26, 0x0f, 0x2c, 0x20, 0x75, 0xb5, 0x57, 0xf9, 0x5a, - 0x50, 0x00, 0xb0, 0xb8, 0xe7, 0x27, 0x6f, 0xa5, 0x3e, 0xa6, 0x3b, 0x48, - 0x09, 0x43, 0x26, 0x6e, 0x48, 0x69, 0x57, 0x8c, 0x27, 0x56, 0x9c, 0x89, - 0x48, 0xec, 0x4d, 0x4c, 0x6c, 0x7c, 0x40, 0x52, 0xed, 0xeb, 0x62, 0x29, - 0xbd, 0x77, 0xf9, 0x92, 0x2c, 0x8a, 0x69, 0xb7, 0x56, 0xf4, 0xcd, 0x6d, - 0x66, 0xed, 0x36, 0x72, 0x86, 0xac, 0xf1, 0x24, 0xac, 0x62, 0xab, 0xad, - 0x54, 0x98, 0x64, 0xaf, 0x96, 0x27, 0x19, 0x5a, 0xd0, 0x3f, 0x89, 0x06, - 0xdb, 0xd4, 0x61, 0xb1, 0x6d, 0x2f, 0x2e, 0x6e, 0xc7, 0x05, 0x5d, 0x8f, - 0x9c, 0x14, 0xfc, 0xa3, 0x43, 0x72, 0xe6, 0x11, 0x4f, 0x7e, 0x8a, 0xfa, - 0xe3, 0x29, 0xe6, 0x17, 0xa1, 0xc2, 0xe4, 0x8f, 0x44, 0x32, 0xfc, 0xc4, - 0x4f, 0x1b, 0x9c, 0x25, 0x37, 0x7c, 0xf7, 0x86, 0x71, 0xd4, 0x51, 0xc2, - 0xef, 0xf2, 0xe2, 0xe0, 0xed, 0xf0, 0xb5, 0x18, 0x59, 0x2f, 0x33, 0x5f, - 0x1c, 0x50, 0x2d, 0x0b, 0xce, 0x13, 0xe9, 0x90, 0xc6, 0xee, 0x05, 0xdc, - 0xdb, 0x82, 0xb4, 0xb5, 0x6c, 0x60, 0xaf, 0x0e, 0x62, 0x2c, 0x65, 0x07, - 0xc1, 0xab, 0xe9, 0x30, 0x6d, 0x16, 0x5b, 0xee, 0x62, 0x2d, 0xc2, 0x6a, - 0x25, 0x1e, 0xe3, 0xce, 0xb0, 0x51, 0xf5, 0x21, 0x26, 0x94, 0x43, 0x1b, - 0x8c, 0x7d, 0x2a, 0xbc, 0x7c, 0x2d, 0xae, 0xe4, 0x21, 0xa9, 0x1e, 0x7d, - 0x85, 0xc5, 0x0f, 0x6a, 0xb3, 0x38, 0xc3, 0x9c, 0xf0, 0x72, 0x45, 0x83, - 0x73, 0x8d, 0x87, 0x89, 0x84, 0xd6, 0xf4, 0xe6, 0x1f, 0x77, 0xb7, 0xda, - 0x9b, 0xbf, 0xfc, 0xa5, 0xcd, 0xb7, 0x8f, 0xdd, 0x64, 0x7d, 0x9f, 0xa7, - 0xb2, 0xf9, 0xc7, 0xbd, 0xad, 0x47, 0x67, 0x14, 0x66, 0xda, 0xf9, 0x3e, - 0xe9, 0x0d, 0x1e, 0x6c, 0xf4, 0xca, 0xea, 0xc0, 0xea, 0x1d, 0xec, 0x62, - 0x3d, 0xae, 0x3c, 0xca, 0x5d, 0x05, 0xf5, 0x81, 0x63, 0x81, 0x9d, 0xe4, - 0xe7, 0x5d, 0x38, 0x9a, 0xb2, 0x70, 0xf2, 0xbf, 0x8f, 0x43, 0x74, 0x40, - 0x52, 0xc4, 0x43, 0x76, 0xc7, 0xe9, 0xe6, 0x45, 0x36, 0x40, 0xdf, 0x7b, - 0x8f, 0xf4, 0xed, 0x67, 0x17, 0xa8, 0xb9, 0xec, 0x0f, 0xe5, 0x80, 0x2a, - 0xc3, 0x83, 0xd5, 0x7e, 0x36, 0x7c, 0xc9, 0xc9, 0xf5, 0xfd, 0x5d, 0x9e, - 0xbc, 0x39, 0x66, 0xdc, 0xd8, 0xa3, 0x13, 0xc6, 0x2f, 0x1b, 0x2a, 0x82, - 0xa0, 0x69, 0xb4, 0x0e, 0x5c, 0x35, 0x04, 0xb7, 0x17, 0x47, 0xa1, 0x8b, - 0x5b, 0x72, 0xa7, 0xdf, 0xed, 0x04, 0x77, 0xad, 0x81, 0xb5, 0x85, 0xa5, - 0xef, 0x9d, 0x5c, 0xf5, 0xdf, 0x64, 0x13, 0x68, 0x5d, 0x7d, 0x81, 0xa3, - 0xa6, 0xb7, 0xe8, 0xc3, 0x77, 0xf3, 0x59, 0xe5, 0xe3, 0x30, 0x49, 0x50, - 0x15, 0xea, 0x8d, 0x75, 0x05, 0x00, 0x7e, 0xde, 0xee, 0xf7, 0x51, 0xf2, - 0x55, 0xe2, 0x83, 0xd4, 0x4b, 0x50, 0xc1, 0x78, 0xb0, 0xb3, 0x4f, 0xeb, - 0x93, 0x4e, 0x57, 0xe2, 0xd1, 0x8e, 0x7d, 0x1c, 0x92, 0xcf, 0x08, 0xbc, - 0xe6, 0xac, 0x24, 0x6f, 0x2c, 0x12, 0x73, 0xd0, 0x46, 0x08, 0x49, 0x09, - 0xb9, 0x3c, 0xb9, 0xf7, 0x81, 0x34, 0x5a, 0x5c, 0x2f, 0x5b, 0xac, 0x30, - 0xc9, 0xfb, 0x8a, 0x8f, 0xbe, 0xd5, 0x51, 0xf7, 0xb3, 0xbc, 0x53, 0x29, - 0x79, 0x21, 0x3d, 0x84, 0x04, 0xa8, 0x9f, 0x68, 0x85, 0x88, 0xb3, 0x3c, - 0x60, 0x60, 0x3a, 0x6c, 0x2b, 0xfa, 0x12, 0xc0, 0x55, 0x06, 0xe8, 0x9a, - 0xd5, 0x71, 0x7a, 0xeb, 0xe5, 0x06, 0x5f, 0x6b, 0x03, 0x36, 0x9a, 0x9b, - 0x97, 0x85, 0xb8, 0xce, 0xa2, 0x5a, 0xbe, 0x2e, 0x89, 0x2c, 0x69, 0x58, - 0x72, 0xc2, 0xbb, 0xfd, 0x2e, 0x10, 0xb5, 0xd3, 0x79, 0xcb, 0x64, 0xfa, - 0xbf, 0x7c, 0x36, 0x0d, 0x1f, 0x5e, 0xd4, 0xb9, 0x62, 0x60, 0x05, 0x76, - 0x88, 0x74, 0x64, 0x00, 0x82, 0x35, 0x22, 0xb4, 0x45, 0xf2, 0x3c, 0xb3, - 0x35, 0xd3, 0x4b, 0x44, 0x47, 0x73, 0x21, 0x96, 0xce, 0xda, 0x2a, 0x46, - 0x2e, 0xe6, 0xa3, 0xcb, 0xc5, 0x04, 0xde, 0x7d, 0x89, 0x6b, 0xfc, 0xcf, - 0x78, 0xbe, 0x8c, 0xf3, 0x55, 0xb4, 0xbb, 0xd7, 0x8b, 0xf6, 0x76, 0x76, - 0xf7, 0x5a, 0xe6, 0xd0, 0xf9, 0x4f, 0x8e, 0xae, 0xd9, 0xc3, 0xd7, 0x9d, - 0x8f, 0x9d, 0x85, 0x8f, 0x91, 0xc7, 0xad, 0xaa, 0xd9, 0xa4, 0xc4, 0x7b, - 0xd8, 0xd1, 0x27, 0x15, 0x6e, 0xb9, 0xa6, 0x1d, 0x00, 0xd1, 0x20, 0x53, - 0x88, 0xcd, 0xc9, 0x6a, 0x4f, 0xb9, 0x32, 0x25, 0xfc, 0xc4, 0x86, 0x96, - 0x15, 0x43, 0x08, 0x85, 0x33, 0xbc, 0xc5, 0x39, 0x0a, 0x6b, 0x55, 0xf7, - 0x28, 0x2d, 0x6d, 0x5b, 0x38, 0x46, 0x83, 0xf7, 0x86, 0xe8, 0xfd, 0xe8, - 0xe4, 0xf0, 0xd2, 0x10, 0xf3, 0xae, 0xf8, 0x3a, 0xcd, 0x57, 0x1f, 0x57, - 0xa3, 0xe8, 0xd1, 0x67, 0x26, 0xfb, 0x37, 0x09, 0x49, 0x64, 0xf3, 0xd1, - 0xf2, 0x7a, 0xff, 0xaf, 0x71, 0x7e, 0x9d, 0xcd, 0x3f, 0xf4, 0xfc, 0x04, - 0x49, 0x4a, 0xfb, 0xc4, 0xa0, 0x76, 0x5f, 0xec, 0x3e, 0x91, 0x08, 0xf8, - 0x94, 0x4b, 0x9a, 0x81, 0x3f, 0x74, 0x67, 0x5d, 0x01, 0x6c, 0x40, 0xe8, - 0xbd, 0x43, 0x69, 0x98, 0x4f, 0xba, 0xa2, 0x6e, 0xc5, 0xe1, 0xb3, 0x13, - 0x7d, 0x56, 0xb2, 0x99, 0xbb, 0x1b, 0x52, 0xbe, 0xb0, 0xcb, 0xa9, 0x7f, - 0xcb, 0x45, 0x77, 0x50, 0x39, 0xe1, 0x1f, 0x98, 0x2b, 0x77, 0xe1, 0x4a, - 0x32, 0x1d, 0x0a, 0x4f, 0x56, 0x76, 0x3a, 0xca, 0x93, 0xf8, 0xd6, 0x17, - 0xb9, 0xf3, 0x68, 0x0e, 0x66, 0x3b, 0xbf, 0x78, 0x7d, 0x28, 0x18, 0x98, - 0x96, 0x83, 0x83, 0xa5, 0x8e, 0x9c, 0xa5, 0x63, 0x8b, 0x47, 0xf9, 0x81, - 0xfe, 0x39, 0x48, 0x7e, 0x7f, 0x32, 0xfa, 0x88, 0x87, 0xe8, 0xdc, 0x09, - 0xdc, 0xd8, 0x41, 0xb5, 0x9c, 0x01, 0xcb, 0xfc, 0x25, 0x93, 0x9a, 0x55, - 0xb3, 0xdb, 0x94, 0x02, 0x6d, 0x62, 0xbb, 0x96, 0x2a, 0xea, 0x5a, 0x74, - 0x57, 0x8d, 0x05, 0x34, 0x6e, 0xae, 0x7e, 0x76, 0x74, 0x70, 0x1e, 0xe8, - 0x4d, 0xd0, 0x4b, 0xbc, 0x8d, 0x88, 0x9f, 0x63, 0x99, 0x19, 0x05, 0x33, - 0xc5, 0x94, 0xb4, 0xea, 0x79, 0x69, 0xb7, 0x04, 0x9f, 0x9c, 0xdc, 0xc5, - 0x12, 0x69, 0x9d, 0xe9, 0x75, 0x02, 0x73, 0x06, 0xf0, 0xbc, 0xa7, 0x93, - 0x18, 0x1e, 0x35, 0xbd, 0x84, 0x20, 0x84, 0xa2, 0xad, 0x54, 0xc3, 0x6a, - 0x68, 0x6f, 0x1e, 0x22, 0xcd, 0x06, 0xd0, 0xb4, 0x07, 0xf9, 0x5d, 0x1e, - 0xe3, 0x4c, 0xd7, 0x95, 0x4d, 0x40, 0xf8, 0x33, 0x0d, 0x3e, 0x2e, 0x6e, - 0x89, 0x95, 0x8a, 0x27, 0x98, 0x7a, 0x4f, 0xc7, 0x89, 0xd9, 0x54, 0x27, - 0xa9, 0x44, 0x64, 0xb0, 0x35, 0x03, 0x58, 0x3a, 0x95, 0x0d, 0x93, 0x1b, - 0x88, 0x95, 0x97, 0x69, 0x91, 0x08, 0xee, 0x5d, 0x74, 0x79, 0x9f, 0x89, - 0xd0, 0xe9, 0x00, 0x07, 0x24, 0xa6, 0xb1, 0x58, 0xa6, 0x02, 0x9d, 0x41, - 0x9b, 0x07, 0x7e, 0x10, 0x94, 0x57, 0xeb, 0x38, 0x43, 0xca, 0x91, 0x73, - 0xa0, 0x0d, 0x8f, 0xbe, 0x89, 0x38, 0x47, 0x9b, 0xfb, 0x38, 0xe4, 0x9a, - 0x04, 0xec, 0x0b, 0x9f, 0x41, 0x91, 0xf8, 0x6a, 0xc9, 0xe7, 0xfd, 0xf0, - 0x26, 0x5e, 0xb0, 0x48, 0xbc, 0xbb, 0xc3, 0xda, 0xf7, 0x77, 0x96, 0xed, - 0xc5, 0x07, 0xd5, 0xca, 0x91, 0x16, 0x9d, 0x40, 0x31, 0x9f, 0x70, 0x35, - 0x51, 0x96, 0x89, 0xab, 0x36, 0x3f, 0xba, 0x3d, 0x8b, 0xed, 0x19, 0x33, - 0xac, 0x69, 0x41, 0xa4, 0x91, 0x17, 0x93, 0xdb, 0xed, 0x31, 0xfd, 0xf3, - 0x64, 0x67, 0x1b, 0x50, 0x8c, 0x25, 0x4c, 0x64, 0x4c, 0x93, 0x7b, 0x7b, - 0xcf, 0x9e, 0xf5, 0xa2, 0x0e, 0x1b, 0xad, 0xac, 0x03, 0x3e, 0x12, 0x74, - 0xb2, 0x3a, 0x6d, 0x75, 0xe6, 0xb6, 0xf3, 0xab, 0x31, 0xff, 0xc7, 0xaf, - 0x59, 0xad, 0xa8, 0x4b, 0x4d, 0xdf, 0xc0, 0x3a, 0xcc, 0x43, 0xac, 0x15, - 0x23, 0xab, 0x7b, 0xda, 0x07, 0x33, 0x4b, 0xb0, 0x07, 0x62, 0x91, 0x64, - 0x0b, 0x73, 0x33, 0xce, 0x14, 0x20, 0x1f, 0xdd, 0x07, 0xce, 0x19, 0x38, - 0x86, 0x25, 0xae, 0x4a, 0x13, 0xeb, 0x8b, 0xe5, 0xa8, 0xaf, 0x19, 0xa6, - 0xa2, 0x67, 0xa4, 0x74, 0x72, 0xe9, 0xcf, 0xa9, 0x59, 0x7f, 0x1b, 0x1c, - 0xf9, 0xcb, 0xa8, 0xa3, 0xb4, 0xc5, 0x3f, 0x06, 0xf0, 0x12, 0x26, 0x63, - 0x9e, 0x46, 0xf6, 0x4a, 0xff, 0xf8, 0x8f, 0xff, 0xa0, 0x66, 0xff, 0x83, - 0x5b, 0x79, 0xf5, 0xc7, 0xa2, 0xbc, 0x09, 0x9e, 0xe9, 0x28, 0xc1, 0x9f, - 0x78, 0x1f, 0x29, 0xe2, 0x9e, 0x00, 0x54, 0x8a, 0x44, 0xa8, 0x37, 0xa7, - 0xca, 0x91, 0x7b, 0xc1, 0xfc, 0x52, 0xa4, 0xa8, 0x89, 0xcd, 0xcd, 0x85, - 0x1d, 0x7c, 0xc9, 0xfe, 0xcb, 0x84, 0x53, 0x9b, 0x89, 0x0a, 0x81, 0x44, - 0xb7, 0x65, 0x22, 0xc6, 0xf1, 0xdb, 0x6f, 0x4f, 0x2e, 0xce, 0xde, 0xbe, - 0x39, 0x7e, 0x7b, 0x19, 0x7d, 0x7b, 0x70, 0x71, 0x72, 0xf0, 0xe5, 0xa9, - 0x66, 0x50, 0xf3, 0x14, 0x38, 0x5a, 0x44, 0x44, 0xef, 0x1a, 0x8e, 0x68, - 0x90, 0xd1, 0xd2, 0x0a, 0x9e, 0x5f, 0x2b, 0x17, 0xf8, 0x5e, 0x81, 0xa9, - 0x61, 0x5e, 0x7d, 0x8f, 0x02, 0x16, 0x3d, 0x76, 0xf8, 0xbd, 0xb7, 0x5a, - 0x16, 0x6c, 0xb6, 0x5c, 0x05, 0x39, 0xb9, 0x1c, 0xc8, 0xc2, 0x54, 0x6a, - 0xfc, 0xc9, 0xd7, 0x1d, 0x52, 0x78, 0xff, 0x41, 0xf4, 0x95, 0xa4, 0x75, - 0x6b, 0x48, 0x95, 0x7b, 0x55, 0x53, 0x8c, 0x60, 0xc6, 0x71, 0x63, 0x38, - 0x38, 0x3d, 0xf5, 0x5d, 0x3d, 0x5e, 0x85, 0x41, 0xe1, 0x7c, 0x24, 0x0b, - 0xe8, 0xc6, 0x2a, 0x0a, 0x5f, 0x67, 0x1e, 0x65, 0x7b, 0xbe, 0x0a, 0x01, - 0xb5, 0xb9, 0x33, 0xda, 0x8e, 0x4d, 0xc1, 0x62, 0x60, 0x77, 0x23, 0x1d, - 0xa0, 0xb4, 0xb8, 0xed, 0x45, 0xdd, 0x3f, 0x76, 0x25, 0x3b, 0x2b, 0x01, - 0xdc, 0xac, 0xd4, 0x78, 0xd8, 0xf2, 0x83, 0x7a, 0x7b, 0xe6, 0xc7, 0xa4, - 0x4e, 0x34, 0x37, 0x00, 0xf7, 0xa2, 0xf7, 0x7f, 0x16, 0x26, 0xcf, 0x20, - 0xf0, 0xd0, 0x3f, 0xae, 0x88, 0xfe, 0x2e, 0xc5, 0x5c, 0x69, 0x94, 0xfd, - 0x24, 0xad, 0xef, 0x42, 0x69, 0x8b, 0xc7, 0x01, 0xaa, 0xb0, 0x98, 0x71, - 0x58, 0xf9, 0x85, 0x1c, 0x20, 0xf5, 0x8f, 0xe5, 0x72, 0x78, 0x90, 0xb2, - 0xd9, 0x1b, 0x56, 0xac, 0x57, 0x39, 0x28, 0xa8, 0xea, 0x61, 0xdb, 0x6a, - 0x3d, 0xc0, 0x65, 0xc5, 0x81, 0xe5, 0x79, 0x3a, 0x51, 0x9c, 0xba, 0x56, - 0xaa, 0x18, 0xc0, 0xd3, 0x71, 0x71, 0x08, 0x50, 0xef, 0x39, 0x17, 0x80, - 0x72, 0x85, 0x10, 0x24, 0x08, 0x95, 0xb8, 0x48, 0xce, 0x99, 0x5d, 0x73, - 0x15, 0x42, 0x10, 0xd8, 0x09, 0x11, 0x3d, 0xbe, 0xce, 0x4c, 0xfc, 0x8e, - 0x9d, 0xfb, 0x55, 0x32, 0xb6, 0x24, 0x66, 0xc7, 0xa4, 0x30, 0x07, 0x44, - 0xe5, 0x2c, 0x60, 0x70, 0xd4, 0x9a, 0xbd, 0x99, 0xe3, 0x94, 0x60, 0x2f, - 0xd3, 0x38, 0x86, 0x22, 0x48, 0xf7, 0xf5, 0x61, 0xf0, 0xcc, 0x4b, 0xc4, - 0x45, 0x69, 0xc8, 0x50, 0xc0, 0xdf, 0xb2, 0xf4, 0x60, 0x44, 0xcc, 0x61, - 0x58, 0xfc, 0x20, 0x9a, 0xd4, 0xe0, 0x47, 0x34, 0x69, 0xa6, 0x50, 0x3a, - 0x3d, 0x53, 0xce, 0x44, 0x32, 0x4e, 0x14, 0x47, 0xa3, 0xf4, 0x3a, 0x32, - 0x2b, 0x48, 0xc4, 0x54, 0x02, 0x94, 0xb0, 0x6c, 0x96, 0xf0, 0x56, 0x01, - 0x03, 0x0c, 0xb2, 0xfb, 0x0d, 0x57, 0x88, 0xf7, 0xa0, 0x55, 0x36, 0x93, - 0x82, 0x23, 0xf5, 0x03, 0x2b, 0x1a, 0x2c, 0xe9, 0x4b, 0x5e, 0x47, 0x0b, - 0x6b, 0x52, 0x7c, 0x6b, 0x0d, 0xf2, 0x62, 0x13, 0x2d, 0xe0, 0xf6, 0xe6, - 0x48, 0x29, 0xb1, 0xf4, 0x5c, 0xac, 0x83, 0x05, 0xc0, 0x32, 0xb7, 0x80, - 0x65, 0x85, 0xab, 0x4d, 0x6d, 0x3a, 0x80, 0x6a, 0x6e, 0x65, 0x2c, 0x10, - 0x9f, 0x4c, 0xf4, 0x12, 0x9f, 0x5e, 0xa9, 0x26, 0x61, 0x9b, 0xa5, 0x50, - 0x4c, 0x57, 0x52, 0xd6, 0x9e, 0xc6, 0xb7, 0x19, 0x30, 0x9e, 0x39, 0x91, - 0x88, 0x3c, 0x26, 0xfa, 0xa3, 0xfe, 0xd5, 0x17, 0xef, 0x65, 0x6c, 0x85, - 0xb7, 0x8a, 0x2d, 0xef, 0xc1, 0x16, 0x29, 0x80, 0xa9, 0x75, 0xac, 0x05, - 0xad, 0x30, 0x5e, 0xda, 0x2f, 0x33, 0x44, 0x85, 0x76, 0xac, 0xc8, 0x32, - 0x37, 0xa6, 0xd3, 0x00, 0xa2, 0x5a, 0xcc, 0x11, 0x71, 0x43, 0xf8, 0x70, - 0xe5, 0xe9, 0x0f, 0x34, 0x86, 0x44, 0xe0, 0x6c, 0x83, 0x99, 0x68, 0x74, - 0x32, 0x8b, 0x67, 0x35, 0xf3, 0x58, 0xc0, 0xd1, 0xcc, 0xdb, 0x1a, 0xde, - 0x4c, 0x5a, 0x19, 0x21, 0x8d, 0x67, 0x22, 0x3c, 0x7a, 0xf2, 0x9b, 0xad, - 0x24, 0x7e, 0x6d, 0x63, 0xe3, 0xf0, 0xdd, 0xf0, 0xf2, 0xec, 0x4d, 0x74, - 0xf6, 0xee, 0xf2, 0xfc, 0xdd, 0xa5, 0x5e, 0x5d, 0x23, 0x89, 0xfe, 0x15, - 0x1d, 0x51, 0xa4, 0x00, 0xdb, 0xcd, 0x99, 0xba, 0x90, 0x11, 0xac, 0x90, - 0x01, 0x9a, 0x2e, 0x40, 0xa9, 0x71, 0xd9, 0x3d, 0xc0, 0x6e, 0x12, 0xc4, - 0x5b, 0xac, 0xf9, 0x3d, 0xad, 0x39, 0x32, 0x33, 0x61, 0xdb, 0xb1, 0x64, - 0x21, 0xe8, 0x3d, 0xed, 0x55, 0x47, 0x6a, 0x75, 0xcc, 0xe0, 0xec, 0xad, - 0x82, 0x02, 0xf9, 0x88, 0x1c, 0xb3, 0xed, 0x78, 0xd3, 0x4f, 0x18, 0x1c, - 0x88, 0xb0, 0x98, 0x71, 0x69, 0xc6, 0x4c, 0x8b, 0xcf, 0x44, 0xd0, 0x4a, - 0x35, 0x45, 0x2d, 0xcc, 0x94, 0x2b, 0x33, 0x9a, 0xe1, 0x8d, 0x8b, 0xad, - 0xe6, 0x78, 0x14, 0xc4, 0x94, 0x89, 0x43, 0x9e, 0x83, 0xb7, 0xac, 0xc0, - 0xfc, 0x3d, 0x9b, 0xc0, 0x1b, 0xd7, 0xec, 0x7d, 0xd4, 0xfd, 0x2e, 0x09, - 0x1b, 0xfc, 0xfd, 0xdf, 0x39, 0x01, 0xf0, 0xbd, 0x7d, 0xf2, 0x0f, 0xe9, - 0xf2, 0x2f, 0xf3, 0x2e, 0x42, 0xb1, 0xaa, 0x9e, 0xd7, 0x6f, 0x8e, 0x2f, - 0xbe, 0x3c, 0xbe, 0x38, 0x1b, 0x22, 0xfc, 0xc4, 0xcc, 0x5d, 0x4d, 0x62, - 0xbf, 0x4d, 0xf2, 0x51, 0x92, 0x67, 0x5a, 0x48, 0xc6, 0xfe, 0x7a, 0xb6, - 0xfd, 0xd5, 0x70, 0x78, 0x70, 0x7e, 0xe2, 0x6a, 0x8e, 0xb8, 0x54, 0x24, - 0xd1, 0x91, 0xe6, 0x92, 0x2c, 0xc7, 0xf3, 0xb7, 0x57, 0x88, 0x2e, 0xc6, - 0xb7, 0x12, 0xa2, 0xda, 0xf0, 0x71, 0x9a, 0x8d, 0x96, 0x9d, 0x9b, 0x9a, - 0xa1, 0xc6, 0x0d, 0x1b, 0xba, 0x90, 0x24, 0x6a, 0x0b, 0x01, 0xbf, 0x66, - 0x93, 0x72, 0xcf, 0x85, 0x71, 0xdd, 0xe6, 0xa3, 0x3e, 0x11, 0xfa, 0xad, - 0xd5, 0x87, 0x94, 0x60, 0x7a, 0x62, 0x93, 0x12, 0x65, 0xeb, 0xed, 0x0c, - 0xb7, 0x5c, 0x15, 0x76, 0xfb, 0x96, 0x8f, 0x06, 0x97, 0xc5, 0x98, 0x0e, - 0x84, 0xb3, 0xcb, 0x59, 0xb2, 0xd0, 0x49, 0x66, 0xaf, 0x8f, 0x81, 0x1d, - 0x50, 0x6f, 0xae, 0x5e, 0x95, 0x98, 0xba, 0xe8, 0x93, 0xa7, 0x0e, 0xf4, - 0x29, 0x2c, 0x18, 0x7a, 0x45, 0xc2, 0xf7, 0xe2, 0x7e, 0xa2, 0x17, 0x08, - 0x20, 0x8e, 0xe7, 0x62, 0xe5, 0x16, 0xfe, 0x5d, 0xf7, 0x75, 0x70, 0x81, - 0x2d, 0x44, 0xfd, 0x6b, 0x4c, 0x73, 0x34, 0x9a, 0xc6, 0xf3, 0x5b, 0xdc, - 0x64, 0xb8, 0x9b, 0x58, 0xdd, 0x34, 0x2c, 0x23, 0x2e, 0x47, 0x06, 0xd7, - 0x96, 0xc2, 0x0b, 0x40, 0x00, 0xb4, 0xe2, 0xe7, 0x6c, 0xd9, 0x75, 0x90, - 0x4d, 0x81, 0x13, 0x07, 0x27, 0xc9, 0x2f, 0x02, 0x5b, 0x8d, 0x8e, 0x4f, - 0xe9, 0x52, 0x72, 0x99, 0x0a, 0x50, 0xcf, 0x93, 0x29, 0x03, 0xef, 0x58, - 0x70, 0x89, 0x24, 0xe7, 0xa5, 0x60, 0x62, 0xc2, 0x38, 0x0c, 0x7d, 0x1b, - 0x6e, 0x08, 0x50, 0x0a, 0x72, 0x10, 0x0b, 0x57, 0xa3, 0x42, 0xb9, 0xb6, - 0x30, 0x30, 0x80, 0x4b, 0xfa, 0x92, 0x15, 0x61, 0x11, 0x13, 0x8d, 0xd9, - 0x3a, 0xf4, 0xa1, 0x25, 0xb1, 0x7d, 0x27, 0x83, 0xf0, 0x22, 0xa9, 0x73, - 0x56, 0x55, 0x52, 0x24, 0xd6, 0x6e, 0x93, 0xbc, 0xde, 0x66, 0x00, 0x00, - 0x03, 0xa4, 0x06, 0xc4, 0xfa, 0xed, 0xe0, 0x65, 0x2c, 0xee, 0xb5, 0x1a, - 0x6b, 0x6a, 0x03, 0x1f, 0x58, 0x75, 0x75, 0x84, 0x3f, 0x89, 0xff, 0x09, - 0x71, 0x92, 0x7a, 0xfb, 0x96, 0x13, 0x70, 0x9b, 0xbc, 0x82, 0x74, 0x1a, - 0x86, 0x78, 0x0a, 0x02, 0x02, 0xcc, 0x82, 0x12, 0xf4, 0x0f, 0x0d, 0xc6, - 0xc9, 0xb6, 0xfd, 0xb7, 0x7c, 0x55, 0x64, 0xfd, 0xd1, 0x12, 0x3a, 0x99, - 0xc7, 0xea, 0xd2, 0x44, 0x40, 0x2e, 0x0a, 0x0c, 0x70, 0x2e, 0x7c, 0xcf, - 0x6e, 0x0d, 0xa4, 0x58, 0x8b, 0xa7, 0x03, 0x39, 0x77, 0x55, 0xe0, 0x16, - 0x07, 0xd7, 0x21, 0x81, 0xec, 0x08, 0xe8, 0xd5, 0xa8, 0x65, 0x1d, 0xa1, - 0x6e, 0xb2, 0x0b, 0x39, 0x9b, 0x6b, 0xd5, 0x3c, 0xd8, 0xd9, 0xab, 0x61, - 0xbb, 0xa5, 0x43, 0x4b, 0xbf, 0x84, 0x88, 0x90, 0x28, 0x86, 0xb8, 0xc5, - 0xe3, 0x5a, 0xf4, 0xff, 0x5d, 0xc9, 0xf5, 0x81, 0x04, 0x69, 0x20, 0x9e, - 0x4a, 0x91, 0x87, 0xb5, 0xb7, 0x88, 0x1c, 0xa6, 0xf2, 0xf2, 0xf2, 0x87, - 0xf3, 0xe3, 0x57, 0xf6, 0xe6, 0x63, 0x7b, 0x26, 0x00, 0x5c, 0x08, 0xbf, - 0x48, 0x14, 0xec, 0x32, 0xa8, 0xc1, 0x49, 0x44, 0xd6, 0x2f, 0xcd, 0x2d, - 0x2c, 0xdd, 0xf4, 0xa3, 0xef, 0x8f, 0x4e, 0x86, 0xe7, 0xa7, 0x67, 0x87, - 0xaf, 0x5e, 0x7e, 0x6f, 0xdc, 0xf8, 0x73, 0x46, 0x9c, 0x11, 0x19, 0xcd, - 0x7d, 0xe6, 0x01, 0x02, 0xf4, 0xbd, 0xb7, 0xc7, 0xdf, 0xbd, 0x27, 0xcd, - 0xe0, 0x15, 0x83, 0x82, 0xf7, 0xee, 0xe2, 0xa9, 0xbe, 0xc4, 0xea, 0x55, - 0x8b, 0x5c, 0x17, 0xa4, 0x73, 0xb4, 0x2d, 0x2c, 0xcb, 0x13, 0x01, 0x42, - 0xeb, 0x0a, 0x12, 0xb4, 0x46, 0x64, 0x05, 0xf5, 0x84, 0xe2, 0x4a, 0x6e, - 0x66, 0x4b, 0x71, 0xc6, 0xcc, 0xdd, 0xfc, 0xdd, 0x52, 0x22, 0xf3, 0xd8, - 0x1b, 0x1d, 0x3a, 0x79, 0x11, 0xfc, 0xa8, 0xdf, 0xf8, 0xa0, 0x50, 0x85, - 0xdf, 0xcd, 0x39, 0x16, 0xc2, 0x61, 0x19, 0x6a, 0x85, 0x4c, 0xb8, 0x4f, - 0x15, 0xf0, 0x50, 0x91, 0x7c, 0x38, 0x0e, 0xd3, 0x42, 0xb2, 0x5d, 0x15, - 0x66, 0x11, 0x5f, 0xdc, 0x58, 0xe2, 0xf1, 0x98, 0x7e, 0x30, 0xc6, 0x24, - 0x97, 0x73, 0x39, 0xe7, 0xaa, 0xec, 0xc3, 0x4b, 0x56, 0xa1, 0xb4, 0x6a, - 0x99, 0x9a, 0x9f, 0xad, 0xa4, 0x1c, 0x12, 0xff, 0xab, 0xd8, 0x95, 0x61, - 0xa9, 0x89, 0xca, 0x89, 0x76, 0x6c, 0xae, 0x9a, 0x09, 0xc8, 0x56, 0x04, - 0x49, 0x2f, 0x64, 0x21, 0x54, 0x10, 0x58, 0xe3, 0x2b, 0x3b, 0xc0, 0x99, - 0x92, 0x46, 0xad, 0xe2, 0x02, 0xaa, 0xa5, 0x60, 0x77, 0xa6, 0xe9, 0xc8, - 0x1b, 0xcc, 0x6b, 0x9e, 0x48, 0x76, 0x74, 0x2b, 0xe2, 0x43, 0x78, 0x84, - 0xcc, 0x14, 0xee, 0xd3, 0x6b, 0x8b, 0xcc, 0xca, 0x27, 0x0a, 0xf1, 0xc3, - 0x54, 0x1d, 0x26, 0x41, 0x3a, 0x25, 0x15, 0x8a, 0x89, 0x89, 0x68, 0xee, - 0xd3, 0x20, 0x94, 0x51, 0x41, 0x84, 0x80, 0x7d, 0xaa, 0x2c, 0x1b, 0xf5, - 0xca, 0x25, 0x9d, 0x89, 0x8d, 0x2c, 0x24, 0xb0, 0x20, 0x3d, 0x1b, 0x21, - 0x27, 0x3a, 0xb3, 0x86, 0xf4, 0xa1, 0x62, 0xe3, 0x35, 0xe7, 0x41, 0x01, - 0xa9, 0x69, 0xc2, 0xa2, 0x16, 0xac, 0x6f, 0x61, 0x67, 0x76, 0x93, 0xf2, - 0x0a, 0x8e, 0x96, 0x61, 0x3d, 0x2f, 0x37, 0x7a, 0x29, 0x69, 0x81, 0x85, - 0x47, 0xb0, 0x5d, 0x9c, 0x03, 0x09, 0xb1, 0x54, 0xa4, 0x71, 0x53, 0x7a, - 0x34, 0x72, 0x6e, 0x50, 0x05, 0x85, 0x31, 0xba, 0xb4, 0x52, 0x7d, 0x8f, - 0xad, 0xa8, 0x5b, 0x4d, 0x21, 0xdf, 0x3c, 0xb1, 0x10, 0x18, 0x31, 0x31, - 0x14, 0xec, 0x6b, 0x98, 0x8f, 0xdd, 0x65, 0xcc, 0x99, 0x2b, 0x1c, 0x0a, - 0x92, 0x2b, 0xe0, 0xce, 0x92, 0x8b, 0xa3, 0x6b, 0x05, 0x51, 0xd4, 0xbf, - 0x64, 0x87, 0x9b, 0x81, 0xb1, 0xf9, 0x58, 0x60, 0x59, 0xee, 0x80, 0xac, - 0xc4, 0xb4, 0xbe, 0xd2, 0x0e, 0x5d, 0x96, 0xb5, 0x6d, 0x56, 0x4f, 0x92, - 0x76, 0x62, 0xe4, 0x88, 0x98, 0x4d, 0x37, 0xc8, 0x35, 0x2c, 0x34, 0x83, - 0xd3, 0x39, 0x2b, 0x85, 0xe1, 0xa1, 0x62, 0x91, 0xcf, 0x79, 0xaa, 0x38, - 0x05, 0x49, 0xb2, 0x5c, 0xa0, 0xfc, 0xce, 0x58, 0x11, 0xc8, 0x11, 0xfc, - 0xe9, 0xda, 0xb3, 0x3b, 0xc4, 0xaf, 0x15, 0x2d, 0xea, 0x9b, 0x77, 0xa7, - 0x97, 0x27, 0xe7, 0xa1, 0xe3, 0x31, 0xfa, 0xee, 0xe4, 0xf2, 0x6b, 0x92, - 0xd7, 0xb9, 0xb6, 0xf3, 0x29, 0x7b, 0x77, 0xde, 0xbc, 0x39, 0x78, 0xcb, - 0x19, 0xea, 0x6f, 0x11, 0x23, 0x77, 0x00, 0x9d, 0x81, 0xb9, 0x11, 0xad, - 0x30, 0x93, 0x0e, 0xe7, 0x2e, 0xf7, 0x9a, 0x5e, 0x86, 0xda, 0xe9, 0x03, - 0xc3, 0xe1, 0x23, 0x14, 0xae, 0x11, 0x6f, 0xb8, 0xea, 0x04, 0x2b, 0xb6, - 0xe9, 0xe0, 0xd4, 0xb2, 0x9e, 0xc5, 0xeb, 0x5c, 0x87, 0x1e, 0x47, 0x9e, - 0x9c, 0xc8, 0xe6, 0xf0, 0xa9, 0xca, 0xd5, 0xed, 0x3d, 0x17, 0xd8, 0x50, - 0x07, 0x62, 0x8a, 0x98, 0x55, 0x12, 0x99, 0xe6, 0xaa, 0xd2, 0xc8, 0x75, - 0x59, 0x8d, 0x5b, 0xa7, 0x1e, 0x31, 0x24, 0x38, 0x95, 0x33, 0x6f, 0x0c, - 0x64, 0x65, 0x93, 0xf5, 0xe5, 0x8b, 0xd3, 0xf0, 0x3e, 0xad, 0xd6, 0x0f, - 0xb6, 0x40, 0xb3, 0xeb, 0x2c, 0xf1, 0x07, 0xb7, 0x7f, 0x66, 0xcd, 0x98, - 0xe5, 0x17, 0x1a, 0x98, 0xdc, 0x2d, 0x7d, 0x66, 0x6b, 0x7d, 0xda, 0x92, - 0x2d, 0x57, 0xa3, 0x46, 0x2d, 0x67, 0xfb, 0x22, 0x55, 0x56, 0xaa, 0x78, - 0x03, 0x39, 0xf6, 0xcc, 0xb5, 0xac, 0x01, 0x0d, 0x88, 0xeb, 0xd5, 0xd4, - 0x18, 0x9d, 0x33, 0x98, 0xa5, 0x3d, 0x56, 0xc9, 0xec, 0xad, 0x95, 0x12, - 0xb7, 0xd4, 0x28, 0x24, 0x44, 0x32, 0x84, 0x8b, 0xf7, 0x99, 0xa2, 0x2c, - 0x57, 0x96, 0x0d, 0x92, 0x87, 0x84, 0xdd, 0x9b, 0xfc, 0xeb, 0x5f, 0x17, - 0xd7, 0x61, 0xd6, 0x14, 0xe6, 0xaa, 0xe9, 0xc1, 0xed, 0x98, 0xc0, 0x22, - 0x15, 0x69, 0x71, 0xb2, 0xca, 0x08, 0xb4, 0xe2, 0xd8, 0xee, 0xba, 0x0e, - 0xf5, 0xfb, 0xbd, 0xe6, 0xf7, 0x7b, 0x62, 0x71, 0xe4, 0x0a, 0xf4, 0x0e, - 0x4f, 0x53, 0x72, 0x81, 0x43, 0xe9, 0xcd, 0x64, 0x02, 0xa6, 0x30, 0x29, - 0x56, 0x0f, 0xb7, 0x8a, 0xb0, 0x44, 0x31, 0xfb, 0x73, 0x2c, 0xd2, 0x32, - 0x47, 0x8e, 0x23, 0x1e, 0x81, 0x85, 0x58, 0x02, 0x48, 0x11, 0xae, 0x05, - 0x36, 0xc5, 0xb7, 0x15, 0x35, 0x48, 0xdf, 0x3f, 0x75, 0x01, 0xdd, 0x9e, - 0xa5, 0xa1, 0xc0, 0x97, 0x66, 0xd4, 0xf4, 0xd3, 0xc5, 0x9d, 0x15, 0xb8, - 0xa4, 0x5f, 0x9f, 0xbb, 0xe2, 0x2e, 0x45, 0xc5, 0x3d, 0x55, 0x01, 0xae, - 0x35, 0xde, 0x8f, 0xc1, 0x21, 0xc0, 0x8e, 0x19, 0x83, 0xc3, 0x7c, 0x1d, - 0xd4, 0xc6, 0x95, 0x54, 0x43, 0x7b, 0x83, 0x52, 0x93, 0xb0, 0x2d, 0x4f, - 0x91, 0x5d, 0x09, 0x76, 0x14, 0xf0, 0x96, 0x10, 0x27, 0x5e, 0x77, 0xfd, - 0xc7, 0xbd, 0x9d, 0x9d, 0xdd, 0xfd, 0xdd, 0xcf, 0x5e, 0xec, 0xec, 0xef, - 0xee, 0xee, 0xee, 0xed, 0xef, 0xee, 0xef, 0xef, 0xed, 0xfc, 0xb4, 0xcd, - 0xa6, 0xa3, 0xbb, 0x34, 0xb9, 0x77, 0x95, 0xe4, 0xbf, 0x93, 0x6b, 0x1a, - 0xfe, 0x82, 0x95, 0xb8, 0x01, 0x99, 0x4b, 0xaa, 0x86, 0x6b, 0x82, 0x8f, - 0x43, 0x26, 0x90, 0xe0, 0x6b, 0x01, 0x24, 0x5b, 0xf8, 0x6c, 0x45, 0x9c, - 0xc1, 0x00, 0x30, 0x19, 0xa3, 0xfa, 0xdb, 0x92, 0x67, 0x3a, 0x62, 0x69, - 0x00, 0x22, 0x4d, 0xe1, 0x72, 0xc3, 0xae, 0xa7, 0xd9, 0x68, 0x84, 0x00, - 0x78, 0x97, 0x1e, 0x39, 0x88, 0x18, 0x99, 0xf3, 0x56, 0x48, 0x42, 0x9d, - 0x06, 0x08, 0x4f, 0x93, 0x83, 0xee, 0x57, 0x47, 0xe4, 0x2e, 0x0d, 0xc9, - 0x1d, 0x67, 0x8c, 0x4a, 0x3f, 0x61, 0xa6, 0x44, 0x8b, 0x94, 0xbb, 0xb4, - 0x89, 0xe8, 0x2a, 0xf9, 0x6c, 0x67, 0x7f, 0x9f, 0x0b, 0x47, 0xfc, 0x7e, - 0xb7, 0xa7, 0x91, 0x85, 0x61, 0xb8, 0x74, 0xcf, 0xdd, 0x4e, 0xd2, 0x06, - 0x6b, 0x1f, 0xe1, 0x3c, 0xe7, 0xcb, 0x59, 0x92, 0xab, 0x1e, 0x82, 0xfb, - 0x50, 0x00, 0x64, 0x98, 0x18, 0x6d, 0xc8, 0xee, 0x59, 0x94, 0x42, 0x81, - 0x49, 0x5e, 0xf2, 0x1b, 0xfc, 0xe5, 0xa9, 0xe7, 0x1c, 0x47, 0x65, 0x2e, - 0x45, 0x26, 0xf9, 0x61, 0x08, 0xe4, 0x40, 0xc5, 0xc8, 0x6e, 0x43, 0x59, - 0x55, 0x73, 0x3a, 0x7e, 0x0c, 0x06, 0xbf, 0xf7, 0x6c, 0xf7, 0x27, 0x09, - 0x64, 0x63, 0x02, 0xf7, 0xab, 0xa0, 0xa5, 0xc1, 0x26, 0x2a, 0x8f, 0x48, - 0x1a, 0x98, 0x12, 0xc6, 0x66, 0x32, 0xb8, 0x1e, 0x98, 0x90, 0xa0, 0x86, - 0xc3, 0x5e, 0x18, 0x4e, 0x2c, 0x08, 0xd6, 0x52, 0x93, 0x1d, 0x6a, 0x97, - 0xd9, 0x86, 0xcc, 0xb6, 0x2b, 0x76, 0xc9, 0x4a, 0x8d, 0x97, 0x0d, 0xba, - 0x32, 0x0e, 0x4e, 0x4e, 0x39, 0x5e, 0xe5, 0x94, 0x24, 0xb0, 0xa1, 0xb1, - 0x32, 0x84, 0xf4, 0x20, 0xde, 0x66, 0x9e, 0xf2, 0x6d, 0xda, 0x73, 0xd0, - 0xf2, 0x16, 0x16, 0x0f, 0xb1, 0x82, 0xed, 0xee, 0x22, 0x99, 0x2b, 0x0e, - 0x14, 0xc9, 0xc3, 0xc4, 0xcf, 0x0a, 0x31, 0xa7, 0x00, 0x6e, 0x91, 0x71, - 0x88, 0xe1, 0xe3, 0x80, 0xc4, 0x2b, 0x0b, 0x8f, 0x6a, 0x16, 0x79, 0x32, - 0x4d, 0xee, 0xd4, 0xee, 0x21, 0xe0, 0x75, 0x5f, 0xa9, 0x7b, 0x41, 0x8a, - 0xd9, 0x95, 0xde, 0x4b, 0x52, 0xf1, 0x60, 0x70, 0x9f, 0xdb, 0x92, 0xf7, - 0xef, 0xd3, 0xb9, 0x51, 0xfc, 0xd7, 0x01, 0x2e, 0x9b, 0x37, 0x87, 0xdf, - 0xeb, 0xb3, 0x08, 0xaa, 0x71, 0x48, 0xef, 0x0a, 0xcd, 0xd8, 0xad, 0x47, - 0x05, 0x8a, 0x2a, 0x6f, 0xe5, 0x90, 0xc4, 0x2c, 0xd6, 0x33, 0x4c, 0x4c, - 0x31, 0xe6, 0xb1, 0xd4, 0xd2, 0x63, 0x13, 0x0a, 0x5a, 0xba, 0x22, 0x79, - 0x89, 0x91, 0xcf, 0x7b, 0x91, 0x2f, 0x1c, 0x9f, 0x4d, 0xe9, 0x4f, 0x04, - 0x3a, 0xf0, 0xaa, 0xe3, 0x59, 0xc6, 0xf4, 0x0b, 0xc2, 0x8f, 0xe8, 0x4f, - 0x09, 0x7b, 0xd5, 0xbf, 0xd0, 0x54, 0xbe, 0x04, 0x74, 0x64, 0x4f, 0x88, - 0x95, 0xfd, 0x01, 0xe5, 0x78, 0xe0, 0x46, 0xaf, 0xee, 0x38, 0x19, 0xff, - 0x91, 0x79, 0x8b, 0x8c, 0x4d, 0x64, 0xb9, 0xad, 0xae, 0xec, 0xc2, 0x48, - 0xaa, 0x57, 0x7d, 0xb9, 0x64, 0x3b, 0xb5, 0xab, 0xce, 0xc0, 0xa3, 0x98, - 0x31, 0x69, 0x25, 0x52, 0x28, 0xce, 0x35, 0xce, 0x02, 0xd7, 0x92, 0x76, - 0x57, 0x5a, 0x3f, 0xcd, 0xee, 0xb9, 0xca, 0xdd, 0xd5, 0x15, 0xd7, 0x2d, - 0x3f, 0x9b, 0x7b, 0x88, 0x48, 0xe6, 0xaa, 0xf2, 0xe0, 0xcc, 0x4a, 0x6b, - 0xd0, 0xdc, 0xac, 0x80, 0xbd, 0x05, 0x2e, 0x0e, 0xa2, 0x03, 0xac, 0x12, - 0xc9, 0x42, 0x68, 0x4e, 0xdc, 0x6c, 0x10, 0x07, 0x6b, 0x71, 0x72, 0x5a, - 0x82, 0x97, 0x6f, 0xc8, 0x19, 0xca, 0xfd, 0x71, 0x4c, 0xd8, 0x2c, 0x9b, - 0x5b, 0xd8, 0xf3, 0xb2, 0x10, 0xc0, 0x30, 0xab, 0xd7, 0xbb, 0x21, 0x36, - 0xc3, 0x74, 0xaa, 0x08, 0xbd, 0x2a, 0x38, 0xe3, 0x8d, 0x70, 0x32, 0x93, - 0xfe, 0xe2, 0x66, 0x61, 0x3b, 0x6d, 0xfc, 0x4a, 0x98, 0x99, 0x06, 0xda, - 0xe2, 0x7a, 0x3b, 0xff, 0xfa, 0x7c, 0x10, 0x1d, 0x73, 0x4b, 0x32, 0x26, - 0xbd, 0x87, 0xa0, 0x41, 0xd1, 0x77, 0x34, 0xd9, 0x6b, 0x66, 0xe0, 0x67, - 0x39, 0xff, 0x85, 0xd6, 0xf4, 0x4b, 0x31, 0x9a, 0xe0, 0xdb, 0x6a, 0xaf, - 0xd4, 0x90, 0x45, 0xc4, 0x9d, 0xe3, 0x77, 0x3a, 0x2a, 0xc4, 0x1d, 0xdd, - 0x36, 0xf9, 0x1e, 0xb2, 0xbc, 0x02, 0xaf, 0x20, 0x6f, 0x46, 0xc4, 0x34, - 0xc1, 0xfa, 0x16, 0x2b, 0xec, 0x1f, 0x14, 0x6e, 0x60, 0x72, 0xe8, 0xf5, - 0x20, 0x0d, 0x04, 0xa4, 0xa5, 0xe4, 0xe7, 0x02, 0x6b, 0xe4, 0x5c, 0xe5, - 0x02, 0x2c, 0x90, 0x27, 0x1a, 0x86, 0x94, 0xa9, 0x03, 0x43, 0xf4, 0x8d, - 0x22, 0xa9, 0x1d, 0xd7, 0x40, 0xbc, 0xb2, 0x2f, 0x58, 0x28, 0xe6, 0xb1, - 0x10, 0x13, 0xa2, 0x2d, 0x18, 0x6c, 0xfc, 0xbf, 0xe1, 0xec, 0xb1, 0x7d, - 0xfd, 0x05, 0x02, 0x00, -}; -#define BUF_SIZE 0x10000 -/* Decompress and send to stdout a gzip-compressed buffer */ -void hugehelp(void) -{ - unsigned char* buf; - int status,headerlen; - z_stream z; - - /* Make sure no gzip options are set */ - if (hugehelpgz[3] & 0xfe) - return; - - headerlen = 10; - z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen); - z.next_in = (unsigned char *)hugehelpgz + headerlen; - z.zalloc = (alloc_func)Z_NULL; - z.zfree = (free_func)Z_NULL; - z.opaque = 0; - - if (inflateInit2(&z, -MAX_WBITS) != Z_OK) - return; - - buf = malloc(BUF_SIZE); - if (buf) { - while(1) { - z.avail_out = BUF_SIZE; - z.next_out = buf; - status = inflate(&z, Z_SYNC_FLUSH); - if (status == Z_OK || status == Z_STREAM_END) { - fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout); - if (status == Z_STREAM_END) - break; - } - else - break; /* Error */ - } - free(buf); - } - inflateEnd(&z); -} -#endif /* USE_MANUAL */ -#endif /* HAVE_LIBZ */ diff --git a/src/macos/MACINSTALL.TXT b/src/macos/MACINSTALL.TXT index 17da133..1839ef2 100644 --- a/src/macos/MACINSTALL.TXT +++ b/src/macos/MACINSTALL.TXT @@ -1 +1 @@ -MACOS (not MACOS X)
===================
This is the first attempt at porting cURL to MacOS.
http, ftp, dict and telnet seems to work fine, other protocols and advanced
features have not been all tested.
This port is heavily based on the GUSI library from Matthias Neeracher.
GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library
bringing some of the comforts of UNIX 98 to traditional MacOS.
The latest GUSI release can be downloaded from sourceforge
at <http://sourceforge.net/projects/gusi/>
I have also write a few functions to help port UNIX applications to MacOS.
These functions are part of the GUSI Extra library that can be downloaded at
<http://perso.wanadoo.fr/ela/resources.html#gusiextra>
OpenSSL support is still experimental but I hope to deliver a version
including SSL soon.
cURL for MacOS requires using the CodeWarrior compiler from Metrowerks.
First download GUSI, GUSI Extra and cURL. Access paths have been setup so that
GUSI, GUSI Extra and cURL directories should have the same parent directory.
Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to
SIOUX and GUSI patches. If you do not apply these patches curl will not behave
correctly.
In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a
stuffit binhexed file)
From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access
paths if required. Then you should be able to build:
- the libcurl libraries for PPC and 68K.
- the curl application (also available for PPC and 68K) which is the command
line version of cURL.
If the file "hugehelp.c" is missing rename "curl/src/hugehelp.c.cvs" to
"hugehelp.c" and make sure its file type is 'TEXT'
\ No newline at end of file +MACOS (not MACOS X)
===================
This is the first attempt at porting cURL to MacOS.
http, ftp, dict and telnet seems to work fine, other protocols and advanced
features have not been all tested.
This port is heavily based on the GUSI library from Matthias Neeracher.
GUSI (Grand Unified Socket Interface) is a POSIX/Pthreads/Sockets library
bringing some of the comforts of UNIX 98 to traditional MacOS.
The latest GUSI release can be downloaded from sourceforge
at <http://sourceforge.net/projects/gusi/>
I have also written a few functions to help port Unix applications to MacOS.
These functions are part of the GUSI Extra library that can be downloaded at
<http://perso.wanadoo.fr/ela/resources.html#gusiextra>
OpenSSL support is still experimental but I hope to deliver a version
including SSL soon.
cURL for MacOS requires using the CodeWarrior compiler from Metrowerks.
First download GUSI, GUSI Extra and cURL. Access paths have been setup so that
GUSI, GUSI Extra and cURL directories should have the same parent directory.
Follow the instructions in GUSI Extra "readme.txt" mainly the ones related to
SIOUX and GUSI patches. If you do not apply these patches curl will not behave
correctly.
In the 'curl/src/macos' directory, decode "curl.mcp.xml.sit.hqx" (This is a
stuffit binhexed file)
From the CodeWarrior IDE, import 'curl/src/macos/curl.xml', adjust the access
paths if required. Then you should be able to build:
- the libcurl libraries for PPC and 68K.
- the curl application (also available for PPC and 68K) which is the command
line version of cURL.
If the file "tool_hugehelp.c" is missing rename "curl/src/tool_hugehelp.c.cvs"
to "tool_hugehelp.c" and make sure its file type is 'TEXT'
diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 95b47ea..0000000 --- a/src/main.c +++ /dev/null @@ -1,6084 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ -#include "setup.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <ctype.h> -#include <errno.h> - -#if defined(MSDOS) || defined(WIN32) -# if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME) -# include <libgen.h> -# endif -#endif - -#include <curl/curl.h> - -#include "urlglob.h" -#include "writeout.h" -#include "getpass.h" -#include "homedir.h" -#include "curlutil.h" -#ifdef USE_MANUAL -#include "hugehelp.h" -#endif -#ifdef USE_ENVIRONMENT -#include "writeenv.h" -#endif -#include "rawstr.h" - -#define CURLseparator "--_curl_--" - -#ifdef NETWARE -#ifdef __NOVELL_LIBC__ -#include <screen.h> -#else -#include <nwconio.h> -#define mkdir mkdir_510 -#endif -#endif - -#include "version.h" - -#ifdef HAVE_IO_H /* typical win32 habit */ -#include <io.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif - -#ifdef HAVE_UTIME_H -#include <utime.h> -#else -#ifdef HAVE_SYS_UTIME_H -#include <sys/utime.h> -#endif - -#endif /* HAVE_UTIME_H */ - -#ifdef HAVE_LIMITS_H -#include <limits.h> -#endif - -#ifdef HAVE_SYS_POLL_H -#include <sys/poll.h> -#elif defined(HAVE_POLL_H) -#include <poll.h> -#endif - -#ifdef HAVE_LOCALE_H -#include <locale.h> /* for setlocale() */ -#endif - -#define ENABLE_CURLX_PRINTF -/* make the curlx header define all printf() functions to use the curlx_* - versions instead */ -#include "curlx.h" /* header from the libcurl directory */ - -#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV) -#include <iconv.h> -/* set default codesets for iconv */ -#ifndef CURL_ICONV_CODESET_OF_NETWORK -#define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" -#endif -#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */ - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> /* for IPPROTO_TCP */ -#endif -#ifdef HAVE_NETINET_TCP_H -#include <netinet/tcp.h> /* for TCP_KEEPIDLE, TCP_KEEPINTVL */ -#endif - -#include "os-specific.h" - -/* The last #include file should be: */ -#ifdef CURLDEBUG -#ifndef CURLTOOLDEBUG -#define MEMDEBUG_NODEFINES -#endif -/* This is low-level hard-hacking memory leak tracking and similar. Using - the library level code from this client-side is ugly, but we do this - anyway for convenience. */ -#include "memdebug.h" -#endif - -#ifdef __VMS -static int vms_show = 0; -#endif - -#if defined(NETWARE) -#define PRINT_LINES_PAUSE 23 -#endif - -#if defined(__SYMBIAN32__) -#define PRINT_LINES_PAUSE 16 -#define pressanykey() getchar() -#endif - -#define DEFAULT_MAXREDIRS 50L - -#if defined(O_BINARY) && defined(HAVE_SETMODE) -#ifdef __HIGHC__ -#define SET_BINMODE(file) _setmode(file,O_BINARY) -#else -#define SET_BINMODE(file) setmode(fileno(file),O_BINARY) -#endif -#else -#define SET_BINMODE(file) ((void)0) -#endif - -#ifndef O_BINARY -/* since O_BINARY as used in bitmasks, setting it to zero makes it usable in - source code but yet it doesn't ruin anything */ -#define O_BINARY 0 -#endif - -#if defined(MSDOS) || defined(WIN32) - -static const char *msdosify(const char *); -static char *rename_if_dos_device_name(char *); -static char *sanitize_dos_name(char *); - -#ifndef S_ISCHR -# ifdef S_IFCHR -# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -# else -# define S_ISCHR(m) (0) /* cannot tell if file is a device */ -# endif -#endif - -#ifdef WIN32 -# define _use_lfn(f) (1) /* long file names always available */ -#elif !defined(__DJGPP__) || (__DJGPP__ < 2) /* DJGPP 2.0 has _use_lfn() */ -# define _use_lfn(f) (0) /* long file names never available */ -#endif - -#endif /* MSDOS || WIN32 */ - -#ifdef MSDOS -#define USE_WATT32 -#include <dos.h> - -#ifdef DJGPP -/* we want to glob our own argv[] */ -char **__crt0_glob_function (char *arg) -{ - (void)arg; - return (char**)0; -} -#endif /* __DJGPP__ */ -#endif /* MSDOS */ - -#ifndef STDIN_FILENO -#define STDIN_FILENO fileno(stdin) -#endif - -#ifndef STDOUT_FILENO -#define STDOUT_FILENO fileno(stdout) -#endif - -#ifndef STDERR_FILENO -#define STDERR_FILENO fileno(stderr) -#endif - -#define CURL_PROGRESS_STATS 0 /* default progress display */ -#define CURL_PROGRESS_BAR 1 - -typedef enum { - HTTPREQ_UNSPEC, - HTTPREQ_GET, - HTTPREQ_HEAD, - HTTPREQ_POST, - HTTPREQ_SIMPLEPOST, - HTTPREQ_CUSTOM, - HTTPREQ_LAST -} HttpReq; - -/* - * Large file support (>2Gb) using WIN32 functions. - */ - -#ifdef USE_WIN32_LARGE_FILES -# include <io.h> -# include <sys/types.h> -# include <sys/stat.h> -# define lseek(fdes,offset,whence) _lseeki64(fdes, offset, whence) -# define fstat(fdes,stp) _fstati64(fdes, stp) -# define stat(fname,stp) _stati64(fname, stp) -# define struct_stat struct _stati64 -# define LSEEK_ERROR (__int64)-1 -#endif - -/* - * Small file support (<2Gb) using WIN32 functions. - */ - -#ifdef USE_WIN32_SMALL_FILES -# include <io.h> -# include <sys/types.h> -# include <sys/stat.h> -# define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence) -# define fstat(fdes,stp) _fstat(fdes, stp) -# define stat(fname,stp) _stat(fname, stp) -# define struct_stat struct _stat -# define LSEEK_ERROR (long)-1 -#endif - -#ifndef struct_stat -# define struct_stat struct stat -#endif - -#ifndef LSEEK_ERROR -# define LSEEK_ERROR (off_t)-1 -#endif - -#ifdef WIN32 -# include <direct.h> -# define mkdir(x,y) (mkdir)(x) -# undef PATH_MAX -# define PATH_MAX MAX_PATH -# ifndef __POCC__ -# define F_OK 0 -# endif -#endif - -/* - * Default sizeof(off_t) in case it hasn't been defined in config file. - */ - -#ifndef SIZEOF_OFF_T -# if defined(__VMS) && !defined(__VAX) -# if defined(_LARGEFILE) -# define SIZEOF_OFF_T 8 -# endif -# elif defined(__OS400__) && defined(__ILEC400__) -# if defined(_LARGE_FILES) -# define SIZEOF_OFF_T 8 -# endif -# elif defined(__MVS__) && defined(__IBMC__) -# if defined(_LP64) || defined(_LARGE_FILES) -# define SIZEOF_OFF_T 8 -# endif -# elif defined(__370__) && defined(__IBMC__) -# if defined(_LP64) || defined(_LARGE_FILES) -# define SIZEOF_OFF_T 8 -# endif -# elif defined(TPF) -# define SIZEOF_OFF_T 8 -# endif -# ifndef SIZEOF_OFF_T -# define SIZEOF_OFF_T 4 -# endif -#endif - -#ifdef CURL_DOES_CONVERSIONS -#ifdef HAVE_ICONV -iconv_t inbound_cd = (iconv_t)-1; -iconv_t outbound_cd = (iconv_t)-1; - -/* - * convert_to_network() is an internal function to convert - * from the host encoding to ASCII on non-ASCII platforms. - */ -static CURLcode -convert_to_network(char *buffer, size_t length) -{ - CURLcode rc; - - /* translate from the host encoding to the network encoding */ - char *input_ptr, *output_ptr; - size_t in_bytes, out_bytes; - - /* open an iconv conversion descriptor if necessary */ - if(outbound_cd == (iconv_t)-1) { - outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK, - CURL_ICONV_CODESET_OF_HOST); - if(outbound_cd == (iconv_t)-1) { - return CURLE_CONV_FAILED; - } - } - /* call iconv */ - input_ptr = output_ptr = buffer; - in_bytes = out_bytes = length; - rc = iconv(outbound_cd, &input_ptr, &in_bytes, - &output_ptr, &out_bytes); - if((rc == -1) || (in_bytes != 0)) { - return CURLE_CONV_FAILED; - } - - return CURLE_OK; -} - -/* - * convert_from_network() is an internal function - * for performing ASCII conversions on non-ASCII platforms. - */ -static CURLcode -convert_from_network(char *buffer, size_t length) -{ - CURLcode rc; - - /* translate from the network encoding to the host encoding */ - char *input_ptr, *output_ptr; - size_t in_bytes, out_bytes; - - /* open an iconv conversion descriptor if necessary */ - if(inbound_cd == (iconv_t)-1) { - inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST, - CURL_ICONV_CODESET_OF_NETWORK); - if(inbound_cd == (iconv_t)-1) { - return CURLE_CONV_FAILED; - } - } - /* call iconv */ - input_ptr = output_ptr = buffer; - in_bytes = out_bytes = length; - rc = iconv(inbound_cd, &input_ptr, &in_bytes, - &output_ptr, &out_bytes); - if((rc == -1) || (in_bytes != 0)) { - return CURLE_CONV_FAILED; - } - - return CURLE_OK; -} -#endif /* HAVE_ICONV */ - -static -char convert_char(curl_infotype infotype, char this_char) -{ -/* determine how this specific character should be displayed */ - switch(infotype) { - case CURLINFO_DATA_IN: - case CURLINFO_DATA_OUT: - case CURLINFO_SSL_DATA_IN: - case CURLINFO_SSL_DATA_OUT: - /* data, treat as ASCII */ - if((this_char >= 0x20) && (this_char < 0x7f)) { - /* printable ASCII hex value: convert to host encoding */ - convert_from_network(&this_char, 1); - } - else { - /* non-printable ASCII, use a replacement character */ - return UNPRINTABLE_CHAR; - } - /* fall through to default */ - default: - /* treat as host encoding */ - if(ISPRINT(this_char) - && (this_char != '\t') - && (this_char != '\r') - && (this_char != '\n')) { - /* printable characters excluding tabs and line end characters */ - return this_char; - } - break; - } - /* non-printable, use a replacement character */ - return UNPRINTABLE_CHAR; -} -#endif /* CURL_DOES_CONVERSIONS */ - -#ifdef WIN32 - -#ifdef __BORLANDC__ -/* 64-bit lseek-like function unavailable */ -# define _lseeki64(hnd,ofs,whence) lseek(hnd,ofs,whence) -#endif - -#ifdef __POCC__ -# if(__POCC__ < 450) -/* 64-bit lseek-like function unavailable */ -# define _lseeki64(hnd,ofs,whence) _lseek(hnd,ofs,whence) -# else -# define _lseeki64(hnd,ofs,whence) _lseek64(hnd,ofs,whence) -# endif -#endif - -#ifndef HAVE_FTRUNCATE -#define HAVE_FTRUNCATE 1 -#endif - -/* - * Truncate a file handle at a 64-bit position 'where'. - */ - -static int ftruncate64(int fd, curl_off_t where) -{ - if(_lseeki64(fd, where, SEEK_SET) < 0) - return -1; - - if(!SetEndOfFile((HANDLE)_get_osfhandle(fd))) - return -1; - - return 0; -} -#define ftruncate(fd,where) ftruncate64(fd,where) - -#endif /* WIN32 */ - -typedef enum { - TRACE_NONE, /* no trace/verbose output at all! */ - TRACE_BIN, /* tcpdump inspired look */ - TRACE_ASCII, /* like *BIN but without the hex output */ - TRACE_PLAIN /* -v/--verbose type */ -} trace; - -struct OutStruct { - char *filename; - FILE *stream; - struct Configurable *config; - curl_off_t bytes; /* amount written so far */ - curl_off_t init; /* original size (non-zero when appending) */ -}; - -struct Configurable { - CURL *easy; /* once we have one, we keep it here */ - bool remote_time; - char *random_file; - char *egd_file; - char *useragent; - char *cookie; /* single line with specified cookies */ - char *cookiejar; /* write to this file */ - char *cookiefile; /* read from this file */ - bool cookiesession; /* new session? */ - bool encoding; /* Accept-Encoding please */ - long authtype; /* auth bitmask */ - bool use_resume; - bool resume_from_current; - bool disable_epsv; - bool disable_eprt; - bool ftp_pret; - long proto; - bool proto_present; - long proto_redir; - bool proto_redir_present; - curl_off_t resume_from; - char *postfields; - curl_off_t postfieldsize; - char *referer; - long timeout; - long connecttimeout; - long maxredirs; - curl_off_t max_filesize; - char *headerfile; - char *ftpport; - char *iface; - int localport; - int localportrange; - unsigned short porttouse; - char *range; - long low_speed_limit; - long low_speed_time; - bool showerror; - char *userpwd; - char *proxyuserpwd; - char *proxy; - int proxyver; /* set to CURLPROXY_HTTP* define */ - char *noproxy; - char *mail_from; - struct curl_slist *mail_rcpt; - bool proxytunnel; - bool ftp_append; /* APPE on ftp */ - bool mute; /* shutup */ - bool use_ascii; /* select ascii or text transfer */ - bool autoreferer; /* automatically set referer */ - bool failonerror; /* fail on (HTTP) errors */ - bool include_headers; /* send headers to data output */ - bool no_body; /* don't get the body */ - bool dirlistonly; /* only get the FTP dir list */ - bool followlocation; /* follow http redirects */ - bool unrestricted_auth; /* Continue to send authentication (user+password) - when following ocations, even when hostname - changed */ - bool netrc_opt; - bool netrc; - bool noprogress; - bool isatty; /* updated internally only if the output is a tty */ - struct getout *url_list; /* point to the first node */ - struct getout *url_last; /* point to the last/current node */ - struct getout *url_get; /* point to the node to fill in URL */ - struct getout *url_out; /* point to the node to fill in outfile */ - char *cipher_list; - char *cert; - char *cert_type; - char *cacert; - char *capath; - char *crlfile; - char *key; - char *key_type; - char *key_passwd; - char *pubkey; - char *hostpubmd5; - char *engine; - bool list_engines; - bool crlf; - char *customrequest; - char *krblevel; - char *trace_dump; /* file to dump the network trace to, or NULL */ - FILE *trace_stream; - bool trace_fopened; - trace tracetype; - bool tracetime; /* include timestamp? */ - long httpversion; - int progressmode; - bool nobuffer; - bool readbusy; /* set when reading input returns EAGAIN */ - bool globoff; - bool use_httpget; - bool insecure_ok; /* set TRUE to allow insecure SSL connects */ - bool create_dirs; - bool ftp_create_dirs; - bool ftp_skip_ip; - bool proxynegotiate; - bool proxyntlm; - bool proxydigest; - bool proxybasic; - bool proxyanyauth; - char *writeout; /* %-styled format string to output */ - bool writeenv; /* write results to environment, if available */ - FILE *errors; /* if stderr redirect is requested */ - bool errors_fopened; - struct curl_slist *quote; - struct curl_slist *postquote; - struct curl_slist *prequote; - long ssl_version; - long ip_version; - curl_TimeCond timecond; - time_t condtime; - struct curl_slist *headers; - struct curl_httppost *httppost; - struct curl_httppost *last_post; - struct curl_slist *telnet_options; - HttpReq httpreq; - - /* for bandwidth limiting features: */ - curl_off_t sendpersecond; /* send to peer */ - curl_off_t recvpersecond; /* receive from peer */ - - bool ftp_ssl; - bool ftp_ssl_reqd; - bool ftp_ssl_control; - bool ftp_ssl_ccc; - int ftp_ssl_ccc_mode; - - char *socksproxy; /* set to server string */ - int socksver; /* set to CURLPROXY_SOCKS* define */ - char *socks5_gssapi_service; /* set service name for gssapi principal - * default rcmd */ - int socks5_gssapi_nec ; /* The NEC reference server does not protect - * the encryption type exchange */ - - bool tcp_nodelay; - long req_retry; /* number of retries */ - long retry_delay; /* delay between retries (in seconds) */ - long retry_maxtime; /* maximum time to keep retrying */ - - char *ftp_account; /* for ACCT */ - char *ftp_alternative_to_user; /* send command if USER/PASS fails */ - int ftp_filemethod; - long tftp_blksize; /* TFTP BLKSIZE option */ - bool ignorecl; /* --ignore-content-length */ - bool disable_sessionid; - - char *libcurl; /* output libcurl code to this file name */ - bool raw; - bool post301; - bool post302; - bool nokeepalive; /* for keepalive needs */ - long alivetime; - bool content_disposition; /* use Content-disposition filename */ - - int default_node_flags; /* default flags to seach for each 'node', which is - basically each given URL to transfer */ - struct OutStruct *outs; -}; - -#define WARN_PREFIX "Warning: " -#define WARN_TEXTWIDTH (79 - (int)strlen(WARN_PREFIX)) -/* produce this text message to the user unless mute was selected */ -static void warnf(struct Configurable *config, const char *fmt, ...) -{ - if(!config->mute) { - va_list ap; - int len; - char *ptr; - char print_buffer[256]; - - va_start(ap, fmt); - len = vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap); - va_end(ap); - - ptr = print_buffer; - while(len > 0) { - fputs(WARN_PREFIX, config->errors); - - if(len > (int)WARN_TEXTWIDTH) { - int cut = WARN_TEXTWIDTH-1; - - while(!ISSPACE(ptr[cut]) && cut) { - cut--; - } - if(0 == cut) - /* not a single cutting position was found, just cut it at the - max text width then! */ - cut = WARN_TEXTWIDTH-1; - - (void)fwrite(ptr, cut + 1, 1, config->errors); - fputs("\n", config->errors); - ptr += cut+1; /* skip the space too */ - len -= cut; - } - else { - fputs(ptr, config->errors); - len = 0; - } - } - } -} - -/* - * This is the main global constructor for the app. Call this before - * _any_ libcurl usage. If this fails, *NO* libcurl functions may be - * used, or havoc may be the result. - */ -static CURLcode main_init(void) -{ -#ifdef DJGPP - /* stop stat() wasting time */ - _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE; -#endif - - return curl_global_init(CURL_GLOBAL_DEFAULT); -} - -/* - * This is the main global destructor for the app. Call this after - * _all_ libcurl usage is done. - */ -static void main_free(void) -{ - curl_global_cleanup(); -#if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV) - /* close iconv conversion descriptor */ - if(inbound_cd != (iconv_t)-1) - iconv_close(inbound_cd); - if(outbound_cd != (iconv_t)-1) - iconv_close(outbound_cd); -#endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */ -} - -static int SetHTTPrequest(struct Configurable *config, - HttpReq req, HttpReq *store) -{ - if((*store == HTTPREQ_UNSPEC) || - (*store == req)) { - *store = req; - return 0; - } - warnf(config, "You can only select one HTTP request!\n"); - return 1; -} - -static void helpf(FILE *errors, const char *fmt, ...) -{ - va_list ap; - if(fmt) { - va_start(ap, fmt); - fputs("curl: ", errors); /* prefix it */ - vfprintf(errors, fmt, ap); - va_end(ap); - } - fprintf(errors, "curl: try 'curl --help' " -#ifdef USE_MANUAL - "or 'curl --manual' " -#endif - "for more information\n"); -} - -/* - * A chain of these nodes contain URL to get and where to put the URL's - * contents. - */ -struct getout { - struct getout *next; /* next one */ - char *url; /* the URL we deal with */ - char *outfile; /* where to store the output */ - char *infile; /* file to upload, if GETOUT_UPLOAD is set */ - int flags; /* options */ -}; -#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */ -#define GETOUT_URL (1<<1) /* set when URL is deemed done */ -#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */ -#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */ -#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */ - -static void help(void) -{ - int i; - /* A few of these source lines are >80 columns wide, but that's only because - breaking the strings narrower makes this chunk look even worse! - - Starting with 7.18.0, this list of command line options is sorted based - on the long option name. It is not done automatically, although a command - line like the following can help out: - - curl --help | cut -c5- | grep "^-" | sort - */ - static const char * const helptext[]={ - "Usage: curl [options...] <url>", - "Options: (H) means HTTP/HTTPS only, (F) means FTP only", - " --anyauth Pick \"any\" authentication method (H)", - " -a/--append Append to target file when uploading (F/SFTP)", - " --basic Use HTTP Basic Authentication (H)", - " --cacert <file> CA certificate to verify peer against (SSL)", - " --capath <directory> CA directory to verify peer against (SSL)", - " -E/--cert <cert[:passwd]> Client certificate file and password (SSL)", - " --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)", - " --ciphers <list> SSL ciphers to use (SSL)", - " --compressed Request compressed response (using deflate or gzip)", - " -K/--config <file> Specify which config file to read", - " --connect-timeout <seconds> Maximum time allowed for connection", - " -C/--continue-at <offset> Resumed transfer offset", - " -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)", - " -c/--cookie-jar <file> Write cookies to this file after operation (H)", - " --create-dirs Create necessary local directory hierarchy", - " --crlf Convert LF to CRLF in upload", - " --crlfile <file> Get a CRL list in PEM format from the given file", - " -d/--data <data> HTTP POST data (H)", - " --data-ascii <data> HTTP POST ASCII data (H)", - " --data-binary <data> HTTP POST binary data (H)", - " --data-urlencode <name=data/name@filename> HTTP POST data url encoded (H)", - " --digest Use HTTP Digest Authentication (H)", - " --disable-eprt Inhibit using EPRT or LPRT (F)", - " --disable-epsv Inhibit using EPSV (F)", - " -D/--dump-header <file> Write the headers to this file", - " --egd-file <file> EGD socket path for random data (SSL)", - " --engine <eng> Crypto engine to use (SSL). \"--engine list\" for list", -#ifdef USE_ENVIRONMENT - " --environment Write results to environment variables (RISC OS)", -#endif - " -f/--fail Fail silently (no output at all) on HTTP errors (H)", - " -F/--form <name=content> Specify HTTP multipart POST data (H)", - " --form-string <name=string> Specify HTTP multipart POST data (H)", - " --ftp-account <data> Account data to send when requested by server (F)", - " --ftp-alternative-to-user <cmd> String to replace \"USER [name]\" (F)", - " --ftp-create-dirs Create the remote dirs if not present (F)", - " --ftp-method [multicwd/nocwd/singlecwd] Control CWD usage (F)", - " --ftp-pasv Use PASV/EPSV instead of PORT (F)", - " -P/--ftp-port <address> Use PORT with address instead of PASV (F)", - " --ftp-skip-pasv-ip Skip the IP address for PASV (F)\n" - " --ftp-pret Send PRET before PASV (for drftpd) (F)", - " --ftp-ssl-ccc Send CCC after authenticating (F)", - " --ftp-ssl-ccc-mode [active/passive] Set CCC mode (F)", - " --ftp-ssl-control Require SSL/TLS for ftp login, clear for transfer (F)", - " -G/--get Send the -d data with a HTTP GET (H)", - " -g/--globoff Disable URL sequences and ranges using {} and []", - " -H/--header <line> Custom header to pass to server (H)", - " -I/--head Show document info only", - " -h/--help This help text", - " --hostpubmd5 <md5> Hex encoded MD5 string of the host public key. (SSH)", - " -0/--http1.0 Use HTTP 1.0 (H)", - " --ignore-content-length Ignore the HTTP Content-Length header", - " -i/--include Include protocol headers in the output (H/F)", - " -k/--insecure Allow connections to SSL sites without certs (H)", - " --interface <interface> Specify network interface/address to use", - " -4/--ipv4 Resolve name to IPv4 address", - " -6/--ipv6 Resolve name to IPv6 address", - " -j/--junk-session-cookies Ignore session cookies read from file (H)", - " --keepalive-time <seconds> Interval between keepalive probes", - " --key <key> Private key file name (SSL/SSH)", - " --key-type <type> Private key file type (DER/PEM/ENG) (SSL)", - " --krb <level> Enable Kerberos with specified security level (F)", - " --libcurl <file> Dump libcurl equivalent code of this command line", - " --limit-rate <rate> Limit transfer speed to this rate", - " -J/--remote-header-name Use the header-provided filename (H)", - " -l/--list-only List only names of an FTP directory (F)", - " --local-port <num>[-num] Force use of these local port numbers", - " -L/--location Follow Location: hints (H)", - " --location-trusted Follow Location: and send auth to other hosts (H)", - " -M/--manual Display the full manual", - " --mail-from <from> Mail from this address", - " --mail-rcpt <to> Mail to this receiver(s)", - " --max-filesize <bytes> Maximum file size to download (H/F)", - " --max-redirs <num> Maximum number of redirects allowed (H)", - " -m/--max-time <seconds> Maximum time allowed for the transfer", - " --negotiate Use HTTP Negotiate Authentication (H)", - " -n/--netrc Must read .netrc for user name and password", - " --netrc-optional Use either .netrc or URL; overrides -n", - " -N/--no-buffer Disable buffering of the output stream", - " --no-keepalive Disable keepalive use on the connection", - " --no-sessionid Disable SSL session-ID reusing (SSL)", - " --noproxy Comma-separated list of hosts which do not use proxy", - " --ntlm Use HTTP NTLM authentication (H)", - " -o/--output <file> Write output to <file> instead of stdout", - " --pass <pass> Pass phrase for the private key (SSL/SSH)", - " --post301 Do not switch to GET after following a 301 redirect (H)", - " --post302 Do not switch to GET after following a 302 redirect (H)", - " -#/--progress-bar Display transfer progress as a progress bar", - " --proto <protocols> Enable/disable specified protocols", - " --proto-redir <protocols> Enable/disable specified protocols on redirect", - " -x/--proxy <host[:port]> Use HTTP proxy on given port", - " --proxy-anyauth Pick \"any\" proxy authentication method (H)", - " --proxy-basic Use Basic authentication on the proxy (H)", - " --proxy-digest Use Digest authentication on the proxy (H)", - " --proxy-negotiate Use Negotiate authentication on the proxy (H)", - " --proxy-ntlm Use NTLM authentication on the proxy (H)", - " -U/--proxy-user <user[:password]> Set proxy user and password", - " --proxy1.0 <host[:port]> Use HTTP/1.0 proxy on given port", - " -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)", - " --pubkey <key> Public key file name (SSH)", - " -Q/--quote <cmd> Send command(s) to server before file transfer (F/SFTP)", - " --random-file <file> File for reading random data from (SSL)", - " -r/--range <range> Retrieve only the bytes within a range", - " --raw Pass HTTP \"raw\", without any transfer decoding (H)", - " -e/--referer Referer URL (H)", - " -O/--remote-name Write output to a file named as the remote file", - " --remote-name-all Use the remote file name for all URLs", - " -R/--remote-time Set the remote file's time on the local output", - " -X/--request <command> Specify request command to use", - " --retry <num> Retry request <num> times if transient problems occur", - " --retry-delay <seconds> When retrying, wait this many seconds between each", - " --retry-max-time <seconds> Retry only within this period", - " -S/--show-error Show error. With -s, make curl show errors when they occur", - " -s/--silent Silent mode. Don't output anything", - " --socks4 <host[:port]> SOCKS4 proxy on given host + port", - " --socks4a <host[:port]> SOCKS4a proxy on given host + port", - " --socks5 <host[:port]> SOCKS5 proxy on given host + port", - " --socks5-hostname <host[:port]> SOCKS5 proxy, pass host name to proxy", -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - " --socks5-gssapi-service <name> SOCKS5 proxy service name for gssapi", - " --socks5-gssapi-nec Compatibility with NEC SOCKS5 server", -#endif - " -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs", - " -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30", - " --ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)", - " --ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)", - " -2/--sslv2 Use SSLv2 (SSL)", - " -3/--sslv3 Use SSLv3 (SSL)", - " --stderr <file> Where to redirect stderr. - means stdout", - " --tcp-nodelay Use the TCP_NODELAY option", - " -t/--telnet-option <OPT=val> Set telnet option", - " --tftp-blksize <value> Set TFTP BLKSIZE option (must be >512)", - " -z/--time-cond <time> Transfer based on a time condition", - " -1/--tlsv1 Use TLSv1 (SSL)", - " --trace <file> Write a debug trace to the given file", - " --trace-ascii <file> Like --trace but without the hex output", - " --trace-time Add time stamps to trace/verbose output", - " -T/--upload-file <file> Transfer <file> to remote site", - " --url <URL> Set URL to work with", - " -B/--use-ascii Use ASCII/text transfer", - " -u/--user <user[:password]> Set server user and password", - " -A/--user-agent <string> User-Agent to send to server (H)", - " -v/--verbose Make the operation more talkative", - " -V/--version Show version number and quit", - -#ifdef USE_WATT32 - " --wdebug Turn on Watt-32 debugging", -#endif - " -w/--write-out <format> What to output after completion", - " -q If used as the first parameter disables .curlrc", - NULL - }; - for(i=0; helptext[i]; i++) { - puts(helptext[i]); -#ifdef PRINT_LINES_PAUSE - if(i && ((i % PRINT_LINES_PAUSE) == 0)) - pressanykey(); -#endif - } -} - -struct LongShort { - const char *letter; - const char *lname; - bool extraparam; -}; - -/* global variable to hold info about libcurl */ -static curl_version_info_data *curlinfo; - -static int parseconfig(const char *filename, - struct Configurable *config); -static char *my_get_line(FILE *fp); -static int create_dir_hierarchy(const char *outfile, FILE *errors); - -static void GetStr(char **string, - const char *value) -{ - if(*string) - free(*string); - if(value) - *string = strdup(value); - else - *string = NULL; -} - -static void clean_getout(struct Configurable *config) -{ - struct getout *node=config->url_list; - struct getout *next; - - while(node) { - next = node->next; - if(node->url) - free(node->url); - if(node->outfile) - free(node->outfile); - if(node->infile) - free(node->infile); - free(node); - - node = next; /* GOTO next */ - } -} - -static struct getout *new_getout(struct Configurable *config) -{ - struct getout *node =malloc(sizeof(struct getout)); - struct getout *last= config->url_last; - if(node) { - /* clear the struct */ - memset(node, 0, sizeof(struct getout)); - - /* append this new node last in the list */ - if(last) - last->next = node; - else - config->url_list = node; /* first node */ - - /* move the last pointer */ - config->url_last = node; - - node->flags = config->default_node_flags; - } - return node; -} - -/* Structure for storing the information needed to build a multiple files - * section - */ -struct multi_files { - struct curl_forms form; - struct multi_files *next; -}; - -/* Add a new list entry possibly with a type_name - */ -static struct multi_files * -AddMultiFiles(const char *file_name, - const char *type_name, - const char *show_filename, - struct multi_files **multi_start, - struct multi_files **multi_current) -{ - struct multi_files *multi; - struct multi_files *multi_type = NULL; - struct multi_files *multi_name = NULL; - multi = malloc(sizeof(struct multi_files)); - if(multi) { - memset(multi, 0, sizeof(struct multi_files)); - multi->form.option = CURLFORM_FILE; - multi->form.value = file_name; - } - else - return NULL; - - if(!*multi_start) - *multi_start = multi; - - if(type_name) { - multi_type = malloc(sizeof(struct multi_files)); - if(multi_type) { - memset(multi_type, 0, sizeof(struct multi_files)); - multi_type->form.option = CURLFORM_CONTENTTYPE; - multi_type->form.value = type_name; - multi->next = multi_type; - - multi = multi_type; - } - else { - free(multi); - return NULL; - } - } - if(show_filename) { - multi_name = malloc(sizeof(struct multi_files)); - if(multi_name) { - memset(multi_name, 0, sizeof(struct multi_files)); - multi_name->form.option = CURLFORM_FILENAME; - multi_name->form.value = show_filename; - multi->next = multi_name; - - multi = multi_name; - } - else { - free(multi); - return NULL; - } - } - - if(*multi_current) - (*multi_current)->next = multi; - - *multi_current = multi; - - return *multi_current; -} - -/* Free the items of the list. - */ -static void FreeMultiInfo(struct multi_files *multi_start) -{ - struct multi_files *multi; - while(multi_start) { - multi = multi_start; - multi_start = multi_start->next; - free(multi); - } -} - -/* Print list of OpenSSL engines supported. - */ -static void list_engines(const struct curl_slist *engines) -{ - puts("Build-time engines:"); - if(!engines) { - puts(" <none>"); - return; - } - for( ; engines; engines = engines->next) - printf(" %s\n", engines->data); -} - -/*************************************************************************** - * - * formparse() - * - * Reads a 'name=value' parameter and builds the appropriate linked list. - * - * Specify files to upload with 'name=@filename'. Supports specified - * given Content-Type of the files. Such as ';type=<content-type>'. - * - * If literal_value is set, any initial '@' or '<' in the value string - * loses its special meaning, as does any embedded ';type='. - * - * You may specify more than one file for a single name (field). Specify - * multiple files by writing it like: - * - * 'name=@filename,filename2,filename3' - * - * If you want content-types specified for each too, write them like: - * - * 'name=@filename;type=image/gif,filename2,filename3' - * - * If you want custom headers added for a single part, write them in a separate - * file and do like this: - * - * 'name=foo;headers=@headerfile' or why not - * 'name=@filemame;headers=@headerfile' - * - * To upload a file, but to fake the file name that will be included in the - * formpost, do like this: - * - * 'name=@filename;filename=/dev/null' - * - * This function uses curl_formadd to fulfill it's job. Is heavily based on - * the old curl_formparse code. - * - ***************************************************************************/ - -#define FORM_FILE_SEPARATOR ',' -#define FORM_TYPE_SEPARATOR ';' - -static int formparse(struct Configurable *config, - const char *input, - struct curl_httppost **httppost, - struct curl_httppost **last_post, - bool literal_value) -{ - /* nextarg MUST be a string in the format 'name=contents' and we'll - build a linked list with the info */ - char name[256]; - char *contents; - char major[128]; - char minor[128]; - char *contp; - const char *type = NULL; - char *sep; - char *sep2; - - if((1 == sscanf(input, "%255[^=]=", name)) && - (contp = strchr(input, '='))) { - /* the input was using the correct format */ - - /* Allocate the contents */ - contents = strdup(contp+1); - if(!contents) { - fprintf(config->errors, "out of memory\n"); - return 1; - } - contp = contents; - - if('@' == contp[0] && !literal_value) { - struct multi_files *multi_start = NULL, *multi_current = NULL; - /* we use the @-letter to indicate file name(s) */ - contp++; - - multi_start = multi_current=NULL; - - do { - /* since this was a file, it may have a content-type specifier - at the end too, or a filename. Or both. */ - char *ptr; - char *filename=NULL; - - sep=strchr(contp, FORM_TYPE_SEPARATOR); - sep2=strchr(contp, FORM_FILE_SEPARATOR); - - /* pick the closest */ - if(sep2 && (sep2 < sep)) { - sep = sep2; - - /* no type was specified! */ - } - - type = NULL; - - if(sep) { - - /* if we got here on a comma, don't do much */ - if(FORM_FILE_SEPARATOR == *sep) - ptr = NULL; - else - ptr = sep+1; - - *sep=0; /* terminate file name at separator */ - - while(ptr && (FORM_FILE_SEPARATOR!= *ptr)) { - - /* pass all white spaces */ - while(ISSPACE(*ptr)) - ptr++; - - if(checkprefix("type=", ptr)) { - /* set type pointer */ - type = &ptr[5]; - - /* verify that this is a fine type specifier */ - if(2 != sscanf(type, "%127[^/]/%127[^;,\n]", - major, minor)) { - warnf(config, "Illegally formatted content-type field!\n"); - free(contents); - FreeMultiInfo(multi_start); - return 2; /* illegal content-type syntax! */ - } - - /* now point beyond the content-type specifier */ - sep = (char *)type + strlen(major)+strlen(minor)+1; - - /* there's a semicolon following - we check if it is a filename - specified and if not we simply assume that it is text that - the user wants included in the type and include that too up - to the next zero or semicolon. */ - if((*sep==';') && !checkprefix(";filename=", sep)) { - sep2 = strchr(sep+1, ';'); - if(sep2) - sep = sep2; - else - sep = sep+strlen(sep); /* point to end of string */ - } - - if(*sep) { - *sep=0; /* zero terminate type string */ - - ptr=sep+1; - } - else - ptr = NULL; /* end */ - } - else if(checkprefix("filename=", ptr)) { - filename = &ptr[9]; - ptr=strchr(filename, FORM_TYPE_SEPARATOR); - if(!ptr) { - ptr=strchr(filename, FORM_FILE_SEPARATOR); - } - if(ptr) { - *ptr=0; /* zero terminate */ - ptr++; - } - } - else - /* confusion, bail out of loop */ - break; - } - /* find the following comma */ - if(ptr) - sep=strchr(ptr, FORM_FILE_SEPARATOR); - else - sep=NULL; - } - else { - sep=strchr(contp, FORM_FILE_SEPARATOR); - } - if(sep) { - /* the next file name starts here */ - *sep =0; - sep++; - } - /* if type == NULL curl_formadd takes care of the problem */ - - if(!AddMultiFiles(contp, type, filename, &multi_start, - &multi_current)) { - warnf(config, "Error building form post!\n"); - free(contents); - FreeMultiInfo(multi_start); - return 3; - } - contp = sep; /* move the contents pointer to after the separator */ - - } while(sep && *sep); /* loop if there's another file name */ - - /* now we add the multiple files section */ - if(multi_start) { - struct curl_forms *forms = NULL; - struct multi_files *ptr = multi_start; - unsigned int i, count = 0; - while(ptr) { - ptr = ptr->next; - ++count; - } - forms = malloc((count+1)*sizeof(struct curl_forms)); - if(!forms) - { - fprintf(config->errors, "Error building form post!\n"); - free(contents); - FreeMultiInfo(multi_start); - return 4; - } - for(i = 0, ptr = multi_start; i < count; ++i, ptr = ptr->next) - { - forms[i].option = ptr->form.option; - forms[i].value = ptr->form.value; - } - forms[count].option = CURLFORM_END; - FreeMultiInfo(multi_start); - if(curl_formadd(httppost, last_post, - CURLFORM_COPYNAME, name, - CURLFORM_ARRAY, forms, CURLFORM_END) != 0) { - warnf(config, "curl_formadd failed!\n"); - free(forms); - free(contents); - return 5; - } - free(forms); - } - } - else { - struct curl_forms info[4]; - int i = 0; - char *ct = literal_value? NULL: strstr(contp, ";type="); - - info[i].option = CURLFORM_COPYNAME; - info[i].value = name; - i++; - - if(ct) { - info[i].option = CURLFORM_CONTENTTYPE; - info[i].value = &ct[6]; - i++; - ct[0]=0; /* zero terminate here */ - } - - if( contp[0]=='<' && !literal_value) { - info[i].option = CURLFORM_FILECONTENT; - info[i].value = contp+1; - i++; - info[i].option = CURLFORM_END; - - if(curl_formadd(httppost, last_post, - CURLFORM_ARRAY, info, CURLFORM_END ) != 0) { - warnf(config, "curl_formadd failed, possibly the file %s is bad!\n", - contp+1); - free(contents); - return 6; - } - } - else { -#ifdef CURL_DOES_CONVERSIONS - convert_to_network(contp, strlen(contp)); -#endif - info[i].option = CURLFORM_COPYCONTENTS; - info[i].value = contp; - i++; - info[i].option = CURLFORM_END; - if(curl_formadd(httppost, last_post, - CURLFORM_ARRAY, info, CURLFORM_END) != 0) { - warnf(config, "curl_formadd failed!\n"); - free(contents); - return 7; - } - } - } - - } - else { - warnf(config, "Illegally formatted input field!\n"); - return 1; - } - free(contents); - return 0; -} - - -typedef enum { - PARAM_OK, - PARAM_OPTION_AMBIGUOUS, - PARAM_OPTION_UNKNOWN, - PARAM_REQUIRES_PARAMETER, - PARAM_BAD_USE, - PARAM_HELP_REQUESTED, - PARAM_GOT_EXTRA_PARAMETER, - PARAM_BAD_NUMERIC, - PARAM_LIBCURL_DOESNT_SUPPORT, - PARAM_NO_MEM, - PARAM_LAST -} ParameterError; - -static const char *param2text(int res) -{ - ParameterError error = (ParameterError)res; - switch(error) { - case PARAM_GOT_EXTRA_PARAMETER: - return "had unsupported trailing garbage"; - case PARAM_OPTION_UNKNOWN: - return "is unknown"; - case PARAM_OPTION_AMBIGUOUS: - return "is ambiguous"; - case PARAM_REQUIRES_PARAMETER: - return "requires parameter"; - case PARAM_BAD_USE: - return "is badly used here"; - case PARAM_BAD_NUMERIC: - return "expected a proper numerical parameter"; - case PARAM_LIBCURL_DOESNT_SUPPORT: - return "the installed libcurl version doesn't support this"; - case PARAM_NO_MEM: - return "out of memory"; - default: - return "unknown error"; - } -} - -static ParameterError file2string(char **bufp, FILE *file) -{ - char buffer[256]; - char *ptr; - char *string = NULL; - size_t stringlen = 0; - size_t buflen; - - if(file) { - while(fgets(buffer, sizeof(buffer), file)) { - if((ptr = strchr(buffer, '\r')) != NULL) - *ptr = '\0'; - if((ptr = strchr(buffer, '\n')) != NULL) - *ptr = '\0'; - buflen = strlen(buffer); - if((ptr = realloc(string, stringlen+buflen+1)) == NULL) { - if(string) - free(string); - return PARAM_NO_MEM; - } - string = ptr; - strcpy(string+stringlen, buffer); - stringlen += buflen; - } - } - *bufp = string; - return PARAM_OK; -} - -static ParameterError file2memory(char **bufp, size_t *size, FILE *file) -{ - char *newbuf; - char *buffer = NULL; - size_t alloc = 512; - size_t nused = 0; - size_t nread; - - if(file) { - do { - if(!buffer || (alloc == nused)) { - /* size_t overflow detection for huge files */ - if(alloc+1 > ((size_t)-1)/2) { - if(buffer) - free(buffer); - return PARAM_NO_MEM; - } - alloc *= 2; - /* allocate an extra char, reserved space, for null termination */ - if((newbuf = realloc(buffer, alloc+1)) == NULL) { - if(buffer) - free(buffer); - return PARAM_NO_MEM; - } - buffer = newbuf; - } - nread = fread(buffer+nused, 1, alloc-nused, file); - nused += nread; - } while(nread); - /* null terminate the buffer in case it's used as a string later */ - buffer[nused] = '\0'; - /* free trailing slack space, if possible */ - if(alloc != nused) { - if((newbuf = realloc(buffer, nused+1)) != NULL) - buffer = newbuf; - } - /* discard buffer if nothing was read */ - if(!nused) { - free(buffer); - buffer = NULL; /* no string */ - } - } - *size = nused; - *bufp = buffer; - return PARAM_OK; -} - -static void cleanarg(char *str) -{ -#ifdef HAVE_WRITABLE_ARGV - /* now that GetStr has copied the contents of nextarg, wipe the next - * argument out so that the username:password isn't displayed in the - * system process list */ - if(str) { - size_t len = strlen(str); - memset(str, ' ', len); - } -#else - (void)str; -#endif -} - -/* - * Parse the string and write the integer in the given address. Return - * non-zero on failure, zero on success. - * - * The string must start with a digit to be valid. - * - * Since this function gets called with the 'nextarg' pointer from within the - * getparameter a lot, we must check it for NULL before accessing the str - * data. - */ - -static int str2num(long *val, const char *str) -{ - int retcode = 0; - if(str && ISDIGIT(*str)) - *val = atoi(str); - else - retcode = 1; /* badness */ - return retcode; -} - -/* - * Parse the string and modify the long in the given address. Return - * non-zero on failure, zero on success. - * - * The string is a list of protocols - * - * Since this function gets called with the 'nextarg' pointer from within the - * getparameter a lot, we must check it for NULL before accessing the str - * data. - */ - -static long proto2num(struct Configurable *config, long *val, const char *str) -{ - char *buffer; - const char *sep = ","; - char *token; - - static struct sprotos { - const char *name; - long bit; - } const protos[] = { - { "all", CURLPROTO_ALL }, - { "http", CURLPROTO_HTTP }, - { "https", CURLPROTO_HTTPS }, - { "ftp", CURLPROTO_FTP }, - { "ftps", CURLPROTO_FTPS }, - { "scp", CURLPROTO_SCP }, - { "sftp", CURLPROTO_SFTP }, - { "telnet", CURLPROTO_TELNET }, - { "ldap", CURLPROTO_LDAP }, - { "ldaps", CURLPROTO_LDAPS }, - { "dict", CURLPROTO_DICT }, - { "file", CURLPROTO_FILE }, - { "tftp", CURLPROTO_TFTP }, - { "imap", CURLPROTO_IMAP }, - { "imaps", CURLPROTO_IMAPS }, - { "pop3", CURLPROTO_POP3 }, - { "pop3s", CURLPROTO_POP3S }, - { "smtp", CURLPROTO_SMTP }, - { "smtps", CURLPROTO_SMTPS }, - { "rtsp", CURLPROTO_RTSP }, - { "gopher", CURLPROTO_GOPHER }, - { NULL, 0 } - }; - - if(!str) - return 1; - - buffer = strdup(str); /* because strtok corrupts it */ - - for(token = strtok(buffer, sep); - token; - token = strtok(NULL, sep)) { - enum e_action { allow, deny, set } action = allow; - - struct sprotos const *pp; - - /* Process token modifiers */ - while(!ISALNUM(*token)) { /* may be NULL if token is all modifiers */ - switch (*token++) { - case '=': - action = set; - break; - case '-': - action = deny; - break; - case '+': - action = allow; - break; - default: /* Includes case of terminating NULL */ - free(buffer); - return 1; - } - } - - for(pp=protos; pp->name; pp++) { - if(curlx_raw_equal(token, pp->name)) { - switch (action) { - case deny: - *val &= ~(pp->bit); - break; - case allow: - *val |= pp->bit; - break; - case set: - *val = pp->bit; - break; - } - break; - } - } - - if(!(pp->name)) { /* unknown protocol */ - /* If they have specified only this protocol, we say treat it as - if no protocols are allowed */ - if(action == set) - *val = 0; - warnf(config, "unrecognized protocol '%s'\n", token); - } - } - free(buffer); - return 0; -} - -/** - * Parses the given string looking for an offset (which may be - * a larger-than-integer value). - * - * @param val the offset to populate - * @param str the buffer containing the offset - * @return zero if successful, non-zero if failure. - */ -static int str2offset(curl_off_t *val, const char *str) -{ -#if(CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG) - *val = curlx_strtoofft(str, NULL, 0); - if((*val == CURL_OFF_T_MAX || *val == CURL_OFF_T_MIN) && (ERRNO == ERANGE)) - return 1; -#else - *val = strtol(str, NULL, 0); - if((*val == LONG_MIN || *val == LONG_MAX) && ERRNO == ERANGE) - return 1; -#endif - return 0; -} - -static void checkpasswd(const char *kind, /* for what purpose */ - char **userpwd) /* pointer to allocated string */ -{ - char *ptr; - if(!*userpwd) - return; - - ptr = strchr(*userpwd, ':'); - if(!ptr) { - /* no password present, prompt for one */ - char passwd[256]=""; - char prompt[256]; - size_t passwdlen; - size_t userlen = strlen(*userpwd); - char *passptr; - - /* build a nice-looking prompt */ - curlx_msnprintf(prompt, sizeof(prompt), - "Enter %s password for user '%s':", - kind, *userpwd); - - /* get password */ - getpass_r(prompt, passwd, sizeof(passwd)); - passwdlen = strlen(passwd); - - /* extend the allocated memory area to fit the password too */ - passptr = realloc(*userpwd, - passwdlen + 1 + /* an extra for the colon */ - userlen + 1); /* an extra for the zero */ - - if(passptr) { - /* append the password separated with a colon */ - passptr[userlen]=':'; - memcpy(&passptr[userlen+1], passwd, passwdlen+1); - *userpwd = passptr; - } - } -} - -static ParameterError add2list(struct curl_slist **list, - const char *ptr) -{ - struct curl_slist *newlist = curl_slist_append(*list, ptr); - if(newlist) - *list = newlist; - else - return PARAM_NO_MEM; - - return PARAM_OK; -} - -static int ftpfilemethod(struct Configurable *config, const char *str) -{ - if(curlx_raw_equal("singlecwd", str)) - return CURLFTPMETHOD_SINGLECWD; - if(curlx_raw_equal("nocwd", str)) - return CURLFTPMETHOD_NOCWD; - if(curlx_raw_equal("multicwd", str)) - return CURLFTPMETHOD_MULTICWD; - warnf(config, "unrecognized ftp file method '%s', using default\n", str); - return CURLFTPMETHOD_MULTICWD; -} - -static int ftpcccmethod(struct Configurable *config, const char *str) -{ - if(curlx_raw_equal("passive", str)) - return CURLFTPSSL_CCC_PASSIVE; - if(curlx_raw_equal("active", str)) - return CURLFTPSSL_CCC_ACTIVE; - warnf(config, "unrecognized ftp CCC method '%s', using default\n", str); - return CURLFTPSSL_CCC_PASSIVE; -} - - -static int sockoptcallback(void *clientp, curl_socket_t curlfd, - curlsocktype purpose) -{ - struct Configurable *config = (struct Configurable *)clientp; - int onoff = 1; /* this callback is only used if we ask for keepalives on the - connection */ -#if defined(TCP_KEEPIDLE) || defined(TCP_KEEPINTVL) - int keepidle = (int)config->alivetime; -#endif - - switch(purpose) { - case CURLSOCKTYPE_IPCXN: - if(setsockopt(curlfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&onoff, - sizeof(onoff)) < 0) { - /* don't abort operation, just issue a warning */ - SET_SOCKERRNO(0); - warnf(clientp, "Could not set SO_KEEPALIVE!\n"); - return 0; - } - else { - if(config->alivetime) { -#ifdef TCP_KEEPIDLE - if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepidle, - sizeof(keepidle)) < 0) { - /* don't abort operation, just issue a warning */ - SET_SOCKERRNO(0); - warnf(clientp, "Could not set TCP_KEEPIDLE!\n"); - return 0; - } -#endif -#ifdef TCP_KEEPINTVL - if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepidle, - sizeof(keepidle)) < 0) { - /* don't abort operation, just issue a warning */ - SET_SOCKERRNO(0); - warnf(clientp, "Could not set TCP_KEEPINTVL!\n"); - return 0; - } -#endif - } - } - break; - default: - break; - } - - return 0; -} - - -static ParameterError getparameter(char *flag, /* f or -long-flag */ - char *nextarg, /* NULL if unset */ - bool *usedarg, /* set to TRUE if the arg - has been used */ - struct Configurable *config) -{ - char letter; - char subletter=0; /* subletters can only occur on long options */ - int rc; /* generic return code variable */ - const char *parse=NULL; - unsigned int j; - time_t now; - int hit=-1; - bool longopt=FALSE; - bool singleopt=FALSE; /* when true means '-o foo' used '-ofoo' */ - ParameterError err; - bool toggle=TRUE; /* how to switch boolean options, on or off. Controlled - by using --OPTION or --no-OPTION */ - - /* single-letter, - long-name, - boolean whether it takes an additional argument - */ - static const struct LongShort aliases[]= { - /* all these ones, starting with "*" or "$" as a short-option have *no* - short option to mention. */ - {"*", "url", TRUE}, - {"*a", "random-file", TRUE}, - {"*b", "egd-file", TRUE}, - {"*c", "connect-timeout", TRUE}, - {"*d", "ciphers", TRUE}, - {"*e", "disable-epsv", FALSE}, - {"*E", "epsv", FALSE}, /* made like this to make --no-epsv and --epsv to - work although --disable-epsv is the documented - option */ -#ifdef USE_ENVIRONMENT - {"*f", "environment", FALSE}, -#endif - {"*g", "trace", TRUE}, - {"*h", "trace-ascii", TRUE}, - {"*i", "limit-rate", TRUE}, - {"*j", "compressed", FALSE}, /* might take an arg someday */ - {"*k", "digest", FALSE}, - {"*l", "negotiate", FALSE}, - {"*m", "ntlm", FALSE}, - {"*n", "basic", FALSE}, - {"*o", "anyauth", FALSE}, -#ifdef USE_WATT32 - {"*p", "wdebug", FALSE}, -#endif - {"*q", "ftp-create-dirs", FALSE}, - {"*r", "create-dirs", FALSE}, - {"*s", "max-redirs", TRUE}, - {"*t", "proxy-ntlm", FALSE}, - {"*u", "crlf", FALSE}, - {"*v", "stderr", TRUE}, - {"*w", "interface", TRUE}, - {"*x", "krb" , TRUE}, - {"*x", "krb4" , TRUE}, /* this is the previous name */ - {"*y", "max-filesize", TRUE}, - {"*z", "disable-eprt", FALSE}, - {"*Z", "eprt", FALSE}, /* made like this to make --no-eprt and --eprt to - work although --disable-eprt is the documented - option */ - {"$a", "ftp-ssl", FALSE}, /* deprecated name since 7.20.0 */ - {"$a", "ssl", FALSE}, /* new option name in 7.20.0, previously this - was ftp-ssl */ - {"$b", "ftp-pasv", FALSE}, - {"$c", "socks5", TRUE}, - {"$c", "socks", TRUE}, /* this is how the option once was documented - but we prefer the --socks5 version for - explicit version */ - {"$d", "tcp-nodelay",FALSE}, - {"$e", "proxy-digest", FALSE}, - {"$f", "proxy-basic", FALSE}, - {"$g", "retry", TRUE}, - {"$h", "retry-delay", TRUE}, - {"$i", "retry-max-time", TRUE}, - {"$k", "proxy-negotiate", FALSE}, - {"$m", "ftp-account", TRUE}, - {"$n", "proxy-anyauth", FALSE}, - {"$o", "trace-time", FALSE}, - {"$p", "ignore-content-length", FALSE}, - {"$q", "ftp-skip-pasv-ip", FALSE}, - {"$r", "ftp-method", TRUE}, - {"$s", "local-port", TRUE}, - {"$t", "socks4", TRUE}, - {"$T", "socks4a", TRUE}, - {"$u", "ftp-alternative-to-user", TRUE}, - {"$v", "ftp-ssl-reqd", FALSE}, /* deprecated name since 7.20.0 */ - {"$v", "ssl-reqd", FALSE}, /* new option name in 7.20.0, previously this - was ftp-ssl-reqd */ - {"$w", "sessionid", FALSE}, /* listed as --no-sessionid in the help */ - {"$x", "ftp-ssl-control", FALSE}, - {"$y", "ftp-ssl-ccc", FALSE}, - {"$j", "ftp-ssl-ccc-mode", TRUE}, - {"$z", "libcurl", TRUE}, - {"$#", "raw", FALSE}, - {"$0", "post301", FALSE}, - {"$1", "keepalive", FALSE}, /* listed as --no-keepalive in the help */ - {"$2", "socks5-hostname", TRUE}, - {"$3", "keepalive-time", TRUE}, - {"$4", "post302", FALSE}, - {"$5", "noproxy", TRUE}, - -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - {"$6", "socks5-gssapi-service", TRUE}, - {"$7", "socks5-gssapi-nec", FALSE}, -#endif - {"$8", "proxy1.0", TRUE}, - {"$9", "tftp-blksize", TRUE}, - {"$A", "mail-from", TRUE}, - {"$B", "mail-rcpt", TRUE}, - {"$C", "ftp-pret", FALSE}, - {"$D", "proto", TRUE}, - {"$E", "proto-redir", TRUE}, - {"0", "http1.0", FALSE}, - {"1", "tlsv1", FALSE}, - {"2", "sslv2", FALSE}, - {"3", "sslv3", FALSE}, - {"4", "ipv4", FALSE}, - {"6", "ipv6", FALSE}, - {"a", "append", FALSE}, - {"A", "user-agent", TRUE}, - {"b", "cookie", TRUE}, - {"B", "use-ascii", FALSE}, - {"c", "cookie-jar", TRUE}, - {"C", "continue-at", TRUE}, - {"d", "data", TRUE}, - {"da", "data-ascii", TRUE}, - {"db", "data-binary", TRUE}, - {"de", "data-urlencode", TRUE}, - {"D", "dump-header", TRUE}, - {"e", "referer", TRUE}, - {"E", "cert", TRUE}, - {"Ea", "cacert", TRUE}, - {"Eb","cert-type", TRUE}, - {"Ec","key", TRUE}, - {"Ed","key-type", TRUE}, - {"Ee","pass", TRUE}, - {"Ef","engine", TRUE}, - {"Eg","capath ", TRUE}, - {"Eh","pubkey", TRUE}, - {"Ei", "hostpubmd5", TRUE}, - {"Ej","crlfile", TRUE}, - {"f", "fail", FALSE}, - {"F", "form", TRUE}, - {"Fs","form-string", TRUE}, - {"g", "globoff", FALSE}, - {"G", "get", FALSE}, - {"h", "help", FALSE}, - {"H", "header", TRUE}, - {"i", "include", FALSE}, - {"I", "head", FALSE}, - {"j", "junk-session-cookies", FALSE}, - {"J", "remote-header-name", FALSE}, - {"k", "insecure", FALSE}, - {"K", "config", TRUE}, - {"l", "list-only", FALSE}, - {"L", "location", FALSE}, - {"Lt", "location-trusted", FALSE}, - {"m", "max-time", TRUE}, - {"M", "manual", FALSE}, - {"n", "netrc", FALSE}, - {"no", "netrc-optional", FALSE}, - {"N", "buffer", FALSE}, /* listed as --no-buffer in the help */ - {"o", "output", TRUE}, - {"O", "remote-name", FALSE}, - {"Oa", "remote-name-all", FALSE}, - {"p", "proxytunnel", FALSE}, - {"P", "ftpport", TRUE}, /* older version */ - {"P", "ftp-port", TRUE}, - {"q", "disable", FALSE}, - {"Q", "quote", TRUE}, - {"r", "range", TRUE}, - {"R", "remote-time", FALSE}, - {"s", "silent", FALSE}, - {"S", "show-error", FALSE}, - {"t", "telnet-options", TRUE}, /* this is documented as telnet-option */ - {"T", "upload-file", TRUE}, - {"u", "user", TRUE}, - {"U", "proxy-user", TRUE}, - {"v", "verbose", FALSE}, - {"V", "version", FALSE}, - {"w", "write-out", TRUE}, - {"x", "proxy", TRUE}, - {"X", "request", TRUE}, - {"X", "http-request", TRUE}, /* OBSOLETE VERSION */ - {"Y", "speed-limit", TRUE}, - {"y", "speed-time", TRUE}, - {"z", "time-cond", TRUE}, - {"#", "progress-bar",FALSE}, - }; - - if(('-' != flag[0]) || - (('-' == flag[0]) && ('-' == flag[1]))) { - /* this should be a long name */ - char *word=('-' == flag[0])?flag+2:flag; - size_t fnam=strlen(word); - int numhits=0; - - if(!strncmp(word, "no-", 3)) { - /* disable this option but ignore the "no-" part when looking for it */ - word += 3; - toggle = FALSE; - } - - for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) { - if(curlx_strnequal(aliases[j].lname, word, fnam)) { - longopt = TRUE; - numhits++; - if(curlx_raw_equal(aliases[j].lname, word)) { - parse = aliases[j].letter; - hit = j; - numhits = 1; /* a single unique hit */ - break; - } - parse = aliases[j].letter; - hit = j; - } - } - if(numhits>1) { - /* this is at least the second match! */ - return PARAM_OPTION_AMBIGUOUS; - } - if(hit < 0) { - return PARAM_OPTION_UNKNOWN; - } - } - else { - flag++; /* prefixed with one dash, pass it */ - hit=-1; - parse = flag; - } - - do { - /* we can loop here if we have multiple single-letters */ - - if(!longopt) { - if(NULL != parse) { - letter = (char)*parse; - } - else { - letter = '\0'; - } - subletter='\0'; - } - else { - letter = parse[0]; - subletter = parse[1]; - } - *usedarg = FALSE; /* default is that we don't use the arg */ - - if(hit < 0) { - for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) { - if(letter == aliases[j].letter[0]) { - hit = j; - break; - } - } - if(hit < 0) { - return PARAM_OPTION_UNKNOWN; - } - } - - if(aliases[hit].extraparam) { - /* this option requires an extra parameter */ - if(!longopt && parse[1]) { - nextarg=(char *)&parse[1]; /* this is the actual extra parameter */ - singleopt=TRUE; /* don't loop anymore after this */ - } - else if(!nextarg) - return PARAM_REQUIRES_PARAMETER; - else - *usedarg = TRUE; /* mark it as used */ - } - - switch(letter) { - case '*': /* options without a short option */ - switch(subletter) { - case 'a': /* random-file */ - GetStr(&config->random_file, nextarg); - break; - case 'b': /* egd-file */ - GetStr(&config->egd_file, nextarg); - break; - case 'c': /* connect-timeout */ - if(str2num(&config->connecttimeout, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case 'd': /* ciphers */ - GetStr(&config->cipher_list, nextarg); - break; - case 'e': /* --disable-epsv */ - config->disable_epsv = toggle; - break; - case 'E': /* --epsv */ - config->disable_epsv = (bool)(!toggle); - break; -#ifdef USE_ENVIRONMENT - case 'f': - config->writeenv = toggle; - break; -#endif - case 'g': /* --trace */ - GetStr(&config->trace_dump, nextarg); - if(config->tracetype && (config->tracetype != TRACE_BIN)) - warnf(config, "--trace overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_BIN; - break; - case 'h': /* --trace-ascii */ - GetStr(&config->trace_dump, nextarg); - if(config->tracetype && (config->tracetype != TRACE_ASCII)) - warnf(config, - "--trace-ascii overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_ASCII; - break; - case 'i': /* --limit-rate */ - { - /* We support G, M, K too */ - char *unit; - curl_off_t value = curlx_strtoofft(nextarg, &unit, 0); - - if(!*unit) - unit=(char *)"b"; - else if(strlen(unit) > 1) - unit=(char *)"w"; /* unsupported */ - - switch(*unit) { - case 'G': - case 'g': - value *= 1024*1024*1024; - break; - case 'M': - case 'm': - value *= 1024*1024; - break; - case 'K': - case 'k': - value *= 1024; - break; - case 'b': - case 'B': - /* for plain bytes, leave as-is */ - break; - default: - warnf(config, "unsupported rate unit. Use G, M, K or B!\n"); - return PARAM_BAD_USE; - } - config->recvpersecond = value; - config->sendpersecond = value; - } - break; - - case 'j': /* --compressed */ - config->encoding = toggle; - break; - - case 'k': /* --digest */ - if(toggle) - config->authtype |= CURLAUTH_DIGEST; - else - config->authtype &= ~CURLAUTH_DIGEST; - break; - - case 'l': /* --negotiate */ - if(toggle) { - if(curlinfo->features & CURL_VERSION_GSSNEGOTIATE) - config->authtype |= CURLAUTH_GSSNEGOTIATE; - else - return PARAM_LIBCURL_DOESNT_SUPPORT; - } - else - config->authtype &= ~CURLAUTH_GSSNEGOTIATE; - break; - - case 'm': /* --ntlm */ - if(toggle) { - if(curlinfo->features & CURL_VERSION_NTLM) - config->authtype |= CURLAUTH_NTLM; - else - return PARAM_LIBCURL_DOESNT_SUPPORT; - } - else - config->authtype &= ~CURLAUTH_NTLM; - break; - - case 'n': /* --basic for completeness */ - if(toggle) - config->authtype |= CURLAUTH_BASIC; - else - config->authtype &= ~CURLAUTH_BASIC; - break; - - case 'o': /* --anyauth, let libcurl pick it */ - if(toggle) - config->authtype = CURLAUTH_ANY; - /* --no-anyauth simply doesn't touch it */ - break; - -#ifdef USE_WATT32 - case 'p': /* --wdebug */ - dbug_init(); - break; -#endif - case 'q': /* --ftp-create-dirs */ - config->ftp_create_dirs = toggle; - break; - - case 'r': /* --create-dirs */ - config->create_dirs = TRUE; - break; - - case 's': /* --max-redirs */ - /* specified max no of redirects (http(s)) */ - if(str2num(&config->maxredirs, nextarg)) - return PARAM_BAD_NUMERIC; - break; - - case 't': /* --proxy-ntlm */ - if(curlinfo->features & CURL_VERSION_NTLM) - config->proxyntlm = toggle; - else - return PARAM_LIBCURL_DOESNT_SUPPORT; - break; - - case 'u': /* --crlf */ - /* LF -> CRLF conversion? */ - config->crlf = TRUE; - break; - - case 'v': /* --stderr */ - if(strcmp(nextarg, "-")) { - FILE *newfile = fopen(nextarg, "wt"); - if(!newfile) - warnf(config, "Failed to open %s!\n", nextarg); - else { - if(config->errors_fopened) - fclose(config->errors); - config->errors = newfile; - config->errors_fopened = TRUE; - } - } - else - config->errors = stdout; - break; - case 'w': /* --interface */ - /* interface */ - GetStr(&config->iface, nextarg); - break; - case 'x': /* --krb */ - /* kerberos level string */ - if(curlinfo->features & (CURL_VERSION_KERBEROS4 | - CURL_VERSION_GSSNEGOTIATE)) - GetStr(&config->krblevel, nextarg); - else - return PARAM_LIBCURL_DOESNT_SUPPORT; - break; - case 'y': /* --max-filesize */ - if(str2offset(&config->max_filesize, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case 'z': /* --disable-eprt */ - config->disable_eprt = toggle; - break; - case 'Z': /* --eprt */ - config->disable_eprt = (bool)(!toggle); - break; - - default: /* the URL! */ - { - struct getout *url; - if(config->url_get || (config->url_get=config->url_list)) { - /* there's a node here, if it already is filled-in continue to find - an "empty" node */ - while(config->url_get && (config->url_get->flags&GETOUT_URL)) - config->url_get = config->url_get->next; - } - - /* now there might or might not be an available node to fill in! */ - - if(config->url_get) - /* existing node */ - url = config->url_get; - else - /* there was no free node, create one! */ - url=new_getout(config); - - if(url) { - /* fill in the URL */ - GetStr(&url->url, nextarg); - url->flags |= GETOUT_URL; - } - } - } - break; - case '$': /* more options without a short option */ - switch(subletter) { - case 'a': /* --ftp-ssl */ - config->ftp_ssl = toggle; - break; - case 'b': /* --ftp-pasv */ - if(config->ftpport) - free(config->ftpport); - config->ftpport = NULL; - break; - case 'c': /* --socks5 specifies a socks5 proxy to use, and resolves - the name locally and passes on the resolved address */ - GetStr(&config->socksproxy, nextarg); - config->socksver = CURLPROXY_SOCKS5; - break; - case 't': /* --socks4 specifies a socks4 proxy to use */ - GetStr(&config->socksproxy, nextarg); - config->socksver = CURLPROXY_SOCKS4; - break; - case 'T': /* --socks4a specifies a socks4a proxy to use */ - GetStr(&config->socksproxy, nextarg); - config->socksver = CURLPROXY_SOCKS4A; - break; - case '2': /* --socks5-hostname specifies a socks5 proxy and enables name - resolving with the proxy */ - GetStr(&config->socksproxy, nextarg); - config->socksver = CURLPROXY_SOCKS5_HOSTNAME; - break; - case 'd': /* --tcp-nodelay option */ - config->tcp_nodelay = toggle; - break; - case 'e': /* --proxy-digest */ - config->proxydigest = toggle; - break; - case 'f': /* --proxy-basic */ - config->proxybasic = toggle; - break; - case 'g': /* --retry */ - if(str2num(&config->req_retry, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case 'h': /* --retry-delay */ - if(str2num(&config->retry_delay, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case 'i': /* --retry-max-time */ - if(str2num(&config->retry_maxtime, nextarg)) - return PARAM_BAD_NUMERIC; - break; - - case 'k': /* --proxy-negotiate */ - if(curlinfo->features & CURL_VERSION_GSSNEGOTIATE) - config->proxynegotiate = toggle; - else - return PARAM_LIBCURL_DOESNT_SUPPORT; - break; - case 'm': /* --ftp-account */ - GetStr(&config->ftp_account, nextarg); - break; - case 'n': /* --proxy-anyauth */ - config->proxyanyauth = toggle; - break; - case 'o': /* --trace-time */ - config->tracetime = toggle; - break; - case 'p': /* --ignore-content-length */ - config->ignorecl = toggle; - break; - case 'q': /* --ftp-skip-pasv-ip */ - config->ftp_skip_ip = toggle; - break; - case 'r': /* --ftp-method (undocumented at this point) */ - config->ftp_filemethod = ftpfilemethod(config, nextarg); - break; - case 's': /* --local-port */ - rc = sscanf(nextarg, "%d - %d", - &config->localport, - &config->localportrange); - if(!rc) - return PARAM_BAD_USE; - else if(rc == 1) - config->localportrange = 1; /* default number of ports to try */ - else { - config->localportrange -= config->localport; - if(config->localportrange < 1) { - warnf(config, "bad range input\n"); - return PARAM_BAD_USE; - } - } - break; - case 'u': /* --ftp-alternative-to-user */ - GetStr(&config->ftp_alternative_to_user, nextarg); - break; - case 'v': /* --ftp-ssl-reqd */ - config->ftp_ssl_reqd = toggle; - break; - case 'w': /* --no-sessionid */ - config->disable_sessionid = (bool)(!toggle); - break; - case 'x': /* --ftp-ssl-control */ - config->ftp_ssl_control = toggle; - break; - case 'y': /* --ftp-ssl-ccc */ - config->ftp_ssl_ccc = toggle; - if(!config->ftp_ssl_ccc_mode) - config->ftp_ssl_ccc_mode = CURLFTPSSL_CCC_PASSIVE; - break; - case 'j': /* --ftp-ssl-ccc-mode */ - config->ftp_ssl_ccc = TRUE; - config->ftp_ssl_ccc_mode = ftpcccmethod(config, nextarg); - break; - case 'z': /* --libcurl */ - GetStr(&config->libcurl, nextarg); - break; - case '#': /* --raw */ - config->raw = toggle; - break; - case '0': /* --post301 */ - config->post301 = toggle; - break; - case '1': /* --no-keepalive */ - config->nokeepalive = (bool)(!toggle); - break; - case '3': /* --keepalive-time */ - if(str2num(&config->alivetime, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case '4': /* --post302 */ - config->post302 = toggle; - break; - case '5': /* --noproxy */ - /* This specifies the noproxy list */ - GetStr(&config->noproxy, nextarg); - break; -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - case '6': /* --socks5-gssapi-service */ - GetStr(&config->socks5_gssapi_service, nextarg); - break; - case '7': /* --socks5-gssapi-nec*/ - config->socks5_gssapi_nec = TRUE; - break; -#endif - case '8': /* --proxy1.0 */ - /* http 1.0 proxy */ - GetStr(&config->proxy, nextarg); - config->proxyver = CURLPROXY_HTTP_1_0; - break; - case '9': /* --tftp-blksize */ - str2num(&config->tftp_blksize, nextarg); - break; - case 'A': /* --mail-from */ - GetStr(&config->mail_from, nextarg); - break; - case 'B': /* --mail-rcpt */ - /* append receiver to a list */ - err = add2list(&config->mail_rcpt, nextarg); - if(err) - return err; - break; - case 'C': /* --ftp-pret */ - config->ftp_pret = toggle; - break; - case 'D': /* --proto */ - config->proto_present = TRUE; - if(proto2num(config, &config->proto, nextarg)) - return PARAM_BAD_USE; - break; - case 'E': /* --proto-redir */ - config->proto_redir_present = TRUE; - if(proto2num(config, &config->proto_redir, nextarg)) - return PARAM_BAD_USE; - break; - } - break; - case '#': /* --progress-bar */ - if(toggle) - config->progressmode = CURL_PROGRESS_BAR; - else - config->progressmode = CURL_PROGRESS_STATS; - break; - case '0': - /* HTTP version 1.0 */ - config->httpversion = CURL_HTTP_VERSION_1_0; - break; - case '1': - /* TLS version 1 */ - config->ssl_version = CURL_SSLVERSION_TLSv1; - break; - case '2': - /* SSL version 2 */ - config->ssl_version = CURL_SSLVERSION_SSLv2; - break; - case '3': - /* SSL version 3 */ - config->ssl_version = CURL_SSLVERSION_SSLv3; - break; - case '4': - /* IPv4 */ - config->ip_version = 4; - break; - case '6': - /* IPv6 */ - config->ip_version = 6; - break; - case 'a': - /* This makes the FTP sessions use APPE instead of STOR */ - config->ftp_append = toggle; - break; - case 'A': - /* This specifies the User-Agent name */ - GetStr(&config->useragent, nextarg); - break; - case 'b': /* cookie string coming up: */ - if(nextarg[0] == '@') { - nextarg++; - } - else if(strchr(nextarg, '=')) { - /* A cookie string must have a =-letter */ - GetStr(&config->cookie, nextarg); - break; - } - /* We have a cookie file to read from! */ - GetStr(&config->cookiefile, nextarg); - break; - case 'B': - /* use ASCII/text when transfering */ - config->use_ascii = toggle; - break; - case 'c': - /* get the file name to dump all cookies in */ - GetStr(&config->cookiejar, nextarg); - break; - case 'C': - /* This makes us continue an ftp transfer at given position */ - if(!curlx_strequal(nextarg, "-")) { - if(str2offset(&config->resume_from, nextarg)) - return PARAM_BAD_NUMERIC; - config->resume_from_current = FALSE; - } - else { - config->resume_from_current = TRUE; - config->resume_from = 0; - } - config->use_resume=TRUE; - break; - case 'd': - /* postfield data */ - { - char *postdata=NULL; - FILE *file; - - if(subletter == 'e') { /* --data-urlencode*/ - /* [name]=[content], we encode the content part only - * [name]@[file name] - * - * Case 2: we first load the file using that name and then encode - * the content. - */ - const char *p = strchr(nextarg, '='); - size_t size = 0; - size_t nlen; - char is_file; - if(!p) - /* there was no '=' letter, check for a '@' instead */ - p = strchr(nextarg, '@'); - if(p) { - nlen = p - nextarg; /* length of the name part */ - is_file = *p++; /* pass the separator */ - } - else { - /* neither @ nor =, so no name and it isn't a file */ - nlen = is_file = 0; - p = nextarg; - } - if('@' == is_file) { - /* a '@' letter, it means that a file name or - (stdin) follows */ - - if(curlx_strequal("-", p)) { - file = stdin; - SET_BINMODE(stdin); - } - else { - file = fopen(p, "rb"); - if(!file) - warnf(config, - "Couldn't read data from file \"%s\", this makes " - "an empty POST.\n", nextarg); - } - - err = file2memory(&postdata, &size, file); - - if(file && (file != stdin)) - fclose(file); - if(err) - return err; - } - else { - GetStr(&postdata, p); - size = strlen(postdata); - } - - if(!postdata) { - /* no data from the file, point to a zero byte string to make this - get sent as a POST anyway */ - postdata=strdup(""); - } - else { - char *enc = curl_easy_escape(config->easy, postdata, (int)size); - free(postdata); /* no matter if it worked or not */ - if(enc) { - /* now make a string with the name from above and append the - encoded string */ - size_t outlen = nlen + strlen(enc) + 2; - char *n = malloc(outlen); - if(!n) { - curl_free(enc); - return PARAM_NO_MEM; - } - if(nlen > 0) /* only append '=' if we have a name */ - snprintf(n, outlen, "%.*s=%s", nlen, nextarg, enc); - else - strcpy(n, enc); - curl_free(enc); - postdata = n; - } - else - return PARAM_NO_MEM; - } - } - else if('@' == *nextarg) { - size_t size = 0; - /* the data begins with a '@' letter, it means that a file name - or - (stdin) follows */ - nextarg++; /* pass the @ */ - - if(curlx_strequal("-", nextarg)) { - file = stdin; - if(subletter == 'b') /* forced data-binary */ - SET_BINMODE(stdin); - } - else { - file = fopen(nextarg, "rb"); - if(!file) - warnf(config, "Couldn't read data from file \"%s\", this makes " - "an empty POST.\n", nextarg); - } - - if(subletter == 'b') { - /* forced binary */ - err = file2memory(&postdata, &size, file); - config->postfieldsize = (curl_off_t)size; - } - else - err = file2string(&postdata, file); - - if(file && (file != stdin)) - fclose(file); - if(err) - return err; - - if(!postdata) { - /* no data from the file, point to a zero byte string to make this - get sent as a POST anyway */ - postdata=strdup(""); - } - } - else { - GetStr(&postdata, nextarg); - } - -#ifdef CURL_DOES_CONVERSIONS - if(subletter != 'b') { /* NOT forced binary, convert to ASCII */ - convert_to_network(postdata, strlen(postdata)); - } -#endif - - if(config->postfields) { - /* we already have a string, we append this one - with a separating &-letter */ - char *oldpost=config->postfields; - size_t newlen = strlen(oldpost) + strlen(postdata) + 2; - config->postfields=malloc(newlen); - if(!config->postfields) { - free(postdata); - return PARAM_NO_MEM; - } - /* use ASCII value 0x26 for '&' to accommodate non-ASCII platforms */ - snprintf(config->postfields, newlen, "%s\x26%s", oldpost, postdata); - free(oldpost); - free(postdata); - } - else - config->postfields=postdata; - } - /* - We can't set the request type here, as this data might be used in - a simple GET if -G is used. Already or soon. - - if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq)) - return PARAM_BAD_USE; - */ - break; - case 'D': - /* dump-header to given file name */ - GetStr(&config->headerfile, nextarg); - break; - case 'e': - { - char *ptr = strstr(nextarg, ";auto"); - if(ptr) { - /* Automatic referer requested, this may be combined with a - set initial one */ - config->autoreferer = TRUE; - *ptr = 0; /* zero terminate here */ - } - else - config->autoreferer = FALSE; - GetStr(&config->referer, nextarg); - } - break; - case 'E': - switch(subletter) { - case 'a': /* CA info PEM file */ - /* CA info PEM file */ - GetStr(&config->cacert, nextarg); - break; - case 'b': /* cert file type */ - GetStr(&config->cert_type, nextarg); - break; - case 'c': /* private key file */ - GetStr(&config->key, nextarg); - break; - case 'd': /* private key file type */ - GetStr(&config->key_type, nextarg); - break; - case 'e': /* private key passphrase */ - GetStr(&config->key_passwd, nextarg); - cleanarg(nextarg); - break; - case 'f': /* crypto engine */ - GetStr(&config->engine, nextarg); - if(config->engine && curlx_raw_equal(config->engine,"list")) - config->list_engines = TRUE; - break; - case 'g': /* CA info PEM file */ - /* CA cert directory */ - GetStr(&config->capath, nextarg); - break; - case 'h': /* --pubkey public key file */ - GetStr(&config->pubkey, nextarg); - break; - case 'i': /* --hostpubmd5 md5 of the host public key */ - GetStr(&config->hostpubmd5, nextarg); - if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32) - return PARAM_BAD_USE; - break; - case 'j': /* CRL info PEM file */ - /* CRL file */ - GetStr(&config->crlfile, nextarg); - break; - default: /* certificate file */ - { - char *ptr = strchr(nextarg, ':'); - /* Since we live in a world of weirdness and confusion, the win32 - dudes can use : when using drive letters and thus - c:\file:password needs to work. In order not to break - compatibility, we still use : as separator, but we try to detect - when it is used for a file name! On windows. */ -#ifdef WIN32 - if(ptr && - (ptr == &nextarg[1]) && - (nextarg[2] == '\\' || nextarg[2] == '/') && - (ISALPHA(nextarg[0])) ) - /* colon in the second column, followed by a backslash, and the - first character is an alphabetic letter: - - this is a drive letter colon */ - ptr = strchr(&nextarg[3], ':'); /* find the next one instead */ -#endif - if(ptr) { - /* we have a password too */ - *ptr=0; - ptr++; - GetStr(&config->key_passwd, ptr); - } - GetStr(&config->cert, nextarg); - cleanarg(nextarg); - } - } - break; - case 'f': - /* fail hard on errors */ - config->failonerror = toggle; - break; - case 'F': - /* "form data" simulation, this is a little advanced so lets do our best - to sort this out slowly and carefully */ - if(formparse(config, - nextarg, - &config->httppost, - &config->last_post, - (bool) (subletter=='s'))) /* 's' means literal string */ - return PARAM_BAD_USE; - if(SetHTTPrequest(config, HTTPREQ_POST, &config->httpreq)) - return PARAM_BAD_USE; - break; - - case 'g': /* g disables URLglobbing */ - config->globoff = toggle; - break; - - case 'G': /* HTTP GET */ - config->use_httpget = TRUE; - break; - - case 'h': /* h for help */ - if(toggle) { - help(); - return PARAM_HELP_REQUESTED; - } - /* we now actually support --no-help too! */ - break; - case 'H': - /* A custom header to append to a list */ - err = add2list(&config->headers, nextarg); - if(err) - return err; - break; - case 'i': - config->include_headers = toggle; /* include the headers as well in the - general output stream */ - break; - case 'j': - config->cookiesession = toggle; - break; - case 'I': - /* - * no_body will imply include_headers later on - */ - config->no_body = toggle; - if(SetHTTPrequest(config, - (config->no_body)?HTTPREQ_HEAD:HTTPREQ_GET, - &config->httpreq)) - return PARAM_BAD_USE; - break; - case 'J': /* --remote-header-name */ - if(config->include_headers) { - warnf(config, - "--include and --remote-header-name cannot be combined.\n"); - return PARAM_BAD_USE; - } - config->content_disposition = toggle; - break; - case 'k': /* allow insecure SSL connects */ - config->insecure_ok = toggle; - break; - case 'K': /* parse config file */ - if(parseconfig(nextarg, config)) - warnf(config, "error trying read config from the '%s' file\n", - nextarg); - break; - case 'l': - config->dirlistonly = toggle; /* only list the names of the FTP dir */ - break; - case 'L': - config->followlocation = toggle; /* Follow Location: HTTP headers */ - switch (subletter) { - case 't': - /* Continue to send authentication (user+password) when following - * locations, even when hostname changed */ - config->unrestricted_auth = toggle; - break; - } - break; - case 'm': - /* specified max time */ - if(str2num(&config->timeout, nextarg)) - return PARAM_BAD_NUMERIC; - break; - case 'M': /* M for manual, huge help */ - if(toggle) { /* --no-manual shows no manual... */ -#ifdef USE_MANUAL - hugehelp(); - return PARAM_HELP_REQUESTED; -#else - warnf(config, - "built-in manual was disabled at build-time!\n"); - return PARAM_OPTION_UNKNOWN; -#endif - } - break; - case 'n': - switch(subletter) { - case 'o': /* CA info PEM file */ - /* use .netrc or URL */ - config->netrc_opt = toggle; - break; - default: - /* pick info from .netrc, if this is used for http, curl will - automatically enfore user+password with the request */ - config->netrc = toggle; - break; - } - break; - case 'N': - /* disable the output I/O buffering. note that the option is called - --buffer but is mostly used in the negative form: --no-buffer */ - if(longopt) - config->nobuffer = (bool)(!toggle); - else - config->nobuffer = toggle; - break; - case 'O': /* --remote-name */ - if(subletter == 'a') { /* --remote-name-all */ - config->default_node_flags = toggle?GETOUT_USEREMOTE:0; - break; - } - /* fall-through! */ - case 'o': /* --output */ - /* output file */ - { - struct getout *url; - if(config->url_out || (config->url_out=config->url_list)) { - /* there's a node here, if it already is filled-in continue to find - an "empty" node */ - while(config->url_out && (config->url_out->flags&GETOUT_OUTFILE)) - config->url_out = config->url_out->next; - } - - /* now there might or might not be an available node to fill in! */ - - if(config->url_out) - /* existing node */ - url = config->url_out; - else - /* there was no free node, create one! */ - url=new_getout(config); - - if(url) { - /* fill in the outfile */ - if('o' == letter) { - GetStr(&url->outfile, nextarg); - url->flags &= ~GETOUT_USEREMOTE; /* switch off */ - } - else { - url->outfile=NULL; /* leave it */ - if(toggle) - url->flags |= GETOUT_USEREMOTE; /* switch on */ - else - url->flags &= ~GETOUT_USEREMOTE; /* switch off */ - } - url->flags |= GETOUT_OUTFILE; - } - } - break; - case 'P': - /* This makes the FTP sessions use PORT instead of PASV */ - /* use <eth0> or <192.168.10.10> style addresses. Anything except - this will make us try to get the "default" address. - NOTE: this is a changed behaviour since the released 4.1! - */ - GetStr(&config->ftpport, nextarg); - break; - case 'p': - /* proxy tunnel for non-http protocols */ - config->proxytunnel = toggle; - break; - - case 'q': /* if used first, already taken care of, we do it like - this so we don't cause an error! */ - break; - case 'Q': - /* QUOTE command to send to FTP server */ - switch(nextarg[0]) { - case '-': - /* prefixed with a dash makes it a POST TRANSFER one */ - nextarg++; - err = add2list(&config->postquote, nextarg); - break; - case '+': - /* prefixed with a plus makes it a just-before-transfer one */ - nextarg++; - err = add2list(&config->prequote, nextarg); - break; - default: - err = add2list(&config->quote, nextarg); - break; - } - if(err) - return err; - break; - case 'r': - /* Specifying a range WITHOUT A DASH will create an illegal HTTP range - (and won't actually be range by definition). The man page previously - claimed that to be a good way, why this code is added to work-around - it. */ - if(ISDIGIT(*nextarg) && !strchr(nextarg, '-')) { - char buffer[32]; - curl_off_t off; - warnf(config, - "A specified range MUST include at least one dash (-). " - "Appending one for you!\n"); - off = curlx_strtoofft(nextarg, NULL, 10); - snprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-", off); - GetStr(&config->range, buffer); - } - { - /* byte range requested */ - char* tmp_range; - tmp_range=nextarg; - while(*tmp_range != '\0') { - if(!ISDIGIT(*tmp_range)&&*tmp_range!='-'&&*tmp_range!=',') { - warnf(config,"Invalid character is found in given range. " - "A specified range MUST have only digits in " - "\'start\'-\'stop\'. The server's response to this " - "request is uncertain.\n"); - break; - } - tmp_range++; - } - /* byte range requested */ - GetStr(&config->range, nextarg); - } - break; - case 'R': - /* use remote file's time */ - config->remote_time = toggle; - break; - case 's': - /* don't show progress meter, don't show errors : */ - if(toggle) - config->mute = config->noprogress = TRUE; - else - config->mute = config->noprogress = FALSE; - config->showerror = (bool)(!toggle); /* toggle off */ - break; - case 'S': - /* show errors */ - config->showerror = toggle; /* toggle on if used with -s */ - break; - case 't': - /* Telnet options */ - err = add2list(&config->telnet_options, nextarg); - if(err) - return err; - break; - case 'T': - /* we are uploading */ - { - struct getout *url; - if(config->url_out || (config->url_out=config->url_list)) { - /* there's a node here, if it already is filled-in continue to find - an "empty" node */ - while(config->url_out && (config->url_out->flags&GETOUT_UPLOAD)) - config->url_out = config->url_out->next; - } - - /* now there might or might not be an available node to fill in! */ - - if(config->url_out) - /* existing node */ - url = config->url_out; - else - /* there was no free node, create one! */ - url=new_getout(config); - - if(url) { - url->flags |= GETOUT_UPLOAD; /* mark -T used */ - if(!*nextarg) - url->flags |= GETOUT_NOUPLOAD; - else { - /* "-" equals stdin, but keep the string around for now */ - GetStr(&url->infile, nextarg); - } - } - } - break; - case 'u': - /* user:password */ - GetStr(&config->userpwd, nextarg); - cleanarg(nextarg); - checkpasswd("host", &config->userpwd); - break; - case 'U': - /* Proxy user:password */ - GetStr(&config->proxyuserpwd, nextarg); - cleanarg(nextarg); - checkpasswd("proxy", &config->proxyuserpwd); - break; - case 'v': - if(toggle) { - /* the '%' thing here will cause the trace get sent to stderr */ - GetStr(&config->trace_dump, (char *)"%"); - if(config->tracetype && (config->tracetype != TRACE_PLAIN)) - warnf(config, - "-v/--verbose overrides an earlier trace/verbose option\n"); - config->tracetype = TRACE_PLAIN; - } - else - /* verbose is disabled here */ - config->tracetype = TRACE_NONE; - break; - case 'V': - { - const char * const *proto; - - if(!toggle) - /* --no-version yields no output! */ - break; - - printf(CURL_ID "%s\n", curl_version()); - if(curlinfo->protocols) { - printf("Protocols: "); - for(proto=curlinfo->protocols; *proto; ++proto) { - printf("%s ", *proto); - } - puts(""); /* newline */ - } - if(curlinfo->features) { - unsigned int i; - struct feat { - const char *name; - int bitmask; - }; - static const struct feat feats[] = { - {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, - {"Debug", CURL_VERSION_DEBUG}, - {"TrackMemory", CURL_VERSION_CURLDEBUG}, - {"GSS-Negotiate", CURL_VERSION_GSSNEGOTIATE}, - {"IDN", CURL_VERSION_IDN}, - {"IPv6", CURL_VERSION_IPV6}, - {"Largefile", CURL_VERSION_LARGEFILE}, - {"NTLM", CURL_VERSION_NTLM}, - {"SPNEGO", CURL_VERSION_SPNEGO}, - {"SSL", CURL_VERSION_SSL}, - {"SSPI", CURL_VERSION_SSPI}, - {"krb4", CURL_VERSION_KERBEROS4}, - {"libz", CURL_VERSION_LIBZ}, - {"CharConv", CURL_VERSION_CONV} - }; - printf("Features: "); - for(i=0; i<sizeof(feats)/sizeof(feats[0]); i++) { - if(curlinfo->features & feats[i].bitmask) - printf("%s ", feats[i].name); - } - puts(""); /* newline */ - } - } - return PARAM_HELP_REQUESTED; - case 'w': - /* get the output string */ - if('@' == *nextarg) { - /* the data begins with a '@' letter, it means that a file name - or - (stdin) follows */ - FILE *file; - const char *fname; - nextarg++; /* pass the @ */ - if(curlx_strequal("-", nextarg)) { - fname = "<stdin>"; - file = stdin; - } - else { - fname = nextarg; - file = fopen(nextarg, "r"); - } - err = file2string(&config->writeout, file); - if(file && (file != stdin)) - fclose(file); - if(err) - return err; - if(!config->writeout) - warnf(config, "Failed to read %s", fname); - } - else - GetStr(&config->writeout, nextarg); - break; - case 'x': - /* proxy */ - GetStr(&config->proxy, nextarg); - config->proxyver = CURLPROXY_HTTP; - break; - case 'X': - /* set custom request */ - GetStr(&config->customrequest, nextarg); - break; - case 'y': - /* low speed time */ - if(str2num(&config->low_speed_time, nextarg)) - return PARAM_BAD_NUMERIC; - if(!config->low_speed_limit) - config->low_speed_limit = 1; - break; - case 'Y': - /* low speed limit */ - if(str2num(&config->low_speed_limit, nextarg)) - return PARAM_BAD_NUMERIC; - if(!config->low_speed_time) - config->low_speed_time=30; - break; - case 'z': /* time condition coming up */ - switch(*nextarg) { - case '+': - nextarg++; - default: - /* If-Modified-Since: (section 14.28 in RFC2068) */ - config->timecond = CURL_TIMECOND_IFMODSINCE; - break; - case '-': - /* If-Unmodified-Since: (section 14.24 in RFC2068) */ - config->timecond = CURL_TIMECOND_IFUNMODSINCE; - nextarg++; - break; - case '=': - /* Last-Modified: (section 14.29 in RFC2068) */ - config->timecond = CURL_TIMECOND_LASTMOD; - nextarg++; - break; - } - now=time(NULL); - config->condtime=curl_getdate(nextarg, &now); - if(-1 == (int)config->condtime) { - /* now let's see if it is a file name to get the time from instead! */ - struct_stat statbuf; - if(-1 == stat(nextarg, &statbuf)) { - /* failed, remove time condition */ - config->timecond = CURL_TIMECOND_NONE; - warnf(config, - "Illegal date format for -z/--timecond (and not " - "a file name). Disabling time condition. " - "See curl_getdate(3) for valid date syntax.\n"); - } - else { - /* pull the time out from the file */ - config->condtime = statbuf.st_mtime; - } - } - break; - default: /* unknown flag */ - return PARAM_OPTION_UNKNOWN; - } - hit = -1; - - } while(!longopt && !singleopt && *++parse && !*usedarg); - - return PARAM_OK; -} - -/* - * Copies the string from line to the buffer at param, unquoting - * backslash-quoted characters and NUL-terminating the output string. - * Stops at the first non-backslash-quoted double quote character or the - * end of the input string. param must be at least as long as the input - * string. Returns the pointer after the last handled input character. - */ -static const char *unslashquote(const char *line, char *param) -{ - while(*line && (*line != '\"')) { - if(*line == '\\') { - char out; - line++; - - /* default is to output the letter after the backslash */ - switch(out = *line) { - case '\0': - continue; /* this'll break out of the loop */ - case 't': - out='\t'; - break; - case 'n': - out='\n'; - break; - case 'r': - out='\r'; - break; - case 'v': - out='\v'; - break; - } - *param++=out; - line++; - } - else - *param++=*line++; - } - *param=0; /* always zero terminate */ - return line; -} - -/* return 0 on everything-is-fine, and non-zero otherwise */ -static int parseconfig(const char *filename, - struct Configurable *config) -{ - int res; - FILE *file; - char filebuffer[512]; - bool usedarg; - char *home; - int rc = 0; - - if(!filename || !*filename) { - /* NULL or no file name attempts to load .curlrc from the homedir! */ - -#define CURLRC DOT_CHAR "curlrc" - -#ifndef __AMIGA__ - filename = CURLRC; /* sensible default */ - home = homedir(); /* portable homedir finder */ - if(home) { - if(strlen(home)<(sizeof(filebuffer)-strlen(CURLRC))) { - snprintf(filebuffer, sizeof(filebuffer), - "%s%s%s", home, DIR_CHAR, CURLRC); - -#ifdef WIN32 - /* Check if the file exists - if not, try CURLRC in the same - * directory as our executable - */ - file = fopen(filebuffer, "r"); - if(file != NULL) { - fclose(file); - filename = filebuffer; - } - else { - /* Get the filename of our executable. GetModuleFileName is - * already declared via inclusions done in setup header file. - * We assume that we are using the ASCII version here. - */ - int n = GetModuleFileName(0, filebuffer, sizeof(filebuffer)); - if(n > 0 && n < (int)sizeof(filebuffer)) { - /* We got a valid filename - get the directory part */ - char *lastdirchar = strrchr(filebuffer, '\\'); - if(lastdirchar) { - size_t remaining; - *lastdirchar = 0; - /* If we have enough space, build the RC filename */ - remaining = sizeof(filebuffer) - strlen(filebuffer); - if(strlen(CURLRC) < remaining - 1) { - snprintf(lastdirchar, remaining, - "%s%s", DIR_CHAR, CURLRC); - /* Don't bother checking if it exists - we do - * that later - */ - filename = filebuffer; - } - } - } - } -#else /* WIN32 */ - filename = filebuffer; -#endif /* WIN32 */ - } - free(home); /* we've used it, now free it */ - } - -# else /* __AMIGA__ */ - /* On AmigaOS all the config files are into env: - */ - filename = "ENV:" CURLRC; - -#endif - } - - if(strcmp(filename,"-")) - file = fopen(filename, "r"); - else - file = stdin; - - if(file) { - char *line; - char *aline; - char *option; - char *param; - int lineno=0; - bool alloced_param; - -#define ISSEP(x) (((x)=='=') || ((x) == ':')) - - while(NULL != (aline = my_get_line(file))) { - lineno++; - line = aline; - alloced_param=FALSE; - - /* line with # in the first non-blank column is a comment! */ - while(*line && ISSPACE(*line)) - line++; - - switch(*line) { - case '#': - case '/': - case '\r': - case '\n': - case '*': - case '\0': - free(aline); - continue; - } - - /* the option keywords starts here */ - option = line; - while(*line && !ISSPACE(*line) && !ISSEP(*line)) - line++; - /* ... and has ended here */ - - if(*line) - *line++=0; /* zero terminate, we have a local copy of the data */ - -#ifdef DEBUG_CONFIG - fprintf(stderr, "GOT: %s\n", option); -#endif - - /* pass spaces and separator(s) */ - while(*line && (ISSPACE(*line) || ISSEP(*line))) - line++; - - /* the parameter starts here (unless quoted) */ - if(*line == '\"') { - /* quoted parameter, do the quote dance */ - line++; - param=malloc(strlen(line)+1); /* parameter */ - if(!param) { - /* out of memory */ - free(aline); - rc = 1; - break; - } - alloced_param=TRUE; - (void)unslashquote(line, param); - } - else { - param=line; /* parameter starts here */ - while(*line && !ISSPACE(*line)) - line++; - *line=0; /* zero terminate */ - } - - if(param && !*param) { - /* do this so getparameter can check for required parameters. - Otherwise it always thinks there's a parameter. */ - if(alloced_param) - free(param); - param = NULL; - } - -#ifdef DEBUG_CONFIG - fprintf(stderr, "PARAM: \"%s\"\n",(param ? param : "(null)")); -#endif - res = getparameter(option, param, &usedarg, config); - - if(param && *param && !usedarg) - /* we passed in a parameter that wasn't used! */ - res = PARAM_GOT_EXTRA_PARAMETER; - - if(res != PARAM_OK) { - /* the help request isn't really an error */ - if(!strcmp(filename, "-")) { - filename=(char *)"<stdin>"; - } - if(PARAM_HELP_REQUESTED != res) { - const char *reason = param2text(res); - warnf(config, "%s:%d: warning: '%s' %s\n", - filename, lineno, option, reason); - } - } - - if(alloced_param) - { - free(param); - param = NULL; - } - - free(aline); - } - if(file != stdin) - fclose(file); - } - else - rc = 1; /* couldn't open the file */ - return rc; -} - -static void go_sleep(long ms) -{ -#ifdef HAVE_POLL_FINE - /* portable subsecond "sleep" */ - poll((void *)0, 0, (int)ms); -#else - /* systems without poll() need other solutions */ - -#ifdef WIN32 - /* Windows offers a millisecond sleep */ - Sleep(ms); -#elif defined(MSDOS) - delay(ms); -#else - /* Other systems must use select() for this */ - struct timeval timeout; - - timeout.tv_sec = ms/1000; - ms = ms%1000; - timeout.tv_usec = ms * 1000; - - select(0, NULL, NULL, NULL, &timeout); -#endif - -#endif -} - -static size_t my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream) -{ - size_t rc; - struct OutStruct *out=(struct OutStruct *)stream; - struct Configurable *config = out->config; - - /* - * Once that libcurl has called back my_fwrite() the returned value - * is checked against the amount that was intended to be written, if - * it does not match then it fails with CURLE_WRITE_ERROR. So at this - * point returning a value different from sz*nmemb indicates failure. - */ - const size_t err_rc = (sz * nmemb) ? 0 : 1; - - if(!out->stream) { - out->bytes = 0; /* nothing written yet */ - if(!out->filename) { - warnf(config, "Remote filename has no length!\n"); - return err_rc; /* Failure */ - } - - if(config->content_disposition) { - /* don't overwrite existing files */ - FILE* f = fopen(out->filename, "r"); - if(f) { - fclose(f); - warnf(config, "Refusing to overwrite %s: %s\n", out->filename, - strerror(EEXIST)); - return err_rc; /* Failure */ - } - } - - /* open file for writing */ - out->stream=fopen(out->filename, "wb"); - if(!out->stream) { - warnf(config, "Failed to create the file %s: %s\n", out->filename, - strerror(errno)); - return err_rc; /* failure */ - } - } - - rc = fwrite(buffer, sz, nmemb, out->stream); - - if((sz * nmemb) == rc) - /* we added this amount of data to the output */ - out->bytes += (sz * nmemb); - - if(config->readbusy) { - config->readbusy = FALSE; - curl_easy_pause(config->easy, CURLPAUSE_CONT); - } - - if(config->nobuffer) { - /* disable output buffering */ - int res = fflush(out->stream); - if(res) { - /* return a value that isn't the same as sz * nmemb */ - return err_rc; /* failure */ - } - } - - return rc; -} - -struct InStruct { - int fd; - struct Configurable *config; -}; - -#define MAX_SEEK 2147483647 - -/* - * my_seek() is the CURLOPT_SEEKFUNCTION we use - */ -static int my_seek(void *stream, curl_off_t offset, int whence) -{ - struct InStruct *in=(struct InStruct *)stream; - -#if(CURL_SIZEOF_CURL_OFF_T > SIZEOF_OFF_T) && !defined(USE_WIN32_LARGE_FILES) - /* The offset check following here is only interesting if curl_off_t is - larger than off_t and we are not using the WIN32 large file support - macros that provide the support to do 64bit seeks correctly */ - - if(offset > MAX_SEEK) { - /* Some precaution code to work around problems with different data sizes - to allow seeking >32bit even if off_t is 32bit. Should be very rare and - is really valid on weirdo-systems. */ - curl_off_t left = offset; - - if(whence != SEEK_SET) - /* this code path doesn't support other types */ - return 1; - - if(LSEEK_ERROR == lseek(in->fd, 0, SEEK_SET)) - /* couldn't rewind to beginning */ - return 1; - - while(left) { - long step = (left>MAX_SEEK ? MAX_SEEK : (long)left); - if(LSEEK_ERROR == lseek(in->fd, step, SEEK_CUR)) - /* couldn't seek forwards the desired amount */ - return 1; - left -= step; - } - return 0; - } -#endif - if(LSEEK_ERROR == lseek(in->fd, offset, whence)) - /* couldn't rewind, the reason is in errno but errno is just not portable - enough and we don't actually care that much why we failed. We'll let - libcurl know that it may try other means if it wants to. */ - return CURL_SEEKFUNC_CANTSEEK; - - return 0; -} - -static size_t my_fread(void *buffer, size_t sz, size_t nmemb, void *userp) -{ - ssize_t rc; - struct InStruct *in=(struct InStruct *)userp; - - rc = read(in->fd, buffer, sz*nmemb); - if(rc < 0) { - if(errno == EAGAIN) { - errno = 0; - in->config->readbusy = TRUE; - return CURL_READFUNC_PAUSE; - } - /* since size_t is unsigned we can't return negative values fine */ - rc = 0; - } - in->config->readbusy = FALSE; - return (size_t)rc; -} - -struct ProgressData { - int calls; - curl_off_t prev; - int width; - FILE *out; /* where to write everything to */ - curl_off_t initial_size; -}; - -static int myprogress (void *clientp, - double dltotal, - double dlnow, - double ultotal, - double ulnow) -{ - /* The original progress-bar source code was written for curl by Lars Aas, - and this new edition inherits some of his concepts. */ - - char line[256]; - char outline[256]; - char format[40]; - double frac; - double percent; - int barwidth; - int num; - int i; - - struct ProgressData *bar = (struct ProgressData *)clientp; - curl_off_t total = (curl_off_t)dltotal + (curl_off_t)ultotal + - bar->initial_size; /* expected transfer size */ - curl_off_t point = (curl_off_t)dlnow + (curl_off_t)ulnow + - bar->initial_size; /* we've come this far */ - - if(point > total) - /* we have got more than the expected total! */ - total = point; - - bar->calls++; /* simply count invokes */ - - if(total < 1) { - curl_off_t prevblock = bar->prev / 1024; - curl_off_t thisblock = point / 1024; - while( thisblock > prevblock ) { - fprintf( bar->out, "#" ); - prevblock++; - } - } - else { - frac = (double)point / (double)total; - percent = frac * 100.0f; - barwidth = bar->width - 7; - num = (int) (((double)barwidth) * frac); - for( i = 0; i < num; i++ ) { - line[i] = '#'; - } - line[i] = '\0'; - snprintf( format, sizeof(format), "%%-%ds %%5.1f%%%%", barwidth ); - snprintf( outline, sizeof(outline), format, line, percent ); - fprintf( bar->out, "\r%s", outline ); - } - fflush(bar->out); - bar->prev = point; - - return 0; -} - -static -void progressbarinit(struct ProgressData *bar, - struct Configurable *config) -{ -#ifdef __EMX__ - /* 20000318 mgs */ - int scr_size [2]; -#endif - char *colp; - - memset(bar, 0, sizeof(struct ProgressData)); - - /* pass this through to progress function so - * it can display progress towards total file - * not just the part that's left. (21-may-03, dbyron) */ - if(config->use_resume) - bar->initial_size = config->resume_from; - -/* TODO: get terminal width through ansi escapes or something similar. - try to update width when xterm is resized... - 19990617 larsa */ -#ifndef __EMX__ - /* 20000318 mgs - * OS/2 users most likely won't have this env var set, and besides that - * we're using our own way to determine screen width */ - colp = curlx_getenv("COLUMNS"); - if(colp != NULL) { - bar->width = atoi(colp); - curl_free(colp); - } - else - bar->width = 79; -#else - /* 20000318 mgs - * We use this emx library call to get the screen width, and subtract - * one from what we got in order to avoid a problem with the cursor - * advancing to the next line if we print a string that is as long as - * the screen is wide. */ - - _scrsize(scr_size); - bar->width = scr_size[0] - 1; -#endif - - bar->out = config->errors; -} - - -static -void dump(const char *timebuf, const char *text, - FILE *stream, const unsigned char *ptr, size_t size, - trace tracetype, curl_infotype infotype) -{ - size_t i; - size_t c; - - unsigned int width=0x10; - - if(tracetype == TRACE_ASCII) - /* without the hex output, we can fit more on screen */ - width = 0x40; - - fprintf(stream, "%s%s, %zd bytes (0x%zx)\n", timebuf, text, size, size); - - for(i=0; i<size; i+= width) { - - fprintf(stream, "%04zx: ", i); - - if(tracetype == TRACE_BIN) { - /* hex not disabled, show it */ - for(c = 0; c < width; c++) - if(i+c < size) - fprintf(stream, "%02x ", ptr[i+c]); - else - fputs(" ", stream); - } - - for(c = 0; (c < width) && (i+c < size); c++) { - /* check for 0D0A; if found, skip past and start a new line of output */ - if((tracetype == TRACE_ASCII) && - (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) { - i+=(c+2-width); - break; - } -#ifdef CURL_DOES_CONVERSIONS - /* repeat the 0D0A check above but use the host encoding for CRLF */ - if((tracetype == TRACE_ASCII) && - (i+c+1 < size) && ptr[i+c]=='\r' && ptr[i+c+1]=='\n') { - i+=(c+2-width); - break; - } - /* convert to host encoding and print this character */ - fprintf(stream, "%c", convert_char(infotype, ptr[i+c])); -#else - (void)infotype; - fprintf(stream, "%c", - (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:UNPRINTABLE_CHAR); -#endif /* CURL_DOES_CONVERSIONS */ - /* check again for 0D0A, to avoid an extra \n if it's at width */ - if((tracetype == TRACE_ASCII) && - (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { - i+=(c+3-width); - break; - } - } - fputc('\n', stream); /* newline */ - } - fflush(stream); -} - -static -int my_trace(CURL *handle, curl_infotype type, - unsigned char *data, size_t size, - void *userp) -{ - struct Configurable *config = (struct Configurable *)userp; - FILE *output=config->errors; - const char *text; - struct timeval tv; - struct tm *now; - char timebuf[20]; - time_t secs; - static time_t epoch_offset; - static int known_offset; - - (void)handle; /* prevent compiler warning */ - - if(config->tracetime) { - tv = cutil_tvnow(); - if(!known_offset) { - epoch_offset = time(NULL) - tv.tv_sec; - known_offset = 1; - } - secs = epoch_offset + tv.tv_sec; - now = localtime(&secs); /* not thread safe but we don't care */ - snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ", - now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec); - } - else - timebuf[0]=0; - - if(!config->trace_stream) { - /* open for append */ - if(curlx_strequal("-", config->trace_dump)) - config->trace_stream = stdout; - else if(curlx_strequal("%", config->trace_dump)) - /* Ok, this is somewhat hackish but we do it undocumented for now */ - config->trace_stream = config->errors; /* aka stderr */ - else { - config->trace_stream = fopen(config->trace_dump, "w"); - config->trace_fopened = TRUE; - } - } - - if(config->trace_stream) - output = config->trace_stream; - - if(!output) { - warnf(config, "Failed to create/open output"); - return 0; - } - - if(config->tracetype == TRACE_PLAIN) { - /* - * This is the trace look that is similar to what libcurl makes on its - * own. - */ - static const char * const s_infotype[] = { - "*", "<", ">", "{", "}", "{", "}" - }; - size_t i; - size_t st=0; - static bool newl = FALSE; - static bool traced_data = FALSE; - - switch(type) { - case CURLINFO_HEADER_OUT: - for(i=0; i<size-1; i++) { - if(data[i] == '\n') { /* LF */ - if(!newl) { - fprintf(output, "%s%s ", timebuf, s_infotype[type]); - } - (void)fwrite(data+st, i-st+1, 1, output); - st = i+1; - newl = FALSE; - } - } - if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); - (void)fwrite(data+st, i-st+1, 1, output); - newl = (bool)(size && (data[size-1] != '\n')); - traced_data = FALSE; - break; - case CURLINFO_TEXT: - case CURLINFO_HEADER_IN: - if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); - (void)fwrite(data, size, 1, output); - newl = (bool)(size && (data[size-1] != '\n')); - traced_data = FALSE; - break; - case CURLINFO_DATA_OUT: - case CURLINFO_DATA_IN: - case CURLINFO_SSL_DATA_IN: - case CURLINFO_SSL_DATA_OUT: - if(!traced_data) { - /* if the data is output to a tty and we're sending this debug trace - to stderr or stdout, we don't display the alert about the data not - being shown as the data _is_ shown then just not via this - function */ - if(!config->isatty || - ((output != stderr) && (output != stdout))) { - if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); - fprintf(output, "[data not shown]\n"); - newl = FALSE; - traced_data = TRUE; - } - } - break; - default: /* nada */ - newl = FALSE; - traced_data = FALSE; - break; - } - - return 0; - } - -#ifdef CURL_DOES_CONVERSIONS - /* Special processing is needed for CURLINFO_HEADER_OUT blocks - * if they contain both headers and data (separated by CRLFCRLF). - * We dump the header text and then switch type to CURLINFO_DATA_OUT. - */ - if((type == CURLINFO_HEADER_OUT) && (size > 4)) { - size_t i; - for(i = 0; i < size - 4; i++) { - if(memcmp(&data[i], "\r\n\r\n", 4) == 0) { - /* dump everthing through the CRLFCRLF as a sent header */ - text = "=> Send header"; - dump(timebuf, text, output, data, i+4, config->tracetype, type); - data += i + 3; - size -= i + 4; - type = CURLINFO_DATA_OUT; - data += 1; - break; - } - } - } -#endif /* CURL_DOES_CONVERSIONS */ - - switch (type) { - case CURLINFO_TEXT: - fprintf(output, "%s== Info: %s", timebuf, data); - default: /* in case a new one is introduced to shock us */ - return 0; - - case CURLINFO_HEADER_OUT: - text = "=> Send header"; - break; - case CURLINFO_DATA_OUT: - text = "=> Send data"; - break; - case CURLINFO_HEADER_IN: - text = "<= Recv header"; - break; - case CURLINFO_DATA_IN: - text = "<= Recv data"; - break; - case CURLINFO_SSL_DATA_IN: - text = "<= Recv SSL data"; - break; - case CURLINFO_SSL_DATA_OUT: - text = "=> Send SSL data"; - break; - } - - dump(timebuf, text, output, data, size, config->tracetype, type); - return 0; -} - -static void free_config_fields(struct Configurable *config) -{ - if(config->random_file) - free(config->random_file); - if(config->egd_file) - free(config->egd_file); - if(config->trace_dump) - free(config->trace_dump); - if(config->cipher_list) - free(config->cipher_list); - if(config->userpwd) - free(config->userpwd); - if(config->postfields) - free(config->postfields); - if(config->proxy) - free(config->proxy); - if(config->proxyuserpwd) - free(config->proxyuserpwd); - if(config->noproxy) - free(config->noproxy); - if(config->cookie) - free(config->cookie); - if(config->cookiefile) - free(config->cookiefile); - if(config->krblevel) - free(config->krblevel); - if(config->headerfile) - free(config->headerfile); - if(config->ftpport) - free(config->ftpport); - if(config->range) - free(config->range); - if(config->customrequest) - free(config->customrequest); - if(config->writeout) - free(config->writeout); - if(config->httppost) - curl_formfree(config->httppost); - if(config->cert) - free(config->cert); - if(config->cacert) - free(config->cacert); - if(config->cert_type) - free(config->cert_type); - if(config->capath) - free(config->capath); - if(config->crlfile) - free(config->crlfile); - if(config->cookiejar) - free(config->cookiejar); - if(config->ftp_account) - free(config->ftp_account); - if(config->ftp_alternative_to_user) - free(config->ftp_alternative_to_user); - if(config->iface) - free(config->iface); - if(config->socksproxy) - free(config->socksproxy); - if(config->libcurl) - free(config->libcurl); - if(config->key_passwd) - free(config->key_passwd); - if(config->key) - free(config->key); - if(config->key_type) - free(config->key_type); - if(config->pubkey) - free(config->pubkey); - if(config->referer) - free(config->referer); - if(config->hostpubmd5) - free(config->hostpubmd5); - if(config->mail_from) - free(config->mail_from); -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - if(config->socks5_gssapi_service) - free(config->socks5_gssapi_service); -#endif - - curl_slist_free_all(config->quote); /* checks for config->quote == NULL */ - curl_slist_free_all(config->prequote); - curl_slist_free_all(config->postquote); - curl_slist_free_all(config->headers); - curl_slist_free_all(config->telnet_options); - curl_slist_free_all(config->mail_rcpt); - - if(config->easy) - curl_easy_cleanup(config->easy); -} - -#ifdef WIN32 - -/* Function to find CACert bundle on a Win32 platform using SearchPath. - * (SearchPath is already declared via inclusions done in setup header file) - * (Use the ASCII version instead of the unicode one!) - * The order of the directories it searches is: - * 1. application's directory - * 2. current working directory - * 3. Windows System directory (e.g. C:\windows\system32) - * 4. Windows Directory (e.g. C:\windows) - * 5. all directories along %PATH% - */ -static void FindWin32CACert(struct Configurable *config, - const char *bundle_file) -{ - /* only check for cert file if "we" support SSL */ - if(curlinfo->features & CURL_VERSION_SSL) { - DWORD buflen; - char *ptr = NULL; - char *retval = malloc(sizeof (TCHAR) * (MAX_PATH + 1)); - if(!retval) - return; - retval[0] = '\0'; - buflen = SearchPathA(NULL, bundle_file, NULL, MAX_PATH+2, retval, &ptr); - if(buflen > 0) { - GetStr(&config->cacert, retval); - } - free(retval); - } -} - -#endif - -#define RETRY_SLEEP_DEFAULT 1000 /* ms */ -#define RETRY_SLEEP_MAX 600000 /* ms == 10 minutes */ - -static bool -output_expected(const char* url, const char* uploadfile) -{ - if(!uploadfile) - return TRUE; /* download */ - if(checkprefix("http://", url) || checkprefix("https://", url)) - return TRUE; /* HTTP(S) upload */ - - return FALSE; /* non-HTTP upload, probably no output should be expected */ -} - -#define my_setopt(x,y,z) _my_setopt(x, FALSE, config, #y, y, z) -#define my_setopt_str(x,y,z) _my_setopt(x, TRUE, config, #y, y, z) - -static struct curl_slist *easycode; -static struct curl_slist *easycode_remarks; - -static CURLcode _my_setopt(CURL *curl, bool str, struct Configurable *config, - const char *name, CURLoption tag, ...); - -static CURLcode _my_setopt(CURL *curl, bool str, struct Configurable *config, - const char *name, CURLoption tag, ...) -{ - va_list arg; - CURLcode ret; - char *bufp; - char value[256]; - bool remark=FALSE; - bool skip=FALSE; - - va_start(arg, tag); - - if(tag < CURLOPTTYPE_OBJECTPOINT) { - long lval = va_arg(arg, long); - snprintf(value, sizeof(value), "%ld", lval); - ret = curl_easy_setopt(curl, tag, lval); - if(!lval) - skip = TRUE; - } - else if(tag < CURLOPTTYPE_OFF_T) { - void *pval = va_arg(arg, void *); - unsigned char *ptr = (unsigned char *)pval; - - /* function pointers are never printable */ - if(tag >= CURLOPTTYPE_FUNCTIONPOINT) { - if(pval) { - strcpy(value, "functionpointer"); /* 'value' fits 256 bytes */ - remark = TRUE; - } - else - skip = TRUE; - } - - else if(pval && str) - snprintf(value, sizeof(value), "\"%s\"", (char *)ptr); - else if(pval) { - strcpy(value, "objectpointer"); /* 'value' fits 256 bytes */ - remark = TRUE; - } - else - skip = TRUE; - - ret = curl_easy_setopt(curl, tag, pval); - - } - else { - curl_off_t oval = va_arg(arg, curl_off_t); - snprintf(value, sizeof(value), - "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval); - ret = curl_easy_setopt(curl, tag, oval); - - if(!oval) - skip = TRUE; - } - - if(config->libcurl && !skip) { - /* we only use this for real if --libcurl was used */ - - if(remark) - bufp = curlx_maprintf("%s set to a %s", name, value); - else - bufp = curlx_maprintf("curl_easy_setopt(hnd, %s, %s);", name, value); - - if(!bufp) - ret = CURLE_OUT_OF_MEMORY; - else { - struct curl_slist *list = - curl_slist_append(remark?easycode_remarks:easycode, bufp); - - if(remark) - easycode_remarks = list; - else - easycode = list; - } - if(bufp) - curl_free(bufp); - } - va_end(arg); - - return ret; -} - -static const char * const srchead[]={ - "/********* Sample code generated by the curl command line tool **********", - " * Add error code checking where appropriate!", - " * Compile this with a suitable header include path. Then link with ", - " * libcurl.", - " * If you use any *_LARGE options, make sure your compiler figure", - " * out the correct size for the curl_off_t variable.", - " * Read the details for all curl_easy_setopt() options online on:", - " * http://curlm.haxx.se/libcurl/c/curl_easy_setopt.html", - " ************************************************************************/", - "[m]", - "#include <curl/curl.h>", - "", - "int main(int argc, char *argv[])", - "{", - " CURLcode ret;", - NULL -}; - -static void dumpeasycode(struct Configurable *config) -{ - struct curl_slist *ptr; - char *o = config->libcurl; - - if(o) { - FILE *out; - bool fopened = FALSE; - if(strcmp(o, "-")) { - out = fopen(o, "wt"); - fopened = TRUE; - } - else - out= stdout; - if(!out) - warnf(config, "Failed to open %s to write libcurl code!\n", o); - else { - int i; - const char *c; - - for(i=0; (c = srchead[i]); i++) { - if(!memcmp((char *)c, "[m]", 3)) { -#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS > 32) - fprintf(out, "#define _FILE_OFFSET_BITS %d " - "/* for pre libcurl 7.19.0 curl_off_t magic */\n", - _FILE_OFFSET_BITS); -#endif - } - else - fprintf(out, "%s\n", c); - } - - ptr = easycode; - while(ptr) { - fprintf(out, " %s\n", ptr->data); - ptr = ptr->next; - } - - ptr = easycode_remarks; - if(ptr) { - fprintf(out, - "\n /* Here is a list of options the curl code" - " used that cannot get generated\n" - " as source easily. You may select to either" - " not use them or implement\n them yourself.\n" - "\n"); - while(ptr) { - fprintf(out, " %s\n", ptr->data); - ptr = ptr->next; - } - fprintf(out, "\n */\n"); - } - - fprintf(out, - " return (int)ret;\n" - "}\n" - "/**** End of sample code ****/\n"); - if(fopened) - fclose(out); - } - } - curl_slist_free_all(easycode); -} - -static bool stdin_upload(const char *uploadfile) -{ - return (bool)(curlx_strequal(uploadfile, "-") || - curlx_strequal(uploadfile, ".")); -} - -/* Adds the file name to the URL if it doesn't already have one. - * url will be freed before return if the returned pointer is different - */ -static char *add_file_name_to_url(CURL *curl, char *url, const char *filename) -{ - /* If no file name part is given in the URL, we add this file name */ - char *ptr=strstr(url, "://"); - if(ptr) - ptr+=3; - else - ptr=url; - ptr = strrchr(ptr, '/'); - if(!ptr || !strlen(++ptr)) { - /* The URL has no file name part, add the local file name. In order - to be able to do so, we have to create a new URL in another - buffer.*/ - - /* We only want the part of the local path that is on the right - side of the rightmost slash and backslash. */ - const char *filep = strrchr(filename, '/'); - char *file2 = strrchr(filep?filep:filename, '\\'); - char *encfile; - - if(file2) - filep = file2+1; - else if(filep) - filep++; - else - filep = filename; - - /* URL encode the file name */ - encfile = curl_easy_escape(curl, filep, 0 /* use strlen */); - if(encfile) { - char *urlbuffer = malloc(strlen(url) + strlen(encfile) + 3); - if(!urlbuffer) { - free(url); - return NULL; - } - if(ptr) - /* there is a trailing slash on the URL */ - sprintf(urlbuffer, "%s%s", url, encfile); - else - /* there is no trailing slash on the URL */ - sprintf(urlbuffer, "%s/%s", url, encfile); - - curl_free(encfile); - - free(url); - url = urlbuffer; /* use our new URL instead! */ - } - } - return url; -} - -/* Extracts the name portion of the URL. - * Returns a heap-allocated string, or NULL if no name part - */ -static char *get_url_file_name(const char *url) -{ - char *fn = NULL; - - /* Find and get the remote file name */ - const char * pc =strstr(url, "://"); - if(pc) - pc+=3; - else - pc=url; - pc = strrchr(pc, '/'); - - if(pc) { - /* duplicate the string beyond the slash */ - pc++; - fn = *pc ? strdup(pc): NULL; - } - return fn; -} - -static char* -parse_filename(char *ptr, size_t len) -{ - char* copy; - char* p; - char* q; - char quote = 0; - - /* simple implementation of strndup() */ - copy = malloc(len+1); - if(!copy) - return NULL; - strncpy(copy, ptr, len); - copy[len] = 0; - - p = copy; - if(*p == '\'' || *p == '"') { - /* store the starting quote */ - quote = *p; - p++; - } - - /* if the filename contains a path, only use filename portion */ - q = strrchr(copy, '/'); - if(q) { - p=q+1; - if(!*p) { - free(copy); - return NULL; - } - } - - /* If the filename contains a backslash, only use filename portion. The idea - is that even systems that don't handle backslashes as path separators - probably want the path removed for convenience. */ - q = strrchr(p, '\\'); - if (q) { - p = q+1; - if (!*p) { - free(copy); - return NULL; - } - } - - if(quote) { - /* if the file name started with a quote, then scan for the end quote and - stop there */ - q = strrchr(p, quote); - if(q) - *q = 0; - } - else - q = NULL; /* no start quote, so no end has been found */ - - if(!q) { - /* make sure the file name doesn't end in \r or \n */ - q = strchr(p, '\r'); - if(q) - *q = 0; - - q = strchr(p, '\n'); - if(q) - *q = 0; - } - - if(copy!=p) - memmove(copy, p, strlen(p)+1); - - return copy; -} - -static size_t -header_callback(void *ptr, size_t size, size_t nmemb, void *stream) -{ - struct OutStruct* outs = (struct OutStruct*)stream; - const char* str = (char*)ptr; - const size_t cb = size*nmemb; - const char* end = (char*)ptr + cb; - size_t len; - - if(cb > 20 && checkprefix("Content-disposition:", str)) { - char *p = (char*)str + 20; - - /* look for the 'filename=' parameter - (encoded filenames (*=) are not supported) */ - for(;;) { - char *filename; - char *semi; - - while(*p && (p < end) && !ISALPHA(*p)) - p++; - if(p > end-9) - break; - - if(memcmp(p, "filename=", 9)) { - /* no match, find next parameter */ - while((p < end) && (*p != ';')) - p++; - continue; - } - p+=9; - semi = strchr(p, ';'); - - /* this expression below typecasts 'cb' only to avoid - warning: signed and unsigned type in conditional expression - */ - len = semi ? (semi - p) : (ssize_t)cb - (p - str); - filename = parse_filename(p, len); - if(filename) { - outs->filename = filename; - break; - } - } - } - - return cb; -} - -static int -operate(struct Configurable *config, int argc, argv_item_t argv[]) -{ - char errorbuffer[CURL_ERROR_SIZE]; - char useragent[256]; /* buah, we don't want a larger default user agent */ - struct ProgressData progressbar; - struct getout *urlnode; - struct getout *nextnode; - - struct OutStruct outs; - struct OutStruct heads; - struct InStruct input; - - URLGlob *urls=NULL; - URLGlob *inglob=NULL; - int urlnum; - int infilenum; - char *uploadfile=NULL; /* a single file, never a glob */ - - curl_off_t uploadfilesize; /* -1 means unknown */ - bool stillflags=TRUE; - - bool allocuseragent=FALSE; - - char *httpgetfields=NULL; - - CURL *curl; - int res = 0; - int i; - long retry_sleep_default; - long retry_sleep; - - char *env; - - memset(&heads, 0, sizeof(struct OutStruct)); - -#ifdef CURLDEBUG - /* this sends all memory debug messages to a logfile named memdump */ - env = curlx_getenv("CURL_MEMDEBUG"); - if(env) { - /* use the value as file name */ - char *s = strdup(env); - curl_free(env); - curl_memdebug(s); - free(s); - /* this weird strdup() and stuff here is to make the curl_free() get - called before the memdebug() as otherwise the memdebug tracing will - with tracing a free() without an alloc! */ - } - env = curlx_getenv("CURL_MEMLIMIT"); - if(env) { - curl_memlimit(atoi(env)); - curl_free(env); - } -#endif - - /* Initialize curl library - do not call any libcurl functions before. - Note that the CURLDEBUG magic above is an exception, but then that's not - part of the official public API. - */ - if(main_init() != CURLE_OK) { - helpf(config->errors, "error initializing curl library\n"); - return CURLE_FAILED_INIT; - } - - /* - * Get a curl handle to use for all forthcoming curl transfers. Cleanup - * when all transfers are done. - */ - curl = curl_easy_init(); - if(!curl) { - clean_getout(config); - return CURLE_FAILED_INIT; - } - config->easy = curl; - - memset(&outs,0,sizeof(outs)); - - config->outs = &outs; - - /* we get libcurl info right away */ - curlinfo = curl_version_info(CURLVERSION_NOW); - - errorbuffer[0]=0; /* prevent junk from being output */ - - /* setup proper locale from environment */ -#ifdef HAVE_SETLOCALE - setlocale(LC_ALL, ""); -#endif - - /* inits */ - config->postfieldsize = -1; - config->showerror=TRUE; - config->use_httpget=FALSE; - config->create_dirs=FALSE; - config->maxredirs = DEFAULT_MAXREDIRS; - config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */ - config->proto_present = FALSE; - config->proto_redir = - CURLPROTO_ALL & ~(CURLPROTO_FILE|CURLPROTO_SCP); /* not FILE or SCP */ - config->proto_redir_present = FALSE; - - if(argc>1 && - (!curlx_strnequal("--", argv[1], 2) && (argv[1][0] == '-')) && - strchr(argv[1], 'q')) { - /* - * The first flag, that is not a verbose name, but a shortname - * and it includes the 'q' flag! - */ - ; - } - else { - parseconfig(NULL, config); /* ignore possible failure */ - } - - if((argc < 2) && !config->url_list) { - helpf(config->errors, NULL); - return CURLE_FAILED_INIT; - } - - /* Parse options */ - for(i = 1; i < argc; i++) { - if(stillflags && - ('-' == argv[i][0])) { - char *nextarg; - bool passarg; - char *origopt=argv[i]; - - char *flag = argv[i]; - - if(curlx_strequal("--", argv[i])) - /* this indicates the end of the flags and thus enables the - following (URL) argument to start with -. */ - stillflags=FALSE; - else { - nextarg= (i < argc - 1)? argv[i+1]: NULL; - - res = getparameter(flag, nextarg, &passarg, config); - if(res) { - int retval = CURLE_OK; - if(res != PARAM_HELP_REQUESTED) { - const char *reason = param2text(res); - helpf(config->errors, "option %s: %s\n", origopt, reason); - retval = CURLE_FAILED_INIT; - } - clean_getout(config); - return retval; - } - - if(passarg) /* we're supposed to skip this */ - i++; - } - } - else { - bool used; - /* just add the URL please */ - res = getparameter((char *)"--url", argv[i], &used, config); - if(res) - return res; - } - } - - retry_sleep_default = config->retry_delay? - config->retry_delay*1000:RETRY_SLEEP_DEFAULT; /* ms */ - retry_sleep = retry_sleep_default; - - if((!config->url_list || !config->url_list->url) && !config->list_engines) { - clean_getout(config); - helpf(config->errors, "no URL specified!\n"); - return CURLE_FAILED_INIT; - } - if(NULL == config->useragent) { - /* set non-zero default values: */ - snprintf(useragent, sizeof(useragent), - CURL_NAME "/" CURL_VERSION " (" OS ") " "%s", curl_version()); - config->useragent= useragent; - } - else - allocuseragent = TRUE; - - /* On WIN32 we can't set the path to curl-ca-bundle.crt - * at compile time. So we look here for the file in two ways: - * 1: look at the environment variable CURL_CA_BUNDLE for a path - * 2: if #1 isn't found, use the windows API function SearchPath() - * to find it along the app's path (includes app's dir and CWD) - * - * We support the environment variable thing for non-Windows platforms - * too. Just for the sake of it. - */ - if(!config->cacert && - !config->capath && - !config->insecure_ok) { - env = curlx_getenv("CURL_CA_BUNDLE"); - if(env) - GetStr(&config->cacert, env); - else { - env = curlx_getenv("SSL_CERT_DIR"); - if(env) - GetStr(&config->capath, env); - else { - env = curlx_getenv("SSL_CERT_FILE"); - if(env) - GetStr(&config->cacert, env); - } - } - - if(env) - curl_free(env); -#ifdef WIN32 - else - FindWin32CACert(config, "curl-ca-bundle.crt"); -#endif - } - - if(config->postfields) { - if(config->use_httpget) { - /* Use the postfields data for a http get */ - httpgetfields = strdup(config->postfields); - free(config->postfields); - config->postfields = NULL; - if(SetHTTPrequest(config, - (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET), - &config->httpreq)) { - free(httpgetfields); - return PARAM_BAD_USE; - } - } - else { - if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) - return PARAM_BAD_USE; - } - } - - /* This is the first entry added to easycode and it initializes the slist */ - easycode = curl_slist_append(easycode, "CURL *hnd = curl_easy_init();"); - if(!easycode) { - clean_getout(config); - res = CURLE_OUT_OF_MEMORY; - goto quit_curl; - } - - if(config->list_engines) { - struct curl_slist *engines = NULL; - - curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines); - list_engines(engines); - curl_slist_free_all(engines); - res = CURLE_OK; - goto quit_curl; - } - - /* After this point, we should call curl_easy_cleanup() if we decide to bail - * out from this function! */ - - urlnode = config->url_list; - - if(config->headerfile) { - /* open file for output: */ - if(strcmp(config->headerfile,"-")) { - heads.filename = config->headerfile; - } - else - heads.stream=stdout; - heads.config = config; - } - - /* loop through the list of given URLs */ - while(urlnode) { - int up; /* upload file counter within a single upload glob */ - char *dourl; - char *url; - char *infiles; /* might be a glob pattern */ - char *outfiles=NULL; - - /* get the full URL (it might be NULL) */ - dourl=urlnode->url; - - url = dourl; - - if(NULL == url) { - /* This node had no URL, skip it and continue to the next */ - if(urlnode->outfile) - free(urlnode->outfile); - - /* move on to the next URL */ - nextnode=urlnode->next; - free(urlnode); /* free the node */ - urlnode = nextnode; - continue; /* next please */ - } - - /* default output stream is stdout */ - outs.stream = stdout; - outs.config = config; - outs.bytes = 0; /* nothing written yet */ - - /* save outfile pattern before expansion */ - if(urlnode->outfile) { - outfiles = strdup(urlnode->outfile); - if(!outfiles) { - clean_getout(config); - break; - } - } - - infiles = urlnode->infile; - - if(!config->globoff && infiles) { - /* Unless explicitly shut off */ - res = glob_url(&inglob, infiles, &infilenum, - config->showerror?config->errors:NULL); - if(res != CURLE_OK) { - clean_getout(config); - if(outfiles) - free(outfiles); - break; - } - } - - /* Here's the loop for uploading multiple files within the same - single globbed string. If no upload, we enter the loop once anyway. */ - for(up = 0; - (!up && !infiles) || - (uploadfile = inglob? - glob_next_url(inglob): - (!up?strdup(infiles):NULL)); - up++) { - int separator = 0; - long retry_numretries; - uploadfilesize=-1; - - if(!config->globoff) { - /* Unless explicitly shut off, we expand '{...}' and '[...]' - expressions and return total number of URLs in pattern set */ - res = glob_url(&urls, dourl, &urlnum, - config->showerror?config->errors:NULL); - if(res != CURLE_OK) { - break; - } - } - else - urlnum = 1; /* without globbing, this is a single URL */ - - /* if multiple files extracted to stdout, insert separators! */ - separator= ((!outfiles || curlx_strequal(outfiles, "-")) && urlnum > 1); - - /* Here's looping around each globbed URL */ - for(i = 0; - (url = urls?glob_next_url(urls):(i?NULL:strdup(url))); - i++) { - /* NOTE: In the condition expression in the for() statement above, the - 'url' variable is only ever strdup()ed if(i == 0) and thus never - when this loops later on. Further down in this function we call - free(url) and then the code loops. Static code parsers may thus get - tricked into believing that we have a potential access-after-free - here. I can however not spot any such case. */ - - int infd = STDIN_FILENO; - bool infdopen; - char *outfile; - struct timeval retrystart; - outfile = outfiles?strdup(outfiles):NULL; - - if((urlnode->flags&GETOUT_USEREMOTE) || - (outfile && !curlx_strequal("-", outfile)) ) { - - /* - * We have specified a file name to store the result in, or we have - * decided we want to use the remote file name. - */ - - if(!outfile) { - /* extract the file name from the URL */ - outfile = get_url_file_name(url); - if((!outfile || !*outfile) && !config->content_disposition) { - helpf(config->errors, "Remote file name has no length!\n"); - res = CURLE_WRITE_ERROR; - free(url); - break; - } -#if defined(MSDOS) || defined(WIN32) - /* For DOS and WIN32, we do some major replacing of - bad characters in the file name before using it */ - outfile = sanitize_dos_name(outfile); - if(!outfile) { - res = CURLE_OUT_OF_MEMORY; - break; - } -#endif /* MSDOS || WIN32 */ - } - else if(urls) { - /* fill '#1' ... '#9' terms from URL pattern */ - char *storefile = outfile; - outfile = glob_match_url(storefile, urls); - free(storefile); - if(!outfile) { - /* bad globbing */ - warnf(config, "bad output glob!\n"); - free(url); - res = CURLE_FAILED_INIT; - break; - } - } - - /* Create the directory hierarchy, if not pre-existant to a multiple - file output call */ - - if(config->create_dirs && - (-1 == create_dir_hierarchy(outfile, config->errors))) { - free(url); - res = CURLE_WRITE_ERROR; - break; - } - - if(config->resume_from_current) { - /* We're told to continue from where we are now. Get the - size of the file as it is now and open it for append instead */ - - struct_stat fileinfo; - - /* VMS -- Danger, the filesize is only valid for stream files */ - if(0 == stat(outfile, &fileinfo)) - /* set offset to current file size: */ - config->resume_from = fileinfo.st_size; - else - /* let offset be 0 */ - config->resume_from = 0; - } - - outs.filename = outfile; - - if(config->resume_from) { - outs.init = config->resume_from; - /* open file for output: */ - outs.stream=(FILE *) fopen(outfile, config->resume_from?"ab":"wb"); - if(!outs.stream) { - helpf(config->errors, "Can't open '%s'!\n", outfile); - free(url); - res = CURLE_WRITE_ERROR; - break; - } - } - else { - outs.stream = NULL; /* open when needed */ - outs.bytes = 0; /* reset byte counter */ - } - } - infdopen=FALSE; - if(uploadfile && !stdin_upload(uploadfile)) { - /* - * We have specified a file to upload and it isn't "-". - */ - struct_stat fileinfo; - - url = add_file_name_to_url(curl, url, uploadfile); - if(!url) { - helpf(config->errors, "out of memory\n"); - res = CURLE_OUT_OF_MEMORY; - break; - } - /* VMS Note: - * - * Reading binary from files can be a problem... Only FIXED, VAR - * etc WITHOUT implied CC will work Others need a \n appended to a - * line - * - * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a - * fixed file with implied CC needs to have a byte added for every - * record processed, this can by derived from Filesize & recordsize - * for VARiable record files the records need to be counted! for - * every record add 1 for linefeed and subtract 2 for the record - * header for VARIABLE header files only the bare record data needs - * to be considered with one appended if implied CC - */ - - infd= open(uploadfile, O_RDONLY | O_BINARY); - if((infd == -1) || fstat(infd, &fileinfo)) { - helpf(config->errors, "Can't open '%s'!\n", uploadfile); - if(infd != -1) - close(infd); - - /* Free the list of remaining URLs and globbed upload files - * to force curl to exit immediately - */ - if(urls) { - glob_cleanup(urls); - urls = NULL; - } - if(inglob) { - glob_cleanup(inglob); - inglob = NULL; - } - - res = CURLE_READ_ERROR; - goto quit_urls; - } - infdopen=TRUE; - - /* we ignore file size for char/block devices, sockets, etc. */ - if(S_ISREG(fileinfo.st_mode)) - uploadfilesize=fileinfo.st_size; - - } - else if(uploadfile && stdin_upload(uploadfile)) { - /* count to see if there are more than one auth bit set - in the authtype field */ - int authbits = 0; - int bitcheck = 0; - while(bitcheck < 32) { - if(config->authtype & (1 << bitcheck++)) { - authbits++; - if(authbits > 1) { - /* more than one, we're done! */ - break; - } - } - } - - /* - * If the user has also selected --anyauth or --proxy-anyauth - * we should warn him/her. - */ - if(config->proxyanyauth || (authbits>1)) { - warnf(config, - "Using --anyauth or --proxy-anyauth with upload from stdin" - " involves a big risk of it not working. Use a temporary" - " file or a fixed auth type instead!\n"); - } - - SET_BINMODE(stdin); - infd = STDIN_FILENO; - if(curlx_strequal(uploadfile, ".")) { - if(curlx_nonblock((curl_socket_t)infd, TRUE) < 0) - warnf(config, - "fcntl failed on fd=%d: %s\n", infd, strerror(errno)); - } - } - - if(uploadfile && config->resume_from_current) - config->resume_from = -1; /* -1 will then force get-it-yourself */ - - if(output_expected(url, uploadfile) - && outs.stream && isatty(fileno(outs.stream))) - /* we send the output to a tty, therefore we switch off the progress - meter */ - config->noprogress = config->isatty = TRUE; - - if(urlnum > 1 && !(config->mute)) { - fprintf(config->errors, "\n[%d/%d]: %s --> %s\n", - i+1, urlnum, url, outfile ? outfile : "<stdout>"); - if(separator) - printf("%s%s\n", CURLseparator, url); - } - if(httpgetfields) { - char *urlbuffer; - /* Find out whether the url contains a file name */ - const char *pc =strstr(url, "://"); - char sep='?'; - if(pc) - pc+=3; - else - pc=url; - - pc = strrchr(pc, '/'); /* check for a slash */ - - if(pc) { - /* there is a slash present in the URL */ - - if(strchr(pc, '?')) - /* Ouch, there's already a question mark in the URL string, we - then append the data with an ampersand separator instead! */ - sep='&'; - } - /* - * Then append ? followed by the get fields to the url. - */ - urlbuffer = malloc(strlen(url) + strlen(httpgetfields) + 3); - if(!urlbuffer) { - helpf(config->errors, "out of memory\n"); - - /* Free the list of remaining URLs and globbed upload files - * to force curl to exit immediately - */ - if(urls) { - glob_cleanup(urls); - urls = NULL; - } - if(inglob) { - glob_cleanup(inglob); - inglob = NULL; - } - - res = CURLE_OUT_OF_MEMORY; - goto quit_urls; - } - if(pc) - sprintf(urlbuffer, "%s%c%s", url, sep, httpgetfields); - else - /* Append / before the ? to create a well-formed url - if the url contains a hostname only - */ - sprintf(urlbuffer, "%s/?%s", url, httpgetfields); - - free(url); /* free previous URL */ - url = urlbuffer; /* use our new URL instead! */ - } - - if(!config->errors) - config->errors = stderr; - - if((!outfile || !strcmp(outfile, "-")) && !config->use_ascii) { - /* We get the output to stdout and we have not got the ASCII/text - flag, then set stdout to be binary */ - SET_BINMODE(stdout); - } - - if(1 == config->tcp_nodelay) - my_setopt(curl, CURLOPT_TCP_NODELAY, 1); - - /* where to store */ - my_setopt(curl, CURLOPT_WRITEDATA, &outs); - /* what call to write */ - my_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); - - /* for uploads */ - input.fd = infd; - input.config = config; - my_setopt(curl, CURLOPT_READDATA, &input); - /* what call to read */ - if((outfile && !curlx_strequal("-", outfile)) || - !checkprefix("telnet:", url)) - my_setopt(curl, CURLOPT_READFUNCTION, my_fread); - - /* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what - CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */ - my_setopt(curl, CURLOPT_SEEKDATA, &input); - my_setopt(curl, CURLOPT_SEEKFUNCTION, my_seek); - - if(config->recvpersecond) - /* tell libcurl to use a smaller sized buffer as it allows us to - make better sleeps! 7.9.9 stuff! */ - my_setopt(curl, CURLOPT_BUFFERSIZE, config->recvpersecond); - - /* size of uploaded file: */ - if(uploadfilesize != -1) - my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize); - my_setopt_str(curl, CURLOPT_URL, url); /* what to fetch */ - my_setopt_str(curl, CURLOPT_PROXY, config->proxy); /* proxy to use */ - if(config->proxy) - my_setopt(curl, CURLOPT_PROXYTYPE, config->proxyver); - my_setopt(curl, CURLOPT_NOPROGRESS, config->noprogress); - if(config->no_body) { - my_setopt(curl, CURLOPT_NOBODY, 1); - my_setopt(curl, CURLOPT_HEADER, 1); - } - else - my_setopt(curl, CURLOPT_HEADER, config->include_headers); - - my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror); - my_setopt(curl, CURLOPT_UPLOAD, uploadfile?TRUE:FALSE); - my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly); - my_setopt(curl, CURLOPT_APPEND, config->ftp_append); - - if(config->netrc_opt) - my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL); - else if(config->netrc) - my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_REQUIRED); - else - my_setopt(curl, CURLOPT_NETRC, CURL_NETRC_IGNORED); - - my_setopt(curl, CURLOPT_FOLLOWLOCATION, config->followlocation); - my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, config->unrestricted_auth); - my_setopt(curl, CURLOPT_TRANSFERTEXT, config->use_ascii); - my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd); - my_setopt_str(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd); - my_setopt(curl, CURLOPT_NOPROXY, config->noproxy); - my_setopt_str(curl, CURLOPT_RANGE, config->range); - my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer); - my_setopt(curl, CURLOPT_TIMEOUT, config->timeout); - - switch(config->httpreq) { - case HTTPREQ_SIMPLEPOST: - my_setopt_str(curl, CURLOPT_POSTFIELDS, config->postfields); - my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, config->postfieldsize); - break; - case HTTPREQ_POST: - my_setopt(curl, CURLOPT_HTTPPOST, config->httppost); - break; - default: - break; - } - my_setopt_str(curl, CURLOPT_REFERER, config->referer); - my_setopt(curl, CURLOPT_AUTOREFERER, config->autoreferer); - my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent); - my_setopt_str(curl, CURLOPT_FTPPORT, config->ftpport); - my_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, - config->low_speed_limit); - my_setopt(curl, CURLOPT_LOW_SPEED_TIME, config->low_speed_time); - my_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, - config->sendpersecond); - my_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, - config->recvpersecond); - my_setopt(curl, CURLOPT_RESUME_FROM_LARGE, - config->use_resume?config->resume_from:0); - my_setopt_str(curl, CURLOPT_COOKIE, config->cookie); - my_setopt(curl, CURLOPT_HTTPHEADER, config->headers); - my_setopt(curl, CURLOPT_SSLCERT, config->cert); - my_setopt_str(curl, CURLOPT_SSLCERTTYPE, config->cert_type); - my_setopt(curl, CURLOPT_SSLKEY, config->key); - my_setopt_str(curl, CURLOPT_SSLKEYTYPE, config->key_type); - my_setopt_str(curl, CURLOPT_KEYPASSWD, config->key_passwd); - - /* SSH private key uses the same command-line option as SSL private - key */ - my_setopt_str(curl, CURLOPT_SSH_PRIVATE_KEYFILE, config->key); - my_setopt_str(curl, CURLOPT_SSH_PUBLIC_KEYFILE, config->pubkey); - - /* SSH host key md5 checking allows us to fail if we are - * not talking to who we think we should - */ - my_setopt_str(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, - config->hostpubmd5); - - /* default to strict verifyhost */ - /* my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); */ - if(config->cacert || config->capath) { - if(config->cacert) - my_setopt_str(curl, CURLOPT_CAINFO, config->cacert); - - if(config->capath) - my_setopt_str(curl, CURLOPT_CAPATH, config->capath); - my_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE); - } - if(config->crlfile) - my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile); - if(config->insecure_ok) { - /* new stuff needed for libcurl 7.10 */ - my_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); - my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1); - } - else { - char *home = homedir(); - char *file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR); - if(home) - free(home); - - if(file) { - my_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file); - curl_free(file); - } - else { - /* Free the list of remaining URLs and globbed upload files - * to force curl to exit immediately - */ - if(urls) { - glob_cleanup(urls); - urls = NULL; - } - if(inglob) { - glob_cleanup(inglob); - inglob = NULL; - } - - res = CURLE_OUT_OF_MEMORY; - goto quit_urls; - } - } - - if(config->no_body || config->remote_time) { - /* no body or use remote time */ - my_setopt(curl, CURLOPT_FILETIME, TRUE); - } - - my_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs); - my_setopt(curl, CURLOPT_CRLF, config->crlf); - my_setopt(curl, CURLOPT_QUOTE, config->quote); - my_setopt(curl, CURLOPT_POSTQUOTE, config->postquote); - my_setopt(curl, CURLOPT_PREQUOTE, config->prequote); - my_setopt(curl, CURLOPT_HEADERDATA, - config->headerfile?&heads:NULL); - my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile); - /* cookie jar was added in 7.9 */ - if(config->cookiejar) - my_setopt_str(curl, CURLOPT_COOKIEJAR, config->cookiejar); - /* cookie session added in 7.9.7 */ - my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession); - - my_setopt(curl, CURLOPT_SSLVERSION, config->ssl_version); - my_setopt(curl, CURLOPT_TIMECONDITION, config->timecond); - my_setopt(curl, CURLOPT_TIMEVALUE, config->condtime); - my_setopt_str(curl, CURLOPT_CUSTOMREQUEST, config->customrequest); - my_setopt(curl, CURLOPT_STDERR, config->errors); - - /* three new ones in libcurl 7.3: */ - my_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel); - my_setopt_str(curl, CURLOPT_INTERFACE, config->iface); - my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel); - - progressbarinit(&progressbar, config); - if((config->progressmode == CURL_PROGRESS_BAR) && - !config->noprogress && !config->mute) { - /* we want the alternative style, then we have to implement it - ourselves! */ - my_setopt(curl, CURLOPT_PROGRESSFUNCTION, myprogress); - my_setopt(curl, CURLOPT_PROGRESSDATA, &progressbar); - } - - /* new in libcurl 7.6.2: */ - my_setopt(curl, CURLOPT_TELNETOPTIONS, config->telnet_options); - - /* new in libcurl 7.7: */ - my_setopt_str(curl, CURLOPT_RANDOM_FILE, config->random_file); - my_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file); - my_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout); - - if(config->cipher_list) - my_setopt_str(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list); - - if(config->httpversion) - my_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion); - - /* new in libcurl 7.9.2: */ - if(config->disable_epsv) - /* disable it */ - my_setopt(curl, CURLOPT_FTP_USE_EPSV, FALSE); - - /* new in libcurl 7.10.5 */ - if(config->disable_eprt) - /* disable it */ - my_setopt(curl, CURLOPT_FTP_USE_EPRT, FALSE); - - /* new in libcurl 7.10.6 (default is Basic) */ - if(config->authtype) - my_setopt(curl, CURLOPT_HTTPAUTH, config->authtype); - - if(config->tracetype != TRACE_NONE) { - my_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); - my_setopt(curl, CURLOPT_DEBUGDATA, config); - my_setopt(curl, CURLOPT_VERBOSE, TRUE); - } - - res = CURLE_OK; - - /* new in curl ?? */ - if(config->engine) { - res = my_setopt_str(curl, CURLOPT_SSLENGINE, config->engine); - my_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1); - } - - if(res != CURLE_OK) - goto show_error; - - /* new in curl 7.10 */ - my_setopt_str(curl, CURLOPT_ENCODING, - (config->encoding) ? "" : NULL); - - /* new in curl 7.10.7, extended in 7.19.4 but this only sets 0 or 1 */ - my_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, - config->ftp_create_dirs); - if(config->proxyanyauth) - my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY); - else if(config->proxynegotiate) - my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_GSSNEGOTIATE); - else if(config->proxyntlm) - my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM); - else if(config->proxydigest) - my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); - else if(config->proxybasic) - my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); - - /* new in curl 7.10.8 */ - if(config->max_filesize) - my_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, - config->max_filesize); - - if(4 == config->ip_version) - my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); - else if(6 == config->ip_version) - my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); - else - my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER); - - /* new in curl 7.15.5 */ - if(config->ftp_ssl_reqd) - my_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); - - /* new in curl 7.11.0 */ - else if(config->ftp_ssl) - my_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_TRY); - - /* new in curl 7.16.0 */ - else if(config->ftp_ssl_control) - my_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_CONTROL); - - /* new in curl 7.16.1 */ - if(config->ftp_ssl_ccc) - my_setopt(curl, CURLOPT_FTP_SSL_CCC, config->ftp_ssl_ccc_mode); - - /* new in curl 7.11.1, modified in 7.15.2 */ - if(config->socksproxy) { - my_setopt_str(curl, CURLOPT_PROXY, config->socksproxy); - my_setopt(curl, CURLOPT_PROXYTYPE, config->socksver); - } - -#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) - /* new in curl 7.19.4 */ - if(config->socks5_gssapi_service) - my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, - config->socks5_gssapi_service); - - /* new in curl 7.19.4 */ - if(config->socks5_gssapi_nec) - my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_NEC, - config->socks5_gssapi_nec); -#endif - /* curl 7.13.0 */ - my_setopt_str(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account); - - my_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl); - - /* curl 7.14.2 */ - my_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, config->ftp_skip_ip); - - /* curl 7.15.1 */ - my_setopt(curl, CURLOPT_FTP_FILEMETHOD, config->ftp_filemethod); - - /* curl 7.15.2 */ - if(config->localport) { - my_setopt(curl, CURLOPT_LOCALPORT, config->localport); - my_setopt_str(curl, CURLOPT_LOCALPORTRANGE, - config->localportrange); - } - - /* curl 7.15.5 */ - my_setopt_str(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, - config->ftp_alternative_to_user); - - /* curl 7.16.0 */ - if(config->disable_sessionid) - my_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, - !config->disable_sessionid); - - /* curl 7.16.2 */ - if(config->raw) { - my_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, FALSE); - my_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, FALSE); - } - - /* curl 7.17.1 */ - if(!config->nokeepalive) { - my_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockoptcallback); - my_setopt(curl, CURLOPT_SOCKOPTDATA, config); - } - - /* curl 7.19.1 (the 301 version existed in 7.18.2) */ - my_setopt(curl, CURLOPT_POSTREDIR, config->post301 | - (config->post302 ? CURL_REDIR_POST_302 : FALSE)); - - /* curl 7.20.0 */ - if(config->tftp_blksize) - my_setopt(curl, CURLOPT_TFTP_BLKSIZE, config->tftp_blksize); - - if(config->mail_from) - my_setopt_str(curl, CURLOPT_MAIL_FROM, config->mail_from); - - if(config->mail_rcpt) - my_setopt(curl, CURLOPT_MAIL_RCPT, config->mail_rcpt); - - /* curl 7.20.x */ - if(config->ftp_pret) - my_setopt(curl, CURLOPT_FTP_USE_PRET, TRUE); - - if(config->proto_present) - my_setopt(curl, CURLOPT_PROTOCOLS, config->proto); - if(config->proto_redir_present) - my_setopt(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir); - - if((urlnode->flags & GETOUT_USEREMOTE) - && config->content_disposition) { - my_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); - my_setopt(curl, CURLOPT_HEADERDATA, &outs); - } - - retry_numretries = config->req_retry; - - retrystart = cutil_tvnow(); - - for(;;) { - res = curl_easy_perform(curl); - if(!curl_slist_append(easycode, "ret = curl_easy_perform(hnd);")) { - res = CURLE_OUT_OF_MEMORY; - break; - } - - if(config->content_disposition && outs.stream && !config->mute && - outs.filename) - printf("curl: Saved to filename '%s'\n", outs.filename); - - /* if retry-max-time is non-zero, make sure we haven't exceeded the - time */ - if(retry_numretries && - (!config->retry_maxtime || - (cutil_tvdiff(cutil_tvnow(), retrystart)< - config->retry_maxtime*1000)) ) { - enum { - RETRY_NO, - RETRY_TIMEOUT, - RETRY_HTTP, - RETRY_FTP, - RETRY_LAST /* not used */ - } retry = RETRY_NO; - long response; - if(CURLE_OPERATION_TIMEDOUT == res) - /* retry timeout always */ - retry = RETRY_TIMEOUT; - else if((CURLE_OK == res) || - (config->failonerror && - (CURLE_HTTP_RETURNED_ERROR == res))) { - /* If it returned OK. _or_ failonerror was enabled and it - returned due to such an error, check for HTTP transient - errors to retry on. */ - char *this_url=NULL; - curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &this_url); - if(this_url && - checkprefix("http", this_url)) { - /* This was HTTP(S) */ - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); - - switch(response) { - case 500: /* Internal Server Error */ - case 502: /* Bad Gateway */ - case 503: /* Service Unavailable */ - case 504: /* Gateway Timeout */ - retry = RETRY_HTTP; - /* - * At this point, we have already written data to the output - * file (or terminal). If we write to a file, we must rewind - * or close/re-open the file so that the next attempt starts - * over from the beginning. - * - * TODO: similar action for the upload case. We might need - * to start over reading from a previous point if we have - * uploaded something when this was returned. - */ - break; - } - } - } /* if CURLE_OK */ - else if(res) { - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); - - if(response/100 == 4) - /* - * This is typically when the FTP server only allows a certain - * amount of users and we are not one of them. All 4xx codes - * are transient. - */ - retry = RETRY_FTP; - } - - if(retry) { - static const char * const m[]={ - NULL, "timeout", "HTTP error", "FTP error" - }; - warnf(config, "Transient problem: %s " - "Will retry in %ld seconds. " - "%ld retries left.\n", - m[retry], retry_sleep/1000, retry_numretries); - - go_sleep(retry_sleep); - retry_numretries--; - if(!config->retry_delay) { - retry_sleep *= 2; - if(retry_sleep > RETRY_SLEEP_MAX) - retry_sleep = RETRY_SLEEP_MAX; - } - if(outs.bytes && outs.filename) { - /* We have written data to a output file, we truncate file - */ - if(!config->mute) - fprintf(config->errors, "Throwing away %" - CURL_FORMAT_CURL_OFF_T " bytes\n", - outs.bytes); - fflush(outs.stream); - /* truncate file at the position where we started appending */ -#ifdef HAVE_FTRUNCATE - if(ftruncate( fileno(outs.stream), outs.init)) { - /* when truncate fails, we can't just append as then we'll - create something strange, bail out */ - if(!config->mute) - fprintf(config->errors, - "failed to truncate, exiting\n"); - break; - } - /* now seek to the end of the file, the position where we - just truncated the file in a large file-safe way */ - fseek(outs.stream, 0, SEEK_END); -#else - /* ftruncate is not available, so just reposition the file - to the location we would have truncated it. This won't - work properly with large files on 32-bit systems, but - most of those will have ftruncate. */ - fseek(outs.stream, (long)outs.init, SEEK_SET); -#endif - outs.bytes = 0; /* clear for next round */ - } - continue; - } - } /* if retry_numretries */ - - /* In all ordinary cases, just break out of loop here */ - retry_sleep = retry_sleep_default; - break; - - } - - if((config->progressmode == CURL_PROGRESS_BAR) && - progressbar.calls) - /* if the custom progress bar has been displayed, we output a - newline here */ - fputs("\n", progressbar.out); - - if(config->writeout) - ourWriteOut(curl, config->writeout); -#ifdef USE_ENVIRONMENT - if(config->writeenv) - ourWriteEnv(curl); -#endif - - show_error: - -#ifdef __VMS - if(is_vms_shell()) { - /* VMS DCL shell behavior */ - if(!config->showerror) { - vms_show = VMSSTS_HIDE; - } - } - else -#endif - { - if((res!=CURLE_OK) && config->showerror) { - fprintf(config->errors, "curl: (%d) %s\n", res, - errorbuffer[0]? errorbuffer: - curl_easy_strerror((CURLcode)res)); - if(CURLE_SSL_CACERT == res) { -#define CURL_CA_CERT_ERRORMSG1 \ - "More details here: http://curl.haxx.se/docs/sslcerts.html\n\n" \ - "curl performs SSL certificate verification by default, using a \"bundle\"\n" \ - " of Certificate Authority (CA) public keys (CA certs). If the default\n" \ - " bundle file isn't adequate, you can specify an alternate file\n" \ - " using the --cacert option.\n" - -#define CURL_CA_CERT_ERRORMSG2 \ - "If this HTTPS server uses a certificate signed by a CA represented in\n" \ - " the bundle, the certificate verification probably failed due to a\n" \ - " problem with the certificate (it might be expired, or the name might\n" \ - " not match the domain name in the URL).\n" \ - "If you'd like to turn off curl's verification of the certificate, use\n" \ - " the -k (or --insecure) option.\n" - - fprintf(config->errors, "%s%s", - CURL_CA_CERT_ERRORMSG1, - CURL_CA_CERT_ERRORMSG2 ); - } - } - } - - if(outfile && !curlx_strequal(outfile, "-") && outs.stream) { - int rc = fclose(outs.stream); - if(!res && rc) { - /* something went wrong in the writing process */ - res = CURLE_WRITE_ERROR; - fprintf(config->errors, "(%d) Failed writing body\n", res); - } - } - -#ifdef HAVE_UTIME - /* Important that we set the time _after_ the file has been - closed, as is done above here */ - if(config->remote_time && outs.filename) { - /* ask libcurl if we got a time. Pretty please */ - long filetime; - curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime); - if(filetime >= 0) { - struct utimbuf times; - times.actime = (time_t)filetime; - times.modtime = (time_t)filetime; - utime(outs.filename, ×); /* set the time we got */ - } - } -#endif -#ifdef __AMIGA__ - /* Set the url as comment for the file. (up to 80 chars are allowed) - */ - if( strlen(url) > 78 ) - url[79] = '\0'; - - SetComment( outs.filename, url); -#endif - - quit_urls: - if(url) - free(url); - - if(outfile) - free(outfile); - - if(infdopen) - close(infd); - - } /* loop to the next URL */ - - if(urls) { - /* cleanup memory used for URL globbing patterns */ - glob_cleanup(urls); - urls = NULL; - } - - if(uploadfile) - free(uploadfile); - - } /* loop to the next globbed upload file */ - - if(inglob) { - glob_cleanup(inglob); - inglob = NULL; - } - - if(outfiles) - free(outfiles); - - /* empty this urlnode struct */ - if(urlnode->url) - free(urlnode->url); - if(urlnode->outfile) - free(urlnode->outfile); - if(urlnode->infile) - free(urlnode->infile); - - /* move on to the next URL */ - nextnode=urlnode->next; - free(urlnode); /* free the node */ - urlnode = nextnode; - - } /* while-loop through all URLs */ - - quit_curl: - if(httpgetfields) - free(httpgetfields); - - if(config->engine) - free(config->engine); - - /* cleanup the curl handle! */ - curl_easy_cleanup(curl); - config->easy = NULL; /* cleanup now */ - if(easycode) - curl_slist_append(easycode, "curl_easy_cleanup(hnd);"); - - if(heads.stream && (heads.stream != stdout)) - fclose(heads.stream); - - if(allocuseragent) - free(config->useragent); - - if(config->trace_fopened && config->trace_stream) - fclose(config->trace_stream); - - /* Dump the libcurl code if previously enabled. - NOTE: that this function relies on config->errors amongst other things - so not everything can be closed and cleaned before this is called */ - dumpeasycode(config); - - if(config->errors_fopened) - fclose(config->errors); - - main_free(); /* cleanup */ - - return res; -} - -/* Ensure that file descriptors 0, 1 and 2 (stdin, stdout, stderr) are - open before starting to run. Otherwise, the first three network - sockets opened by curl could be used for input sources, downloaded data - or error logs as they will effectively be stdin, stdout and/or stderr. -*/ -static void checkfds(void) -{ -#ifdef HAVE_PIPE - int fd[2] = { STDIN_FILENO, STDIN_FILENO }; - while( fd[0] == STDIN_FILENO || - fd[0] == STDOUT_FILENO || - fd[0] == STDERR_FILENO || - fd[1] == STDIN_FILENO || - fd[1] == STDOUT_FILENO || - fd[1] == STDERR_FILENO ) - if(pipe(fd) < 0) - return; /* Out of handles. This isn't really a big problem now, but - will be when we try to create a socket later. */ - close(fd[0]); - close(fd[1]); -#endif -} - - - -int main(int argc, char *argv[]) -{ - int res; - struct Configurable config; - - memset(&config, 0, sizeof(struct Configurable)); - - config.errors = stderr; /* default errors to stderr */ - - checkfds(); - - res = operate(&config, argc, argv); -#ifdef __SYMBIAN32__ - if(config.showerror) - pressanykey(); -#endif - free_config_fields(&config); - -#ifdef __NOVELL_LIBC__ - if(getenv("_IN_NETWARE_BASH_") == NULL) - pressanykey(); -#endif -#ifdef __VMS - vms_special_exit(res, vms_show); -#else - return res; -#endif -} - -/* - * Reads a line from the given file, ensuring is NUL terminated. - * The pointer must be freed by the caller. - * NULL is returned on an out of memory condition. - */ -static char *my_get_line(FILE *fp) -{ - char buf[4096]; - char *nl = NULL; - char *retval = NULL; - - do { - if(NULL == fgets(buf, sizeof(buf), fp)) - break; - if(NULL == retval) { - retval = strdup(buf); - if(!retval) - return NULL; - } - else { - char *ptr; - ptr = realloc(retval, strlen(retval) + strlen(buf) + 1); - if(NULL == ptr) { - free(retval); - return NULL; - } - retval = ptr; - strcat(retval, buf); - } - } - while(NULL == (nl = strchr(retval, '\n'))); - - if(NULL != nl) - *nl = '\0'; - - return retval; -} - -static void show_dir_errno(FILE *errors, const char *name) -{ - switch (ERRNO) { -#ifdef EACCES - case EACCES: - fprintf(errors,"You don't have permission to create %s.\n", name); - break; -#endif -#ifdef ENAMETOOLONG - case ENAMETOOLONG: - fprintf(errors,"The directory name %s is too long.\n", name); - break; -#endif -#ifdef EROFS - case EROFS: - fprintf(errors,"%s resides on a read-only file system.\n", name); - break; -#endif -#ifdef ENOSPC - case ENOSPC: - fprintf(errors,"No space left on the file system that will " - "contain the directory %s.\n", name); - break; -#endif -#ifdef EDQUOT - case EDQUOT: - fprintf(errors,"Cannot create directory %s because you " - "exceeded your quota.\n", name); - break; -#endif - default : - fprintf(errors,"Error creating directory %s.\n", name); - break; - } -} - -/* Create the needed directory hierarchy recursively in order to save - multi-GETs in file output, ie: - curl "http://my.site/dir[1-5]/file[1-5].txt" -o "dir#1/file#2.txt" - should create all the dir* automagically -*/ -static int create_dir_hierarchy(const char *outfile, FILE *errors) -{ - char *tempdir; - char *tempdir2; - char *outdup; - char *dirbuildup; - int result=0; - - outdup = strdup(outfile); - if(!outdup) - return -1; - - dirbuildup = malloc(sizeof(char) * strlen(outfile)); - if(!dirbuildup) { - free(outdup); - return -1; - } - dirbuildup[0] = '\0'; - - tempdir = strtok(outdup, DIR_CHAR); - - while(tempdir != NULL) { - tempdir2 = strtok(NULL, DIR_CHAR); - /* since strtok returns a token for the last word even - if not ending with DIR_CHAR, we need to prune it */ - if(tempdir2 != NULL) { - size_t dlen = strlen(dirbuildup); - if(dlen) - sprintf(&dirbuildup[dlen], "%s%s", DIR_CHAR, tempdir); - else { - if(0 != strncmp(outdup, DIR_CHAR, 1)) - strcpy(dirbuildup, tempdir); - else - sprintf(dirbuildup, "%s%s", DIR_CHAR, tempdir); - } - if(access(dirbuildup, F_OK) == -1) { - result = mkdir(dirbuildup,(mode_t)0000750); - if(-1 == result) { - show_dir_errno(errors, dirbuildup); - break; /* get out of loop */ - } - } - } - tempdir = tempdir2; - } - free(dirbuildup); - free(outdup); - - return result; /* 0 is fine, -1 is badness */ -} - -#if defined(MSDOS) || defined(WIN32) - -#ifndef HAVE_BASENAME -/* basename() returns a pointer to the last component of a pathname. - * Ripped from lib/formdata.c. - */ -static char *Curl_basename(char *path) -{ - /* Ignore all the details above for now and make a quick and simple - implementaion here */ - char *s1; - char *s2; - - s1=strrchr(path, '/'); - s2=strrchr(path, '\\'); - - if(s1 && s2) { - path = (s1 > s2? s1 : s2)+1; - } - else if(s1) - path = s1 + 1; - else if(s2) - path = s2 + 1; - - return path; -} -#define basename(x) Curl_basename((x)) -#endif /* HAVE_BASENAME */ - -/* The following functions are taken with modification from the DJGPP - * port of tar 1.12. They use algorithms originally from DJTAR. */ - -static const char * -msdosify (const char *file_name) -{ - static char dos_name[PATH_MAX]; - static const char illegal_chars_dos[] = ".+, ;=[]" /* illegal in DOS */ - "|<>\\\":?*"; /* illegal in DOS & W95 */ - static const char *illegal_chars_w95 = &illegal_chars_dos[8]; - int idx, dot_idx; - const char *s = file_name; - char *d = dos_name; - const char * const dlimit = dos_name + sizeof(dos_name) - 1; - const char *illegal_aliens = illegal_chars_dos; - size_t len = sizeof (illegal_chars_dos) - 1; - - /* Support for Windows 9X VFAT systems, when available. */ - if(_use_lfn (file_name)) { - illegal_aliens = illegal_chars_w95; - len -= (illegal_chars_w95 - illegal_chars_dos); - } - - /* Get past the drive letter, if any. */ - if(s[0] >= 'A' && s[0] <= 'z' && s[1] == ':') { - *d++ = *s++; - *d++ = *s++; - } - - for(idx = 0, dot_idx = -1; *s && d < dlimit; s++, d++) { - if(memchr (illegal_aliens, *s, len)) { - /* Dots are special: DOS doesn't allow them as the leading character, - and a file name cannot have more than a single dot. We leave the - first non-leading dot alone, unless it comes too close to the - beginning of the name: we want sh.lex.c to become sh_lex.c, not - sh.lex-c. */ - if(*s == '.') { - if(idx == 0 && (s[1] == '/' || (s[1] == '.' && s[2] == '/'))) { - /* Copy "./" and "../" verbatim. */ - *d++ = *s++; - if(*s == '.') - *d++ = *s++; - *d = *s; - } - else if(idx == 0) - *d = '_'; - else if(dot_idx >= 0) { - if(dot_idx < 5) { /* 5 is a heuristic ad-hoc'ery */ - d[dot_idx - idx] = '_'; /* replace previous dot */ - *d = '.'; - } - else - *d = '-'; - } - else - *d = '.'; - - if(*s == '.') - dot_idx = idx; - } - else if(*s == '+' && s[1] == '+') { - if(idx - 2 == dot_idx) { /* .c++, .h++ etc. */ - *d++ = 'x'; - *d = 'x'; - } - else { - /* libg++ etc. */ - memcpy (d, "plus", 4); - d += 3; - } - s++; - idx++; - } - else - *d = '_'; - } - else - *d = *s; - if(*s == '/') { - idx = 0; - dot_idx = -1; - } - else - idx++; - } - - *d = '\0'; - return dos_name; -} - -static char * -rename_if_dos_device_name (char *file_name) -{ - /* We could have a file whose name is a device on MS-DOS. Trying to - * retrieve such a file would fail at best and wedge us at worst. We need - * to rename such files. */ - char *base; - struct_stat st_buf; - char fname[PATH_MAX]; - - strncpy(fname, file_name, PATH_MAX-1); - fname[PATH_MAX-1] = 0; - base = basename(fname); - if(((stat(base, &st_buf)) == 0) && (S_ISCHR(st_buf.st_mode))) { - size_t blen = strlen (base); - - if(strlen(fname) >= PATH_MAX-1) { - /* Make room for the '_' */ - blen--; - base[blen] = 0; - } - /* Prepend a '_'. */ - memmove (base + 1, base, blen + 1); - base[0] = '_'; - strcpy (file_name, fname); - } - return file_name; -} - -/* Replace bad characters in the file name before using it. - * fn will always be freed before return - * The returned pointer must be freed by the caller if not NULL - */ -static char *sanitize_dos_name(char *fn) -{ - char tmpfn[PATH_MAX]; - if(strlen(fn) >= PATH_MAX) - fn[PATH_MAX-1]=0; /* truncate it */ - strcpy(tmpfn, msdosify(fn)); - free(fn); - return strdup(rename_if_dos_device_name(tmpfn)); -} -#endif /* MSDOS || WIN32 */ diff --git a/src/makefile.amiga b/src/makefile.amiga index dc98481..25449a6 100644 --- a/src/makefile.amiga +++ b/src/makefile.amiga @@ -14,18 +14,16 @@ MANPAGE = ../docs/curl.1 README = ../docs/MANUAL MKHELP = ../src/mkhelp.pl -top_srcdir = .. - include Makefile.inc -OBJS = $(CURL_CFILES:.c=.o) $(CURLX_ONES:.c=.o) +OBJS = $(CURL_CFILES:.c=.o) $(CURLX_CFILES:.c=.o) -all: hugehelp.c $(OBJS) +all: tool_hugehelp.c $(OBJS) $(CC) $(CFLAGS) -o cURL $(OBJS) $(LIBS) -Wl,-Map,cURL.map,--cref -hugehelp.c: $(README) $(MANPAGE) mkhelp.pl - rm -f hugehelp.c - /bin/nroff -man $(MANPAGE) | /bin/perl $(MKHELP) -c $(README) > hugehelp.c +tool_hugehelp.c: $(README) $(MANPAGE) mkhelp.pl + rm -f tool_hugehelp.c + /bin/nroff -man $(MANPAGE) | /bin/perl $(MKHELP) -c $(README) > tool_hugehelp.c install: $(INSTALL) -c cURL /c/cURL diff --git a/src/makefile.dj b/src/makefile.dj index fc3ae16..d342859 100644 --- a/src/makefile.dj +++ b/src/makefile.dj @@ -1,12 +1,10 @@ # -# # Adapted for djgpp2 / Watt-32 / DOS by -# Gisle Vanem <giva@bgnett.no> +# Gisle Vanem <gvanem@broadpark.no> # -DEPEND_PREREQ = curl_config.h hugehelp.c +DEPEND_PREREQ = # tool_hugehelp.c -top_srcdir = .. TOPDIR = .. include ../packages/DOS/common.dj @@ -38,31 +36,23 @@ CFLAGS += -DUSE_ENVIRONMENT PROGRAM = curl.exe OBJECTS += $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o)) -all: $(OBJ_DIR) curl_config.h $(PROGRAM) +all: $(OBJ_DIR) $(PROGRAM) @echo Welcome to cURL $(PROGRAM): $(OBJECTS) ../lib/libcurl.a $(CC) -o $@ $^ $(LDFLAGS) $(EX_LIBS) -curl_config.h: -ifeq ($(IS_UNIX_SHELL),1) - @echo '#include "../lib/config.dos"' > $@ -else - @echo #include "../lib/config.dos" > $@ -endif - # # groff 1.18+ requires "-P -c" # -hugehelp.c: ../docs/MANUAL ../docs/curl.1 mkhelp.pl +tool_hugehelp.c: ../docs/MANUAL ../docs/curl.1 mkhelp.pl groff -Tascii -man ../docs/curl.1 | \ perl -w mkhelp.pl ../docs/MANUAL > $@ # clean generated files # genclean: - - $(DELETE) curl_config.h - - $(DELETE) hugehelp.c + - $(DELETE) tool_hugehelp.c # clean object files and subdir # diff --git a/src/mkhelp.pl b/src/mkhelp.pl index 03c884f..088a09a 100644 --- a/src/mkhelp.pl +++ b/src/mkhelp.pl @@ -1,4 +1,25 @@ #!/usr/local/bin/perl +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +########################################################################### # Yeah, I know, probably 1000 other persons already wrote a script like # this, but I'll tell ya: @@ -33,6 +54,9 @@ while (<STDIN>) { # this should be removed: $line =~ s/(.|_)//g; + # remove trailing CR from line. msysgit checks out files as line+CRLF + $line =~ s/\r$//; + if($line =~ /^([ \t]*\n|curl)/i) { # cut off headers and empty lines $wline++; # count number of cut off lines @@ -40,7 +64,7 @@ while (<STDIN>) { } my $text = $line; - $text =~ s/^\s+//g; # cut off preceeding... + $text =~ s/^\s+//g; # cut off preceding... $text =~ s/\s+$//g; # and trailing whitespaces $tlen = length($text); @@ -69,7 +93,12 @@ open(READ, "<$README") || die "couldn't read the README infile $README"; while(<READ>) { - push @out, $_; + my $line = $_; + + # remove trailing CR from line. msysgit checks out files as line+CRLF + $line =~ s/\r$//; + + push @out, $line; } close(READ); @@ -112,16 +141,14 @@ print <<HEAD * NEVER EVER edit this manually, fix the mkhelp.pl script instead! * Generation time: $now */ -#include "setup.h" #ifdef USE_MANUAL -#include "hugehelp.h" -#include <stdio.h> +#include "tool_hugehelp.h" HEAD ; if($c) { print <<HEAD -#include <stdlib.h> #include <zlib.h> +#include "memdebug.h" /* keep this as LAST include */ static const unsigned char hugehelpgz[] = { /* This mumbo-jumbo is the huge help text compressed with gzip. Thanks to this operation, the size of this data shrunk from $gzip @@ -146,6 +173,17 @@ HEAD print <<EOF #define BUF_SIZE 0x10000 +static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size) +{ + (void) opaque; + /* not a typo, keep it calloc() */ + return (voidpf) calloc(items, size); +} +static void zfree_func(voidpf opaque, voidpf ptr) +{ + (void) opaque; + free(ptr); +} /* Decompress and send to stdout a gzip-compressed buffer */ void hugehelp(void) { @@ -158,11 +196,11 @@ void hugehelp(void) return; headerlen = 10; + memset(&z, 0, sizeof(z_stream)); + z.zalloc = (alloc_func)zalloc_func; + z.zfree = (free_func)zfree_func; z.avail_in = (unsigned int)(sizeof(hugehelpgz) - headerlen); z.next_in = (unsigned char *)hugehelpgz + headerlen; - z.zalloc = (alloc_func)Z_NULL; - z.zfree = (free_func)Z_NULL; - z.opaque = 0; if (inflateInit2(&z, -MAX_WBITS) != Z_OK) return; @@ -226,6 +264,10 @@ foot(); sub foot { print <<FOOT +#else /* !USE_MANUAL */ +/* built-in manual is disabled, blank function */ +#include "tool_hugehelp.h" +void hugehelp(void) {} #endif /* USE_MANUAL */ FOOT ; diff --git a/src/setup.h b/src/setup.h deleted file mode 100644 index 0d2a99f..0000000 --- a/src/setup.h +++ /dev/null @@ -1,223 +0,0 @@ -#ifndef HEADER_CURL_SRC_SETUP_H -#define HEADER_CURL_SRC_SETUP_H -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -#define CURL_NO_OLDIES - -/* - * Define WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && !defined(__SYMBIAN32__) -#define WIN32 -#endif - -/* - * Include configuration script results or hand-crafted - * configuration file for platforms which lack config tool. - */ - -#ifdef HAVE_CONFIG_H -#include "curl_config.h" -#else - -#ifdef WIN32 -#include "config-win32.h" -#endif - -#if defined(macintosh) && defined(__MRC__) -# include "config-mac.h" -#endif - -#ifdef __riscos__ -#include "config-riscos.h" -#endif - -#ifdef __AMIGA__ -#include "config-amigaos.h" -#endif - -#ifdef __SYMBIAN32__ -#include "config-symbian.h" -#endif - -#ifdef TPF -#include "config-tpf.h" -#endif - -#endif /* HAVE_CONFIG_H */ - -/* - * AIX 4.3 and newer needs _THREAD_SAFE defined to build - * proper reentrant code. Others may also need it. - */ - -#ifdef NEED_THREAD_SAFE -# ifndef _THREAD_SAFE -# define _THREAD_SAFE -# endif -#endif - -/* - * Tru64 needs _REENTRANT set for a few function prototypes and - * things to appear in the system header files. Unixware needs it - * to build proper reentrant code. Others may also need it. - */ - -#ifdef NEED_REENTRANT -# ifndef _REENTRANT -# define _REENTRANT -# endif -#endif - -/* - * Include header files for windows builds before redefining anything. - * Use this preproessor block only to include or exclude windows.h, - * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs - * to any other further and independent block. Under Cygwin things work - * just as under linux (e.g. <sys/socket.h>) and the winsock headers should - * never be included when __CYGWIN__ is defined. configure script takes - * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H, - * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined. - */ - -#ifdef HAVE_WINDOWS_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include <windows.h> -# ifdef HAVE_WINSOCK2_H -# include <winsock2.h> -# ifdef HAVE_WS2TCPIP_H -# include <ws2tcpip.h> -# endif -# else -# ifdef HAVE_WINSOCK_H -# include <winsock.h> -# endif -# endif -#endif - -/* - * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else - * define USE_WINSOCK to 1 if we have and use WINSOCK API, else - * undefine USE_WINSOCK. - */ - -#undef USE_WINSOCK - -#ifdef HAVE_WINSOCK2_H -# define USE_WINSOCK 2 -#else -# ifdef HAVE_WINSOCK_H -# define USE_WINSOCK 1 -# endif -#endif - -#ifdef TPF -# include <sys/socket.h> - /* change which select is used for the curl command line tool */ -# define select(a,b,c,d,e) tpf_select_bsd(a,b,c,d,e) - /* and turn off the progress meter */ -# define CONF_DEFAULT (0|CONF_NOPROGRESS) -#endif - -#include <stdio.h> - -#ifdef __TANDEM -#include <floss.h> -#endif - - -#ifndef OS -#define OS "unknown" -#endif - -#if !defined(fileno) && !defined(WIN32) /* sunos 4 have this as a macro! */ -int fileno( FILE *stream); -#endif - -#ifdef WIN32 -#define DIR_CHAR "\\" -#define DOT_CHAR "_" -#else -#ifdef __EMX__ -/* 20000318 mgs - * OS/2 supports leading dots in filenames if the volume is formatted - * with JFS or HPFS. */ -#define DIR_CHAR "\\" -#define DOT_CHAR "." -#else - -#ifdef DJGPP -#include <tcp.h> -#ifdef word -#undef word -#endif -#define DIR_CHAR "/" -#define DOT_CHAR "_" -#else - -#define DIR_CHAR "/" -#define DOT_CHAR "." - -#endif /* !DJGPP */ -#endif /* !__EMX__ */ -#endif /* !WIN32 */ - -#ifdef __riscos__ -#define USE_ENVIRONMENT -#endif - -#ifdef __BEOS__ -#define typedef_bool -#endif - -#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) -#include <sys/timeval.h> -#endif - -#ifndef UNPRINTABLE_CHAR -/* define what to use for unprintable characters */ -#define UNPRINTABLE_CHAR '.' -#endif - -#ifndef HAVE_STRDUP -#include "strdup.h" -#define strdup(ptr) curlx_strdup(ptr) -#endif - -/* Define S_ISREG if not defined by system headers, f.e. MSVC */ -#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG) -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif - -/* - * Include macros and defines that should only be processed once. - */ - -#ifndef __SETUP_ONCE_H -#include "setup_once.h" -#endif - -#endif /* HEADER_CURL_SRC_SETUP_H */ diff --git a/src/tool_binmode.c b/src/tool_binmode.c new file mode 100644 index 0000000..5495ba4 --- /dev/null +++ b/src/tool_binmode.c @@ -0,0 +1,52 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef HAVE_SETMODE + +#ifdef HAVE_IO_H +# include <io.h> +#endif + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#include "tool_binmode.h" + +#include "memdebug.h" /* keep this as LAST include */ + +void set_binmode(FILE *stream) +{ +#ifdef O_BINARY +# ifdef __HIGHC__ + _setmode(stream, O_BINARY); +# else + (void)setmode(fileno(stream), O_BINARY); +# endif +#else + (void)stream; +#endif +} + +#endif /* HAVE_SETMODE */ + diff --git a/src/tool_binmode.h b/src/tool_binmode.h new file mode 100644 index 0000000..b5cb08d --- /dev/null +++ b/src/tool_binmode.h @@ -0,0 +1,37 @@ +#ifndef HEADER_CURL_TOOL_BINMODE_H +#define HEADER_CURL_TOOL_BINMODE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef HAVE_SETMODE + +void set_binmode(FILE *stream); + +#else + +#define set_binmode(x) Curl_nop_stmt + +#endif /* HAVE_SETMODE */ + +#endif /* HEADER_CURL_TOOL_BINMODE_H */ + diff --git a/src/tool_bname.c b/src/tool_bname.c new file mode 100644 index 0000000..2778305 --- /dev/null +++ b/src/tool_bname.c @@ -0,0 +1,50 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "tool_bname.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifndef HAVE_BASENAME + +char *tool_basename(char *path) +{ + char *s1; + char *s2; + + s1 = strrchr(path, '/'); + s2 = strrchr(path, '\\'); + + if(s1 && s2) { + path = (s1 > s2) ? s1 + 1 : s2 + 1; + } + else if(s1) + path = s1 + 1; + else if(s2) + path = s2 + 1; + + return path; +} + +#endif /* HAVE_BASENAME */ + diff --git a/src/tool_bname.h b/src/tool_bname.h new file mode 100644 index 0000000..69cf92c --- /dev/null +++ b/src/tool_bname.h @@ -0,0 +1,35 @@ +#ifndef HEADER_CURL_TOOL_BNAME_H +#define HEADER_CURL_TOOL_BNAME_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifndef HAVE_BASENAME + +char *tool_basename(char *path); + +#define basename(x) tool_basename((x)) + +#endif /* HAVE_BASENAME */ + +#endif /* HEADER_CURL_TOOL_BNAME_H */ + diff --git a/src/tool_cb_dbg.c b/src/tool_cb_dbg.c new file mode 100644 index 0000000..f527146 --- /dev/null +++ b/src/tool_cb_dbg.c @@ -0,0 +1,275 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_msgs.h" +#include "tool_cb_dbg.h" +#include "tool_util.h" + +#include "memdebug.h" /* keep this as LAST include */ + +static void dump(const char *timebuf, const char *text, + FILE *stream, const unsigned char *ptr, size_t size, + trace tracetype, curl_infotype infotype); + +/* +** callback for CURLOPT_DEBUGFUNCTION +*/ + +int tool_debug_cb(CURL *handle, curl_infotype type, + unsigned char *data, size_t size, + void *userdata) +{ + struct OperationConfig *operation = userdata; + struct GlobalConfig *config = operation->global; + FILE *output = config->errors; + const char *text; + struct timeval tv; + struct tm *now; + char timebuf[20]; + time_t secs; + static time_t epoch_offset; + static int known_offset; + + (void)handle; /* not used */ + + if(config->tracetime) { + tv = tvnow(); + if(!known_offset) { + epoch_offset = time(NULL) - tv.tv_sec; + known_offset = 1; + } + secs = epoch_offset + tv.tv_sec; + now = localtime(&secs); /* not thread safe but we don't care */ + snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ", + now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec); + } + else + timebuf[0] = 0; + + if(!config->trace_stream) { + /* open for append */ + if(curlx_strequal("-", config->trace_dump)) + config->trace_stream = stdout; + else if(curlx_strequal("%", config->trace_dump)) + /* Ok, this is somewhat hackish but we do it undocumented for now */ + config->trace_stream = config->errors; /* aka stderr */ + else { + config->trace_stream = fopen(config->trace_dump, FOPEN_WRITETEXT); + config->trace_fopened = TRUE; + } + } + + if(config->trace_stream) + output = config->trace_stream; + + if(!output) { + warnf(config, "Failed to create/open output"); + return 0; + } + + if(config->tracetype == TRACE_PLAIN) { + /* + * This is the trace look that is similar to what libcurl makes on its + * own. + */ + static const char * const s_infotype[] = { + "*", "<", ">", "{", "}", "{", "}" + }; + size_t i; + size_t st = 0; + static bool newl = FALSE; + static bool traced_data = FALSE; + + switch(type) { + case CURLINFO_HEADER_OUT: + if(size > 0) { + for(i = 0; i < size - 1; i++) { + if(data[i] == '\n') { /* LF */ + if(!newl) { + fprintf(output, "%s%s ", timebuf, s_infotype[type]); + } + (void)fwrite(data + st, i - st + 1, 1, output); + st = i + 1; + newl = FALSE; + } + } + if(!newl) + fprintf(output, "%s%s ", timebuf, s_infotype[type]); + (void)fwrite(data + st, i - st + 1, 1, output); + } + newl = (size && (data[size - 1] != '\n')) ? TRUE : FALSE; + traced_data = FALSE; + break; + case CURLINFO_TEXT: + case CURLINFO_HEADER_IN: + if(!newl) + fprintf(output, "%s%s ", timebuf, s_infotype[type]); + (void)fwrite(data, size, 1, output); + newl = (size && (data[size - 1] != '\n')) ? TRUE : FALSE; + traced_data = FALSE; + break; + case CURLINFO_DATA_OUT: + case CURLINFO_DATA_IN: + case CURLINFO_SSL_DATA_IN: + case CURLINFO_SSL_DATA_OUT: + if(!traced_data) { + /* if the data is output to a tty and we're sending this debug trace + to stderr or stdout, we don't display the alert about the data not + being shown as the data _is_ shown then just not via this + function */ + if(!config->isatty || ((output != stderr) && (output != stdout))) { + if(!newl) + fprintf(output, "%s%s ", timebuf, s_infotype[type]); + fprintf(output, "[%zd bytes data]\n", size); + newl = FALSE; + traced_data = TRUE; + } + } + break; + default: /* nada */ + newl = FALSE; + traced_data = FALSE; + break; + } + + return 0; + } + +#ifdef CURL_DOES_CONVERSIONS + /* Special processing is needed for CURLINFO_HEADER_OUT blocks + * if they contain both headers and data (separated by CRLFCRLF). + * We dump the header text and then switch type to CURLINFO_DATA_OUT. + */ + if((type == CURLINFO_HEADER_OUT) && (size > 4)) { + size_t i; + for(i = 0; i < size - 4; i++) { + if(memcmp(&data[i], "\r\n\r\n", 4) == 0) { + /* dump everything through the CRLFCRLF as a sent header */ + text = "=> Send header"; + dump(timebuf, text, output, data, i + 4, config->tracetype, type); + data += i + 3; + size -= i + 4; + type = CURLINFO_DATA_OUT; + data += 1; + break; + } + } + } +#endif /* CURL_DOES_CONVERSIONS */ + + switch (type) { + case CURLINFO_TEXT: + fprintf(output, "%s== Info: %s", timebuf, data); + default: /* in case a new one is introduced to shock us */ + return 0; + + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + } + + dump(timebuf, text, output, data, size, config->tracetype, type); + return 0; +} + +static void dump(const char *timebuf, const char *text, + FILE *stream, const unsigned char *ptr, size_t size, + trace tracetype, curl_infotype infotype) +{ + size_t i; + size_t c; + + unsigned int width = 0x10; + + if(tracetype == TRACE_ASCII) + /* without the hex output, we can fit more on screen */ + width = 0x40; + + fprintf(stream, "%s%s, %zd bytes (0x%zx)\n", timebuf, text, size, size); + + for(i = 0; i < size; i += width) { + + fprintf(stream, "%04zx: ", i); + + if(tracetype == TRACE_BIN) { + /* hex not disabled, show it */ + for(c = 0; c < width; c++) + if(i+c < size) + fprintf(stream, "%02x ", ptr[i+c]); + else + fputs(" ", stream); + } + + for(c = 0; (c < width) && (i+c < size); c++) { + /* check for 0D0A; if found, skip past and start a new line of output */ + if((tracetype == TRACE_ASCII) && + (i+c+1 < size) && (ptr[i+c] == 0x0D) && (ptr[i+c+1] == 0x0A)) { + i += (c+2-width); + break; + } +#ifdef CURL_DOES_CONVERSIONS + /* repeat the 0D0A check above but use the host encoding for CRLF */ + if((tracetype == TRACE_ASCII) && + (i+c+1 < size) && (ptr[i+c] == '\r') && (ptr[i+c+1] == '\n')) { + i += (c+2-width); + break; + } + /* convert to host encoding and print this character */ + fprintf(stream, "%c", convert_char(infotype, ptr[i+c])); +#else + (void)infotype; + fprintf(stream, "%c", ((ptr[i+c] >= 0x20) && (ptr[i+c] < 0x80)) ? + ptr[i+c] : UNPRINTABLE_CHAR); +#endif /* CURL_DOES_CONVERSIONS */ + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if((tracetype == TRACE_ASCII) && + (i+c+2 < size) && (ptr[i+c+1] == 0x0D) && (ptr[i+c+2] == 0x0A)) { + i += (c+3-width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + diff --git a/src/tool_cb_dbg.h b/src/tool_cb_dbg.h new file mode 100644 index 0000000..d0ed7b0 --- /dev/null +++ b/src/tool_cb_dbg.h @@ -0,0 +1,35 @@ +#ifndef HEADER_CURL_TOOL_CB_DBG_H +#define HEADER_CURL_TOOL_CB_DBG_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* +** callback for CURLOPT_DEBUGFUNCTION +*/ + +int tool_debug_cb(CURL *handle, curl_infotype type, + unsigned char *data, size_t size, + void *userdata); + +#endif /* HEADER_CURL_TOOL_CB_DBG_H */ + diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c new file mode 100644 index 0000000..af9bb87 --- /dev/null +++ b/src/tool_cb_hdr.c @@ -0,0 +1,226 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_msgs.h" +#include "tool_cb_hdr.h" + +#include "memdebug.h" /* keep this as LAST include */ + +static char *parse_filename(const char *ptr, size_t len); + +/* +** callback for CURLOPT_HEADERFUNCTION +*/ + +size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata) +{ + struct HdrCbData *hdrcbdata = userdata; + struct OutStruct *outs = hdrcbdata->outs; + struct OutStruct *heads = hdrcbdata->heads; + const char *str = ptr; + const size_t cb = size * nmemb; + const char *end = (char*)ptr + cb; + + /* + * Once that libcurl has called back tool_header_cb() the returned value + * is checked against the amount that was intended to be written, if + * it does not match then it fails with CURLE_WRITE_ERROR. So at this + * point returning a value different from sz*nmemb indicates failure. + */ + size_t failure = (size * nmemb) ? 0 : 1; + + if(!heads->config) + return failure; + +#ifdef DEBUGBUILD + if(size * nmemb > (size_t)CURL_MAX_HTTP_HEADER) { + warnf(heads->config->global, "Header data exceeds single call write " + "limit!\n"); + return failure; + } +#endif + + /* + * Write header data when curl option --dump-header (-D) is given. + */ + + if(heads->config->headerfile && heads->stream) { + size_t rc = fwrite(ptr, size, nmemb, heads->stream); + if(rc != cb) + return rc; + } + + /* + * This callback sets the filename where output shall be written when + * curl options --remote-name (-O) and --remote-header-name (-J) have + * been simultaneously given and additionally server returns an HTTP + * Content-Disposition header specifying a filename property. + */ + + if(hdrcbdata->honor_cd_filename && + (cb > 20) && checkprefix("Content-disposition:", str)) { + const char *p = str + 20; + + /* look for the 'filename=' parameter + (encoded filenames (*=) are not supported) */ + for(;;) { + char *filename; + size_t len; + + while(*p && (p < end) && !ISALPHA(*p)) + p++; + if(p > end - 9) + break; + + if(memcmp(p, "filename=", 9)) { + /* no match, find next parameter */ + while((p < end) && (*p != ';')) + p++; + continue; + } + p += 9; + + /* this expression below typecasts 'cb' only to avoid + warning: signed and unsigned type in conditional expression + */ + len = (ssize_t)cb - (p - str); + filename = parse_filename(p, len); + if(filename) { + outs->filename = filename; + outs->alloc_filename = TRUE; + outs->is_cd_filename = TRUE; + outs->s_isreg = TRUE; + outs->fopened = FALSE; + outs->stream = NULL; + hdrcbdata->honor_cd_filename = FALSE; + break; + } + else + return failure; + } + } + + return cb; +} + +/* + * Copies a file name part and returns an ALLOCATED data buffer. + */ +static char *parse_filename(const char *ptr, size_t len) +{ + char *copy; + char *p; + char *q; + char stop = '\0'; + + /* simple implementation of strndup() */ + copy = malloc(len+1); + if(!copy) + return NULL; + memcpy(copy, ptr, len); + copy[len] = '\0'; + + p = copy; + if(*p == '\'' || *p == '"') { + /* store the starting quote */ + stop = *p; + p++; + } + else + stop = ';'; + + /* if the filename contains a path, only use filename portion */ + q = strrchr(copy, '/'); + if(q) { + p = q + 1; + if(!*p) { + Curl_safefree(copy); + return NULL; + } + } + + /* If the filename contains a backslash, only use filename portion. The idea + is that even systems that don't handle backslashes as path separators + probably want the path removed for convenience. */ + q = strrchr(p, '\\'); + if(q) { + p = q + 1; + if(!*p) { + Curl_safefree(copy); + return NULL; + } + } + + /* scan for the end letter and stop there */ + q = p; + while(*q) { + if(q[1] && (q[0] == '\\')) + q++; + else if(q[0] == stop) + break; + q++; + } + *q = '\0'; + + /* make sure the file name doesn't end in \r or \n */ + q = strchr(p, '\r'); + if(q) + *q = '\0'; + + q = strchr(p, '\n'); + if(q) + *q = '\0'; + + if(copy != p) + memmove(copy, p, strlen(p) + 1); + + /* in case we built debug enabled, we allow an evironment variable + * named CURL_TESTDIR to prefix the given file name to put it into a + * specific directory + */ +#ifdef DEBUGBUILD + { + char *tdir = curlx_getenv("CURL_TESTDIR"); + if(tdir) { + char buffer[512]; /* suitably large */ + snprintf(buffer, sizeof(buffer), "%s/%s", tdir, copy); + Curl_safefree(copy); + copy = strdup(buffer); /* clone the buffer, we don't use the libcurl + aprintf() or similar since we want to use the + same memory code as the "real" parse_filename + function */ + curl_free(tdir); + } + } +#endif + + return copy; +} + diff --git a/src/tool_cb_hdr.h b/src/tool_cb_hdr.h new file mode 100644 index 0000000..bd50431 --- /dev/null +++ b/src/tool_cb_hdr.h @@ -0,0 +1,54 @@ +#ifndef HEADER_CURL_TOOL_CB_HDR_H +#define HEADER_CURL_TOOL_CB_HDR_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* + * curl operates using a single HdrCbData struct variable, a + * pointer to this is passed as userdata pointer to tool_header_cb. + * + * 'outs' member is a pointer to the OutStruct variable used to keep + * track of information relative to curl's output writing. + * + * 'heads' member is a pointer to the OutStruct variable used to keep + * track of information relative to header response writing. + * + * 'honor_cd_filename' member is TRUE when tool_header_cb is allowed + * to honor Content-Disposition filename property and accordingly + * set 'outs' filename, otherwise FALSE; + */ + +struct HdrCbData { + struct OutStruct *outs; + struct OutStruct *heads; + bool honor_cd_filename; +}; + +/* +** callback for CURLOPT_HEADERFUNCTION +*/ + +size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata); + +#endif /* HEADER_CURL_TOOL_CB_HDR_H */ + diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c new file mode 100644 index 0000000..9e3c5fb --- /dev/null +++ b/src/tool_cb_prg.c @@ -0,0 +1,150 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_cb_prg.h" +#include "tool_util.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* +** callback for CURLOPT_XFERINFOFUNCTION +*/ + +#define MAX_BARLENGTH 256 + +int tool_progress_cb(void *clientp, + curl_off_t dltotal, curl_off_t dlnow, + curl_off_t ultotal, curl_off_t ulnow) +{ + /* The original progress-bar source code was written for curl by Lars Aas, + and this new edition inherits some of his concepts. */ + + char line[MAX_BARLENGTH+1]; + char format[40]; + double frac; + double percent; + int barwidth; + int num; + struct timeval now = tvnow(); + struct ProgressData *bar = (struct ProgressData *)clientp; + curl_off_t total; + curl_off_t point; + + /* expected transfer size */ + total = dltotal + ultotal + bar->initial_size; + + /* we've come this far */ + point = dlnow + ulnow + bar->initial_size; + + if(bar->calls && (tvdiff(now, bar->prevtime) < 100L) && point < total) + /* after first call, limit progress-bar updating to 10 Hz */ + /* update when we're at 100% even if last update is less than 200ms ago */ + return 0; + + if(point > total) + /* we have got more than the expected total! */ + total = point; + + /* simply count invokes */ + bar->calls++; + + if(total < 1) { + curl_off_t prevblock = bar->prev / 1024; + curl_off_t thisblock = point / 1024; + while(thisblock > prevblock) { + fprintf(bar->out, "#"); + prevblock++; + } + } + else if(point != bar->prev) { + frac = (double)point / (double)total; + percent = frac * 100.0f; + barwidth = bar->width - 7; + num = (int) (((double)barwidth) * frac); + if(num > MAX_BARLENGTH) + num = MAX_BARLENGTH; + memset(line, '#', num); + line[num] = '\0'; + snprintf(format, sizeof(format), "\r%%-%ds %%5.1f%%%%", barwidth); + fprintf(bar->out, format, line, percent); + } + fflush(bar->out); + bar->prev = point; + bar->prevtime = now; + + return 0; +} + +void progressbarinit(struct ProgressData *bar, + struct OperationConfig *config) +{ +#ifdef __EMX__ + /* 20000318 mgs */ + int scr_size[2]; +#endif + char *colp; + + memset(bar, 0, sizeof(struct ProgressData)); + + /* pass this through to progress function so + * it can display progress towards total file + * not just the part that's left. (21-may-03, dbyron) */ + if(config->use_resume) + bar->initial_size = config->resume_from; + +/* TODO: get terminal width through ansi escapes or something similar. + try to update width when xterm is resized... - 19990617 larsa */ +#ifndef __EMX__ + /* 20000318 mgs + * OS/2 users most likely won't have this env var set, and besides that + * we're using our own way to determine screen width */ + colp = curlx_getenv("COLUMNS"); + if(colp) { + char *endptr; + long num = strtol(colp, &endptr, 10); + if((endptr != colp) && (endptr == colp + strlen(colp)) && (num > 0)) + bar->width = (int)num; + else + bar->width = 79; + curl_free(colp); + } + else + bar->width = 79; +#else + /* 20000318 mgs + * We use this emx library call to get the screen width, and subtract + * one from what we got in order to avoid a problem with the cursor + * advancing to the next line if we print a string that is as long as + * the screen is wide. */ + + _scrsize(scr_size); + bar->width = scr_size[0] - 1; +#endif + + bar->out = config->global->errors; +} diff --git a/src/tool_cb_prg.h b/src/tool_cb_prg.h new file mode 100644 index 0000000..c635be8 --- /dev/null +++ b/src/tool_cb_prg.h @@ -0,0 +1,50 @@ +#ifndef HEADER_CURL_TOOL_CB_PRG_H +#define HEADER_CURL_TOOL_CB_PRG_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define CURL_PROGRESS_STATS 0 /* default progress display */ +#define CURL_PROGRESS_BAR 1 + +struct ProgressData { + int calls; + curl_off_t prev; + struct timeval prevtime; + int width; + FILE *out; /* where to write everything to */ + curl_off_t initial_size; +}; + +void progressbarinit(struct ProgressData *bar, + struct OperationConfig *config); + +/* +** callback for CURLOPT_PROGRESSFUNCTION +*/ + +int tool_progress_cb(void *clientp, + curl_off_t dltotal, curl_off_t dlnow, + curl_off_t ultotal, curl_off_t ulnow); + +#endif /* HEADER_CURL_TOOL_CB_PRG_H */ + diff --git a/src/tool_cb_rea.c b/src/tool_cb_rea.c new file mode 100644 index 0000000..4565a15 --- /dev/null +++ b/src/tool_cb_rea.c @@ -0,0 +1,55 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_cb_rea.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* +** callback for CURLOPT_READFUNCTION +*/ + +size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata) +{ + ssize_t rc; + struct InStruct *in = userdata; + + rc = read(in->fd, buffer, sz*nmemb); + if(rc < 0) { + if(errno == EAGAIN) { + errno = 0; + in->config->readbusy = TRUE; + return CURL_READFUNC_PAUSE; + } + /* since size_t is unsigned we can't return negative values fine */ + rc = 0; + } + in->config->readbusy = FALSE; + return (size_t)rc; +} + diff --git a/src/tool_cb_rea.h b/src/tool_cb_rea.h new file mode 100644 index 0000000..4294166 --- /dev/null +++ b/src/tool_cb_rea.h @@ -0,0 +1,33 @@ +#ifndef HEADER_CURL_TOOL_CB_REA_H +#define HEADER_CURL_TOOL_CB_REA_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* +** callback for CURLOPT_READFUNCTION +*/ + +size_t tool_read_cb(void *buffer, size_t sz, size_t nmemb, void *userdata); + +#endif /* HEADER_CURL_TOOL_CB_REA_H */ + diff --git a/src/tool_cb_see.c b/src/tool_cb_see.c new file mode 100644 index 0000000..2f49e1d --- /dev/null +++ b/src/tool_cb_see.c @@ -0,0 +1,131 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_cb_see.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* OUR_MAX_SEEK_L has 'long' data type, OUR_MAX_SEEK_O has 'curl_off_t, + both represent the same value. Maximum offset used here when we lseek + using a 'long' data type offset */ + +#define OUR_MAX_SEEK_L 2147483647L - 1L +#define OUR_MAX_SEEK_O CURL_OFF_T_C(0x7FFFFFFF) - CURL_OFF_T_C(0x1) + +/* +** callback for CURLOPT_SEEKFUNCTION +** +** Notice that this is not supposed to return the resulting offset. This +** shall only return CURL_SEEKFUNC_* return codes. +*/ + +int tool_seek_cb(void *userdata, curl_off_t offset, int whence) +{ + struct InStruct *in = userdata; + +#if(CURL_SIZEOF_CURL_OFF_T > SIZEOF_OFF_T) && !defined(USE_WIN32_LARGE_FILES) + + /* The offset check following here is only interesting if curl_off_t is + larger than off_t and we are not using the WIN32 large file support + macros that provide the support to do 64bit seeks correctly */ + + if(offset > OUR_MAX_SEEK_O) { + /* Some precaution code to work around problems with different data sizes + to allow seeking >32bit even if off_t is 32bit. Should be very rare and + is really valid on weirdo-systems. */ + curl_off_t left = offset; + + if(whence != SEEK_SET) + /* this code path doesn't support other types */ + return CURL_SEEKFUNC_FAIL; + + if(LSEEK_ERROR == lseek(in->fd, 0, SEEK_SET)) + /* couldn't rewind to beginning */ + return CURL_SEEKFUNC_FAIL; + + while(left) { + long step = (left > OUR_MAX_SEEK_O) ? OUR_MAX_SEEK_L : (long)left; + if(LSEEK_ERROR == lseek(in->fd, step, SEEK_CUR)) + /* couldn't seek forwards the desired amount */ + return CURL_SEEKFUNC_FAIL; + left -= step; + } + return CURL_SEEKFUNC_OK; + } +#endif + + if(LSEEK_ERROR == lseek(in->fd, offset, whence)) + /* couldn't rewind, the reason is in errno but errno is just not portable + enough and we don't actually care that much why we failed. We'll let + libcurl know that it may try other means if it wants to. */ + return CURL_SEEKFUNC_CANTSEEK; + + return CURL_SEEKFUNC_OK; +} + +#if defined(WIN32) && !defined(__MINGW64__) + +#ifdef __BORLANDC__ +/* 64-bit lseek-like function unavailable */ +# define _lseeki64(hnd,ofs,whence) lseek(hnd,ofs,whence) +#endif + +#ifdef __POCC__ +# if(__POCC__ < 450) +/* 64-bit lseek-like function unavailable */ +# define _lseeki64(hnd,ofs,whence) _lseek(hnd,ofs,whence) +# else +# define _lseeki64(hnd,ofs,whence) _lseek64(hnd,ofs,whence) +# endif +#endif + +#ifdef _WIN32_WCE +/* 64-bit lseek-like function unavailable */ +# undef _lseeki64 +# define _lseeki64(hnd,ofs,whence) lseek(hnd,ofs,whence) +# undef _get_osfhandle +# define _get_osfhandle(fd) (fd) +#endif + +/* + * Truncate a file handle at a 64-bit position 'where'. + */ + +int tool_ftruncate64(int fd, curl_off_t where) +{ + if(_lseeki64(fd, where, SEEK_SET) < 0) + return -1; + + if(!SetEndOfFile((HANDLE)_get_osfhandle(fd))) + return -1; + + return 0; +} + +#endif /* WIN32 && ! __MINGW64__ */ + diff --git a/src/tool_cb_see.h b/src/tool_cb_see.h new file mode 100644 index 0000000..ceb22d6 --- /dev/null +++ b/src/tool_cb_see.h @@ -0,0 +1,46 @@ +#ifndef HEADER_CURL_TOOL_CB_SEE_H +#define HEADER_CURL_TOOL_CB_SEE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#if defined(WIN32) && !defined(__MINGW64__) + +int tool_ftruncate64(int fd, curl_off_t where); + +#undef ftruncate +#define ftruncate(fd,where) tool_ftruncate64(fd,where) + +#ifndef HAVE_FTRUNCATE +# define HAVE_FTRUNCATE 1 +#endif + +#endif /* WIN32 && ! __MINGW64__ */ + +/* +** callback for CURLOPT_SEEKFUNCTION +*/ + +int tool_seek_cb(void *userdata, curl_off_t offset, int whence); + +#endif /* HEADER_CURL_TOOL_CB_SEE_H */ + diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c new file mode 100644 index 0000000..9be393f --- /dev/null +++ b/src/tool_cb_wrt.c @@ -0,0 +1,159 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_msgs.h" +#include "tool_cb_wrt.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* create a local file for writing, return TRUE on success */ +bool tool_create_output_file(struct OutStruct *outs) +{ + struct GlobalConfig *global = outs->config->global; + FILE *file; + + if(!outs->filename || !*outs->filename) { + warnf(global, "Remote filename has no length!\n"); + return FALSE; + } + + if(outs->is_cd_filename) { + /* don't overwrite existing files */ + file = fopen(outs->filename, "rb"); + if(file) { + fclose(file); + warnf(global, "Refusing to overwrite %s: %s\n", outs->filename, + strerror(EEXIST)); + return FALSE; + } + } + + /* open file for writing */ + file = fopen(outs->filename, "wb"); + if(!file) { + warnf(global, "Failed to create the file %s: %s\n", outs->filename, + strerror(errno)); + return FALSE; + } + outs->s_isreg = TRUE; + outs->fopened = TRUE; + outs->stream = file; + outs->bytes = 0; + outs->init = 0; + return TRUE; +} + +/* +** callback for CURLOPT_WRITEFUNCTION +*/ + +size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata) +{ + size_t rc; + struct OutStruct *outs = userdata; + struct OperationConfig *config = outs->config; + + /* + * Once that libcurl has called back tool_write_cb() the returned value + * is checked against the amount that was intended to be written, if + * it does not match then it fails with CURLE_WRITE_ERROR. So at this + * point returning a value different from sz*nmemb indicates failure. + */ + const size_t failure = (sz * nmemb) ? 0 : 1; + + if(!config) + return failure; + +#ifdef DEBUGBUILD + if(config->include_headers) { + if(sz * nmemb > (size_t)CURL_MAX_HTTP_HEADER) { + warnf(config->global, "Header data size exceeds single call write " + "limit!\n"); + return failure; + } + } + else { + if(sz * nmemb > (size_t)CURL_MAX_WRITE_SIZE) { + warnf(config->global, "Data size exceeds single call write limit!\n"); + return failure; + } + } + + { + /* Some internal congruency checks on received OutStruct */ + bool check_fails = FALSE; + if(outs->filename) { + /* regular file */ + if(!*outs->filename) + check_fails = TRUE; + if(!outs->s_isreg) + check_fails = TRUE; + if(outs->fopened && !outs->stream) + check_fails = TRUE; + if(!outs->fopened && outs->stream) + check_fails = TRUE; + if(!outs->fopened && outs->bytes) + check_fails = TRUE; + } + else { + /* standard stream */ + if(!outs->stream || outs->s_isreg || outs->fopened) + check_fails = TRUE; + if(outs->alloc_filename || outs->is_cd_filename || outs->init) + check_fails = TRUE; + } + if(check_fails) { + warnf(config->global, "Invalid output struct data for write callback\n"); + return failure; + } + } +#endif + + if(!outs->stream && !tool_create_output_file(outs)) + return failure; + + rc = fwrite(buffer, sz, nmemb, outs->stream); + + if((sz * nmemb) == rc) + /* we added this amount of data to the output */ + outs->bytes += (sz * nmemb); + + if(config->readbusy) { + config->readbusy = FALSE; + curl_easy_pause(config->easy, CURLPAUSE_CONT); + } + + if(config->nobuffer) { + /* output buffering disabled */ + int res = fflush(outs->stream); + if(res) + return failure; + } + + return rc; +} diff --git a/src/tool_cb_wrt.h b/src/tool_cb_wrt.h new file mode 100644 index 0000000..ecbefa8 --- /dev/null +++ b/src/tool_cb_wrt.h @@ -0,0 +1,36 @@ +#ifndef HEADER_CURL_TOOL_CB_WRT_H +#define HEADER_CURL_TOOL_CB_WRT_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* +** callback for CURLOPT_WRITEFUNCTION +*/ + +size_t tool_write_cb(void *buffer, size_t sz, size_t nmemb, void *userdata); + +/* create a local file for writing, return TRUE on success */ +bool tool_create_output_file(struct OutStruct *outs); + +#endif /* HEADER_CURL_TOOL_CB_WRT_H */ + diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c new file mode 100644 index 0000000..ba6c468 --- /dev/null +++ b/src/tool_cfgable.c @@ -0,0 +1,159 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "tool_cfgable.h" +#include "tool_main.h" + +#include "memdebug.h" /* keep this as LAST include */ + +void config_init(struct OperationConfig* config) +{ + memset(config, 0, sizeof(struct OperationConfig)); + + config->postfieldsize = -1; + config->use_httpget = FALSE; + config->create_dirs = FALSE; + config->maxredirs = DEFAULT_MAXREDIRS; + config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */ + config->proto_present = FALSE; + config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */ + ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB | + CURLPROTO_SMBS); + config->proto_redir_present = FALSE; +} + +static void free_config_fields(struct OperationConfig *config) +{ + struct getout *urlnode; + + Curl_safefree(config->random_file); + Curl_safefree(config->egd_file); + Curl_safefree(config->useragent); + Curl_safefree(config->cookie); + Curl_safefree(config->cookiejar); + Curl_safefree(config->cookiefile); + + Curl_safefree(config->postfields); + Curl_safefree(config->referer); + + Curl_safefree(config->headerfile); + Curl_safefree(config->ftpport); + Curl_safefree(config->iface); + + Curl_safefree(config->range); + + Curl_safefree(config->userpwd); + Curl_safefree(config->tls_username); + Curl_safefree(config->tls_password); + Curl_safefree(config->tls_authtype); + Curl_safefree(config->proxyuserpwd); + Curl_safefree(config->proxy); + + Curl_safefree(config->dns_ipv6_addr); + Curl_safefree(config->dns_ipv4_addr); + Curl_safefree(config->dns_interface); + Curl_safefree(config->dns_servers); + + Curl_safefree(config->noproxy); + + Curl_safefree(config->mail_from); + curl_slist_free_all(config->mail_rcpt); + Curl_safefree(config->mail_auth); + + Curl_safefree(config->netrc_file); + + urlnode = config->url_list; + while(urlnode) { + struct getout *next = urlnode->next; + Curl_safefree(urlnode->url); + Curl_safefree(urlnode->outfile); + Curl_safefree(urlnode->infile); + Curl_safefree(urlnode); + urlnode = next; + } + config->url_list = NULL; + config->url_last = NULL; + config->url_get = NULL; + config->url_out = NULL; + + Curl_safefree(config->cipher_list); + Curl_safefree(config->cert); + Curl_safefree(config->cert_type); + Curl_safefree(config->cacert); + Curl_safefree(config->capath); + Curl_safefree(config->crlfile); + Curl_safefree(config->pinnedpubkey); + Curl_safefree(config->key); + Curl_safefree(config->key_type); + Curl_safefree(config->key_passwd); + Curl_safefree(config->pubkey); + Curl_safefree(config->hostpubmd5); + Curl_safefree(config->engine); + + Curl_safefree(config->customrequest); + Curl_safefree(config->krblevel); + + Curl_safefree(config->xoauth2_bearer); + + Curl_safefree(config->unix_socket_path); + Curl_safefree(config->writeout); + + curl_slist_free_all(config->quote); + curl_slist_free_all(config->postquote); + curl_slist_free_all(config->prequote); + + curl_slist_free_all(config->headers); + curl_slist_free_all(config->proxyheaders); + + if(config->httppost) { + curl_formfree(config->httppost); + config->httppost = NULL; + } + config->last_post = NULL; + + curl_slist_free_all(config->telnet_options); + curl_slist_free_all(config->resolve); + + Curl_safefree(config->socksproxy); + Curl_safefree(config->socks5_gssapi_service); + Curl_safefree(config->proxy_service_name); + Curl_safefree(config->service_name); + + Curl_safefree(config->ftp_account); + Curl_safefree(config->ftp_alternative_to_user); +} + +void config_free(struct OperationConfig *config) +{ + struct OperationConfig *last = config; + + /* Free each of the structures in reverse order */ + while(last) { + struct OperationConfig *prev = last->prev; + + free_config_fields(last); + free(last); + + last = prev; + } +} diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h new file mode 100644 index 0000000..048eb4f --- /dev/null +++ b/src/tool_cfgable.h @@ -0,0 +1,246 @@ +#ifndef HEADER_CURL_TOOL_CFGABLE_H +#define HEADER_CURL_TOOL_CFGABLE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "tool_sdecls.h" + +#include "tool_metalink.h" + +struct GlobalConfig; + +struct OperationConfig { + CURL *easy; /* A copy of the handle from GlobalConfig */ + bool remote_time; + char *random_file; + char *egd_file; + char *useragent; + char *cookie; /* single line with specified cookies */ + char *cookiejar; /* write to this file */ + char *cookiefile; /* read from this file */ + bool cookiesession; /* new session? */ + bool encoding; /* Accept-Encoding please */ + bool tr_encoding; /* Transfer-Encoding please */ + unsigned long authtype; /* auth bitmask */ + bool use_resume; + bool resume_from_current; + bool disable_epsv; + bool disable_eprt; + bool ftp_pret; + long proto; + bool proto_present; + long proto_redir; + bool proto_redir_present; + curl_off_t resume_from; + char *postfields; + curl_off_t postfieldsize; + char *referer; + double timeout; + double connecttimeout; + long maxredirs; + curl_off_t max_filesize; + char *headerfile; + char *ftpport; + char *iface; + int localport; + int localportrange; + unsigned short porttouse; + char *range; + long low_speed_limit; + long low_speed_time; + char *dns_servers; /* dot notation: 1.1.1.1;2.2.2.2 */ + char *dns_interface; /* interface name */ + char *dns_ipv4_addr; /* dot notation */ + char *dns_ipv6_addr; /* dot notation */ + char *userpwd; + char *login_options; + char *tls_username; + char *tls_password; + char *tls_authtype; + char *proxyuserpwd; + char *proxy; + int proxyver; /* set to CURLPROXY_HTTP* define */ + char *noproxy; + char *mail_from; + struct curl_slist *mail_rcpt; + char *mail_auth; + bool sasl_ir; /* Enable/disable SASL initial response */ + bool proxytunnel; + bool ftp_append; /* APPE on ftp */ + bool use_ascii; /* select ascii or text transfer */ + bool autoreferer; /* automatically set referer */ + bool failonerror; /* fail on (HTTP) errors */ + bool include_headers; /* send headers to data output */ + bool no_body; /* don't get the body */ + bool dirlistonly; /* only get the FTP dir list */ + bool followlocation; /* follow http redirects */ + bool unrestricted_auth; /* Continue to send authentication (user+password) + when following ocations, even when hostname + changed */ + bool netrc_opt; + bool netrc; + char *netrc_file; + struct getout *url_list; /* point to the first node */ + struct getout *url_last; /* point to the last/current node */ + struct getout *url_get; /* point to the node to fill in URL */ + struct getout *url_out; /* point to the node to fill in outfile */ + char *cipher_list; + char *cert; + char *cert_type; + char *cacert; + char *capath; + char *crlfile; + char *pinnedpubkey; + char *key; + char *key_type; + char *key_passwd; + char *pubkey; + char *hostpubmd5; + char *engine; + bool crlf; + char *customrequest; + char *krblevel; + long httpversion; + bool nobuffer; + bool readbusy; /* set when reading input returns EAGAIN */ + bool globoff; + bool use_httpget; + bool insecure_ok; /* set TRUE to allow insecure SSL connects */ + bool verifystatus; + bool create_dirs; + bool ftp_create_dirs; + bool ftp_skip_ip; + bool proxynegotiate; + bool proxyntlm; + bool proxydigest; + bool proxybasic; + bool proxyanyauth; + char *writeout; /* %-styled format string to output */ + bool writeenv; /* write results to environment, if available */ + struct curl_slist *quote; + struct curl_slist *postquote; + struct curl_slist *prequote; + long ssl_version; + long ip_version; + curl_TimeCond timecond; + time_t condtime; + struct curl_slist *headers; + struct curl_slist *proxyheaders; + struct curl_httppost *httppost; + struct curl_httppost *last_post; + struct curl_slist *telnet_options; + struct curl_slist *resolve; + HttpReq httpreq; + + /* for bandwidth limiting features: */ + curl_off_t sendpersecond; /* send to peer */ + curl_off_t recvpersecond; /* receive from peer */ + + bool ftp_ssl; + bool ftp_ssl_reqd; + bool ftp_ssl_control; + bool ftp_ssl_ccc; + int ftp_ssl_ccc_mode; + + char *socksproxy; /* set to server string */ + int socksver; /* set to CURLPROXY_SOCKS* define */ + char *socks5_gssapi_service; /* set service name for gssapi principal + * default rcmd */ + char *proxy_service_name; /* set service name for proxy negotiation + * default HTTP */ + int socks5_gssapi_nec ; /* The NEC reference server does not protect + * the encryption type exchange */ + char *service_name; /* set negotiation service name + * default HTTP */ + + bool tcp_nodelay; + long req_retry; /* number of retries */ + long retry_delay; /* delay between retries (in seconds) */ + long retry_maxtime; /* maximum time to keep retrying */ + + char *ftp_account; /* for ACCT */ + char *ftp_alternative_to_user; /* send command if USER/PASS fails */ + int ftp_filemethod; + long tftp_blksize; /* TFTP BLKSIZE option */ + bool ignorecl; /* --ignore-content-length */ + bool disable_sessionid; + + bool raw; + bool post301; + bool post302; + bool post303; + bool nokeepalive; /* for keepalive needs */ + long alivetime; + bool content_disposition; /* use Content-disposition filename */ + + int default_node_flags; /* default flags to search for each 'node', which + is basically each given URL to transfer */ + + bool xattr; /* store metadata in extended attributes */ + long gssapi_delegation; + bool ssl_allow_beast; /* allow this SSL vulnerability */ + + bool use_metalink; /* process given URLs as metalink XML file */ + metalinkfile *metalinkfile_list; /* point to the first node */ + metalinkfile *metalinkfile_last; /* point to the last/current node */ +#ifdef CURLDEBUG + bool test_event_based; +#endif + char *xoauth2_bearer; /* XOAUTH2 bearer token */ + bool nonpn; /* enable/disable TLS NPN extension */ + bool noalpn; /* enable/disable TLS ALPN extension */ + char *unix_socket_path; /* path to Unix domain socket */ + bool falsestart; + bool path_as_is; + struct GlobalConfig *global; + struct OperationConfig *prev; + struct OperationConfig *next; /* Always last in the struct */ +}; + +struct GlobalConfig { + CURL *easy; /* Once we have one, we keep it here */ + int showerror; /* -1 == unset, default => show errors + 0 => -s is used to NOT show errors + 1 => -S has been used to show errors */ + bool mute; /* don't show messages, --silent given */ + bool noprogress; /* don't show progress bar --silent given */ + bool isatty; /* Updated internally if output is a tty */ + FILE *errors; /* Error stream, defaults to stderr */ + bool errors_fopened; /* Whether error stream isn't stderr */ + char *trace_dump; /* file to dump the network trace to */ + FILE *trace_stream; + bool trace_fopened; + trace tracetype; + bool tracetime; /* include timestamp? */ + int progressmode; /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */ + char *libcurl; /* Output libcurl code to this file name */ + + struct OperationConfig *first; + struct OperationConfig *current; + struct OperationConfig *last; /* Always last in the struct */ +}; + +void config_init(struct OperationConfig *config); +void config_free(struct OperationConfig *config); + +#endif /* HEADER_CURL_TOOL_CFGABLE_H */ diff --git a/src/tool_convert.c b/src/tool_convert.c new file mode 100644 index 0000000..ecce036 --- /dev/null +++ b/src/tool_convert.c @@ -0,0 +1,150 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef CURL_DOES_CONVERSIONS + +#ifdef HAVE_ICONV +# include <iconv.h> +#endif + +#include "tool_convert.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef HAVE_ICONV + +/* curl tool iconv conversion descriptors */ +static iconv_t inbound_cd = (iconv_t)-1; +static iconv_t outbound_cd = (iconv_t)-1; + +/* set default codesets for iconv */ +#ifndef CURL_ICONV_CODESET_OF_NETWORK +# define CURL_ICONV_CODESET_OF_NETWORK "ISO8859-1" +#endif + +/* + * convert_to_network() is a curl tool function to convert + * from the host encoding to ASCII on non-ASCII platforms. + */ +CURLcode convert_to_network(char *buffer, size_t length) +{ + /* translate from the host encoding to the network encoding */ + char *input_ptr, *output_ptr; + size_t res, in_bytes, out_bytes; + + /* open an iconv conversion descriptor if necessary */ + if(outbound_cd == (iconv_t)-1) { + outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK, + CURL_ICONV_CODESET_OF_HOST); + if(outbound_cd == (iconv_t)-1) { + return CURLE_CONV_FAILED; + } + } + /* call iconv */ + input_ptr = output_ptr = buffer; + in_bytes = out_bytes = length; + res = iconv(outbound_cd, &input_ptr, &in_bytes, + &output_ptr, &out_bytes); + if((res == (size_t)-1) || (in_bytes != 0)) { + return CURLE_CONV_FAILED; + } + + return CURLE_OK; +} + +/* + * convert_from_network() is a curl tool function + * for performing ASCII conversions on non-ASCII platforms. + */ +CURLcode convert_from_network(char *buffer, size_t length) +{ + /* translate from the network encoding to the host encoding */ + char *input_ptr, *output_ptr; + size_t res, in_bytes, out_bytes; + + /* open an iconv conversion descriptor if necessary */ + if(inbound_cd == (iconv_t)-1) { + inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST, + CURL_ICONV_CODESET_OF_NETWORK); + if(inbound_cd == (iconv_t)-1) { + return CURLE_CONV_FAILED; + } + } + /* call iconv */ + input_ptr = output_ptr = buffer; + in_bytes = out_bytes = length; + res = iconv(inbound_cd, &input_ptr, &in_bytes, + &output_ptr, &out_bytes); + if((res == (size_t)-1) || (in_bytes != 0)) { + return CURLE_CONV_FAILED; + } + + return CURLE_OK; +} + +void convert_cleanup(void) +{ + /* close iconv conversion descriptors */ + if(inbound_cd != (iconv_t)-1) + (void)iconv_close(inbound_cd); + if(outbound_cd != (iconv_t)-1) + (void)iconv_close(outbound_cd); +} + +#endif /* HAVE_ICONV */ + +char convert_char(curl_infotype infotype, char this_char) +{ +/* determine how this specific character should be displayed */ + switch(infotype) { + case CURLINFO_DATA_IN: + case CURLINFO_DATA_OUT: + case CURLINFO_SSL_DATA_IN: + case CURLINFO_SSL_DATA_OUT: + /* data, treat as ASCII */ + if((this_char >= 0x20) && (this_char < 0x7f)) { + /* printable ASCII hex value: convert to host encoding */ + (void)convert_from_network(&this_char, 1); + } + else { + /* non-printable ASCII, use a replacement character */ + return UNPRINTABLE_CHAR; + } + /* fall through to default */ + default: + /* treat as host encoding */ + if(ISPRINT(this_char) + && (this_char != '\t') + && (this_char != '\r') + && (this_char != '\n')) { + /* printable characters excluding tabs and line end characters */ + return this_char; + } + break; + } + /* non-printable, use a replacement character */ + return UNPRINTABLE_CHAR; +} + +#endif /* CURL_DOES_CONVERSIONS */ + diff --git a/src/tool_convert.h b/src/tool_convert.h new file mode 100644 index 0000000..32d473f --- /dev/null +++ b/src/tool_convert.h @@ -0,0 +1,45 @@ +#ifndef HEADER_CURL_TOOL_CONVERT_H +#define HEADER_CURL_TOOL_CONVERT_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef CURL_DOES_CONVERSIONS + +#ifdef HAVE_ICONV + +CURLcode convert_to_network(char *buffer, size_t length); +CURLcode convert_from_network(char *buffer, size_t length); +void convert_cleanup(void); + +#endif /* HAVE_ICONV */ + +char convert_char(curl_infotype infotype, char this_char); + +#endif /* CURL_DOES_CONVERSIONS */ + +#if !defined(CURL_DOES_CONVERSIONS) || !defined(HAVE_ICONV) +#define convert_cleanup() Curl_nop_stmt +#endif + +#endif /* HEADER_CURL_TOOL_CONVERT_H */ + diff --git a/src/tool_dirhie.c b/src/tool_dirhie.c new file mode 100644 index 0000000..b6a8067 --- /dev/null +++ b/src/tool_dirhie.c @@ -0,0 +1,147 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include <sys/stat.h> + +#ifdef WIN32 +# include <direct.h> +#endif + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_dirhie.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef NETWARE +# ifndef __NOVELL_LIBC__ +# define mkdir mkdir_510 +# endif +#endif + +#ifdef WIN32 +# define mkdir(x,y) (mkdir)((x)) +# ifndef __POCC__ +# define F_OK 0 +# endif +#endif + +static void show_dir_errno(FILE *errors, const char *name) +{ + switch(ERRNO) { +#ifdef EACCES + case EACCES: + fprintf(errors, "You don't have permission to create %s.\n", name); + break; +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + fprintf(errors, "The directory name %s is too long.\n", name); + break; +#endif +#ifdef EROFS + case EROFS: + fprintf(errors, "%s resides on a read-only file system.\n", name); + break; +#endif +#ifdef ENOSPC + case ENOSPC: + fprintf(errors, "No space left on the file system that will " + "contain the directory %s.\n", name); + break; +#endif +#ifdef EDQUOT + case EDQUOT: + fprintf(errors, "Cannot create directory %s because you " + "exceeded your quota.\n", name); + break; +#endif + default : + fprintf(errors, "Error creating directory %s.\n", name); + break; + } +} + +/* + * Create the needed directory hierarchy recursively in order to save + * multi-GETs in file output, ie: + * curl "http://my.site/dir[1-5]/file[1-5].txt" -o "dir#1/file#2.txt" + * should create all the dir* automagically + */ + +CURLcode create_dir_hierarchy(const char *outfile, FILE *errors) +{ + char *tempdir; + char *tempdir2; + char *outdup; + char *dirbuildup; + CURLcode result = CURLE_OK; + size_t outlen; + + outlen = strlen(outfile); + outdup = strdup(outfile); + if(!outdup) + return CURLE_OUT_OF_MEMORY; + + dirbuildup = malloc(outlen + 1); + if(!dirbuildup) { + Curl_safefree(outdup); + return CURLE_OUT_OF_MEMORY; + } + dirbuildup[0] = '\0'; + + tempdir = strtok(outdup, DIR_CHAR); + + while(tempdir != NULL) { + tempdir2 = strtok(NULL, DIR_CHAR); + /* since strtok returns a token for the last word even + if not ending with DIR_CHAR, we need to prune it */ + if(tempdir2 != NULL) { + size_t dlen = strlen(dirbuildup); + if(dlen) + snprintf(&dirbuildup[dlen], outlen - dlen, "%s%s", DIR_CHAR, tempdir); + else { + if(0 != strncmp(outdup, DIR_CHAR, 1)) + strcpy(dirbuildup, tempdir); + else + snprintf(dirbuildup, outlen, "%s%s", DIR_CHAR, tempdir); + } + if(access(dirbuildup, F_OK) == -1) { + if(-1 == mkdir(dirbuildup, (mode_t)0000750)) { + show_dir_errno(errors, dirbuildup); + result = CURLE_WRITE_ERROR; + break; /* get out of loop */ + } + } + } + tempdir = tempdir2; + } + + Curl_safefree(dirbuildup); + Curl_safefree(outdup); + + return result; +} + diff --git a/src/tool_dirhie.h b/src/tool_dirhie.h new file mode 100644 index 0000000..5f19575 --- /dev/null +++ b/src/tool_dirhie.h @@ -0,0 +1,29 @@ +#ifndef HEADER_CURL_TOOL_DIRHIE_H +#define HEADER_CURL_TOOL_DIRHIE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +CURLcode create_dir_hierarchy(const char *outfile, FILE *errors); + +#endif /* HEADER_CURL_TOOL_DIRHIE_H */ + diff --git a/src/tool_doswin.c b/src/tool_doswin.c new file mode 100644 index 0000000..dd6e8bb --- /dev/null +++ b/src/tool_doswin.c @@ -0,0 +1,299 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#if defined(MSDOS) || defined(WIN32) + +#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME) +# include <libgen.h> +#endif + +#ifdef WIN32 +# include "tool_cfgable.h" +# include "tool_libinfo.h" +#endif + +#include "tool_bname.h" +#include "tool_doswin.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* + * Macros ALWAYS_TRUE and ALWAYS_FALSE are used to avoid compiler warnings. + */ + +#define ALWAYS_TRUE (1) +#define ALWAYS_FALSE (0) + +#if defined(_MSC_VER) && !defined(__POCC__) +# undef ALWAYS_TRUE +# undef ALWAYS_FALSE +# if (_MSC_VER < 1500) +# define ALWAYS_TRUE (0, 1) +# define ALWAYS_FALSE (1, 0) +# else +# define ALWAYS_TRUE \ +__pragma(warning(push)) \ +__pragma(warning(disable:4127)) \ +(1) \ +__pragma(warning(pop)) +# define ALWAYS_FALSE \ +__pragma(warning(push)) \ +__pragma(warning(disable:4127)) \ +(0) \ +__pragma(warning(pop)) +# endif +#endif + +#ifdef WIN32 +# undef PATH_MAX +# define PATH_MAX MAX_PATH +#endif + +#ifndef S_ISCHR +# ifdef S_IFCHR +# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +# else +# define S_ISCHR(m) (0) /* cannot tell if file is a device */ +# endif +#endif + +#ifdef WIN32 +# define _use_lfn(f) ALWAYS_TRUE /* long file names always available */ +#elif !defined(__DJGPP__) || (__DJGPP__ < 2) /* DJGPP 2.0 has _use_lfn() */ +# define _use_lfn(f) ALWAYS_FALSE /* long file names never available */ +#elif defined(__DJGPP__) +# include <fcntl.h> /* _use_lfn(f) prototype */ +#endif + +static const char *msdosify (const char *file_name); +static char *rename_if_dos_device_name (char *file_name); + +/* + * sanitize_dos_name: returns a newly allocated string holding a + * valid file name which will be a transformation of given argument + * in case this wasn't already a valid file name. + * + * This function takes ownership of given argument, free'ing it before + * returning. Caller is responsible of free'ing returned string. Upon + * out of memory condition function returns NULL. + */ + +char *sanitize_dos_name(char *file_name) +{ + char new_name[PATH_MAX]; + + if(!file_name) + return NULL; + + if(strlen(file_name) >= PATH_MAX) + file_name[PATH_MAX-1] = '\0'; /* truncate it */ + + strcpy(new_name, msdosify(file_name)); + + Curl_safefree(file_name); + + return strdup(rename_if_dos_device_name(new_name)); +} + +/* The following functions are taken with modification from the DJGPP + * port of tar 1.12. They use algorithms originally from DJTAR. */ + +static const char *msdosify (const char *file_name) +{ + static char dos_name[PATH_MAX]; + static const char illegal_chars_dos[] = ".+, ;=[]" /* illegal in DOS */ + "|<>\\\":?*"; /* illegal in DOS & W95 */ + static const char *illegal_chars_w95 = &illegal_chars_dos[8]; + int idx, dot_idx; + const char *s = file_name; + char *d = dos_name; + const char *const dlimit = dos_name + sizeof(dos_name) - 1; + const char *illegal_aliens = illegal_chars_dos; + size_t len = sizeof(illegal_chars_dos) - 1; + + /* Support for Windows 9X VFAT systems, when available. */ + if(_use_lfn(file_name)) { + illegal_aliens = illegal_chars_w95; + len -= (illegal_chars_w95 - illegal_chars_dos); + } + + /* Get past the drive letter, if any. */ + if(s[0] >= 'A' && s[0] <= 'z' && s[1] == ':') { + *d++ = *s++; + *d++ = *s++; + } + + for(idx = 0, dot_idx = -1; *s && d < dlimit; s++, d++) { + if(memchr(illegal_aliens, *s, len)) { + /* Dots are special: DOS doesn't allow them as the leading character, + and a file name cannot have more than a single dot. We leave the + first non-leading dot alone, unless it comes too close to the + beginning of the name: we want sh.lex.c to become sh_lex.c, not + sh.lex-c. */ + if(*s == '.') { + if(idx == 0 && (s[1] == '/' || (s[1] == '.' && s[2] == '/'))) { + /* Copy "./" and "../" verbatim. */ + *d++ = *s++; + if(*s == '.') + *d++ = *s++; + *d = *s; + } + else if(idx == 0) + *d = '_'; + else if(dot_idx >= 0) { + if(dot_idx < 5) { /* 5 is a heuristic ad-hoc'ery */ + d[dot_idx - idx] = '_'; /* replace previous dot */ + *d = '.'; + } + else + *d = '-'; + } + else + *d = '.'; + + if(*s == '.') + dot_idx = idx; + } + else if(*s == '+' && s[1] == '+') { + if(idx - 2 == dot_idx) { /* .c++, .h++ etc. */ + *d++ = 'x'; + *d = 'x'; + } + else { + /* libg++ etc. */ + memcpy (d, "plus", 4); + d += 3; + } + s++; + idx++; + } + else + *d = '_'; + } + else + *d = *s; + if(*s == '/') { + idx = 0; + dot_idx = -1; + } + else + idx++; + } + + *d = '\0'; + return dos_name; +} + +static char *rename_if_dos_device_name (char *file_name) +{ + /* We could have a file whose name is a device on MS-DOS. Trying to + * retrieve such a file would fail at best and wedge us at worst. We need + * to rename such files. */ + char *base; + struct_stat st_buf; + char fname[PATH_MAX]; + + strncpy(fname, file_name, PATH_MAX-1); + fname[PATH_MAX-1] = '\0'; + base = basename(fname); + if(((stat(base, &st_buf)) == 0) && (S_ISCHR(st_buf.st_mode))) { + size_t blen = strlen(base); + + if(strlen(fname) >= PATH_MAX-1) { + /* Make room for the '_' */ + blen--; + base[blen] = '\0'; + } + /* Prepend a '_'. */ + memmove(base + 1, base, blen + 1); + base[0] = '_'; + strcpy(file_name, fname); + } + return file_name; +} + +#if defined(MSDOS) && (defined(__DJGPP__) || defined(__GO32__)) + +/* + * Disable program default argument globbing. We do it on our own. + */ +char **__crt0_glob_function(char *arg) +{ + (void)arg; + return (char**)0; +} + +#endif /* MSDOS && (__DJGPP__ || __GO32__) */ + +#ifdef WIN32 + +/* + * Function to find CACert bundle on a Win32 platform using SearchPath. + * (SearchPath is already declared via inclusions done in setup header file) + * (Use the ASCII version instead of the unicode one!) + * The order of the directories it searches is: + * 1. application's directory + * 2. current working directory + * 3. Windows System directory (e.g. C:\windows\system32) + * 4. Windows Directory (e.g. C:\windows) + * 5. all directories along %PATH% + * + * For WinXP and later search order actually depends on registry value: + * HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SafeProcessSearchMode + */ + +CURLcode FindWin32CACert(struct OperationConfig *config, + const char *bundle_file) +{ + CURLcode result = CURLE_OK; + + /* search and set cert file only if libcurl supports SSL */ + if(curlinfo->features & CURL_VERSION_SSL) { + + DWORD res_len; + DWORD buf_tchar_size = PATH_MAX + 1; + DWORD buf_bytes_size = sizeof(TCHAR) * buf_tchar_size; + char *ptr = NULL; + + char *buf = malloc(buf_bytes_size); + if(!buf) + return CURLE_OUT_OF_MEMORY; + buf[0] = '\0'; + + res_len = SearchPathA(NULL, bundle_file, NULL, buf_tchar_size, buf, &ptr); + if(res_len > 0) { + Curl_safefree(config->cacert); + config->cacert = strdup(buf); + if(!config->cacert) + result = CURLE_OUT_OF_MEMORY; + } + + Curl_safefree(buf); + } + + return result; +} + +#endif /* WIN32 */ + +#endif /* MSDOS || WIN32 */ diff --git a/src/tool_doswin.h b/src/tool_doswin.h new file mode 100644 index 0000000..cd216db --- /dev/null +++ b/src/tool_doswin.h @@ -0,0 +1,46 @@ +#ifndef HEADER_CURL_TOOL_DOSWIN_H +#define HEADER_CURL_TOOL_DOSWIN_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#if defined(MSDOS) || defined(WIN32) + +char *sanitize_dos_name(char *file_name); + +#if defined(MSDOS) && (defined(__DJGPP__) || defined(__GO32__)) + +char **__crt0_glob_function(char *arg); + +#endif /* MSDOS && (__DJGPP__ || __GO32__) */ + +#ifdef WIN32 + +CURLcode FindWin32CACert(struct OperationConfig *config, + const char *bundle_file); + +#endif /* WIN32 */ + +#endif /* MSDOS || WIN32 */ + +#endif /* HEADER_CURL_TOOL_DOSWIN_H */ + diff --git a/src/tool_easysrc.c b/src/tool_easysrc.c new file mode 100644 index 0000000..0482ef6 --- /dev/null +++ b/src/tool_easysrc.c @@ -0,0 +1,229 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifndef CURL_DISABLE_LIBCURL_OPTION + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_easysrc.h" +#include "tool_msgs.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* global variable definitions, for easy-interface source code generation */ + +struct curl_slist *easysrc_decl = NULL; /* Variable declarations */ +struct curl_slist *easysrc_data = NULL; /* Build slists, forms etc. */ +struct curl_slist *easysrc_code = NULL; /* Setopt calls */ +struct curl_slist *easysrc_toohard = NULL; /* Unconvertible setopt */ +struct curl_slist *easysrc_clean = NULL; /* Clean up allocated data */ +int easysrc_form_count = 0; +int easysrc_slist_count = 0; + +static const char *const srchead[]={ + "/********* Sample code generated by the curl command line tool **********", + " * All curl_easy_setopt() options are documented at:", + " * http://curl.haxx.se/libcurl/c/curl_easy_setopt.html", + " ************************************************************************/", + "#include <curl/curl.h>", + "", + "int main(int argc, char *argv[])", + "{", + " CURLcode ret;", + " CURL *hnd;", + NULL +}; +/* easysrc_decl declarations come here */ +/* easysrc_data initialisations come here */ +/* easysrc_code statements come here */ +static const char *const srchard[]={ + "/* Here is a list of options the curl code used that cannot get generated", + " as source easily. You may select to either not use them or implement", + " them yourself.", + "", + NULL +}; +static const char *const srcend[]={ + "", + " return (int)ret;", + "}", + "/**** End of sample code ****/", + NULL +}; + +/* Clean up all source code if we run out of memory */ +static void easysrc_free(void) +{ + curl_slist_free_all(easysrc_decl); + easysrc_decl = NULL; + curl_slist_free_all(easysrc_data); + easysrc_data = NULL; + curl_slist_free_all(easysrc_code); + easysrc_code = NULL; + curl_slist_free_all(easysrc_toohard); + easysrc_toohard = NULL; + curl_slist_free_all(easysrc_clean); + easysrc_clean = NULL; +} + +/* Add a source line to the main code or remarks */ +CURLcode easysrc_add(struct curl_slist **plist, const char *line) +{ + CURLcode ret = CURLE_OK; + struct curl_slist *list = + curl_slist_append(*plist, line); + if(!list) { + easysrc_free(); + ret = CURLE_OUT_OF_MEMORY; + } + else + *plist = list; + return ret; +} + +CURLcode easysrc_addf(struct curl_slist **plist, const char *fmt, ...) +{ + CURLcode ret; + char *bufp; + va_list ap; + va_start(ap, fmt); + bufp = curlx_mvaprintf(fmt, ap); + va_end(ap); + if(! bufp) { + ret = CURLE_OUT_OF_MEMORY; + } + else { + ret = easysrc_add(plist, bufp); + curl_free(bufp); + } + return ret; +} + +#define CHKRET(v) do {CURLcode ret = (v); if(ret) return ret;} WHILE_FALSE + +CURLcode easysrc_init(void) +{ + CHKRET(easysrc_add(&easysrc_code, + "hnd = curl_easy_init();")); + return CURLE_OK; +} + +CURLcode easysrc_perform(void) +{ + /* Note any setopt calls which we could not convert */ + if(easysrc_toohard) { + int i; + struct curl_slist *ptr; + const char *c; + CHKRET(easysrc_add(&easysrc_code, "")); + /* Preamble comment */ + for(i=0; ((c = srchard[i]) != NULL); i++) + CHKRET(easysrc_add(&easysrc_code, c)); + /* Each unconverted option */ + for(ptr=easysrc_toohard; ptr; ptr = ptr->next) + CHKRET(easysrc_add(&easysrc_code, ptr->data)); + CHKRET(easysrc_add(&easysrc_code, "")); + CHKRET(easysrc_add(&easysrc_code, "*/")); + + curl_slist_free_all(easysrc_toohard); + easysrc_toohard = NULL; + } + + CHKRET(easysrc_add(&easysrc_code, "")); + CHKRET(easysrc_add(&easysrc_code, "ret = curl_easy_perform(hnd);")); + CHKRET(easysrc_add(&easysrc_code, "")); + + return CURLE_OK; +} + +CURLcode easysrc_cleanup(void) +{ + CHKRET(easysrc_add(&easysrc_code, "curl_easy_cleanup(hnd);")); + CHKRET(easysrc_add(&easysrc_code, "hnd = NULL;")); + + return CURLE_OK; +} + +void dumpeasysrc(struct GlobalConfig *config) +{ + struct curl_slist *ptr; + char *o = config->libcurl; + + if(o) { + FILE *out; + bool fopened = FALSE; + if(strcmp(o, "-")) { + out = fopen(o, FOPEN_WRITETEXT); + fopened = TRUE; + } + else + out = stdout; + if(!out) + warnf(config, "Failed to open %s to write libcurl code!\n", o); + else { + int i; + const char *c; + + for(i=0; ((c = srchead[i]) != NULL); i++) + fprintf(out, "%s\n", c); + + /* Declare variables used for complex setopt values */ + for(ptr=easysrc_decl; ptr; ptr = ptr->next) + fprintf(out, " %s\n", ptr->data); + + /* Set up complex values for setopt calls */ + if(easysrc_data) { + fprintf(out, "\n"); + + for(ptr=easysrc_data; ptr; ptr = ptr->next) + fprintf(out, " %s\n", ptr->data); + } + + fprintf(out, "\n"); + for(ptr=easysrc_code; ptr; ptr = ptr->next) { + if(ptr->data[0]) { + fprintf(out, " %s\n", ptr->data); + } + else { + fprintf(out, "\n"); + } + } + + for(ptr=easysrc_clean; ptr; ptr = ptr->next) + fprintf(out, " %s\n", ptr->data); + + for(i=0; ((c = srcend[i]) != NULL); i++) + fprintf(out, "%s\n", c); + + if(fopened) + fclose(out); + } + } + + easysrc_free(); +} + +#endif /* CURL_DISABLE_LIBCURL_OPTION */ diff --git a/src/tool_easysrc.h b/src/tool_easysrc.h new file mode 100644 index 0000000..07a4b78 --- /dev/null +++ b/src/tool_easysrc.h @@ -0,0 +1,48 @@ +#ifndef HEADER_CURL_TOOL_EASYSRC_H +#define HEADER_CURL_TOOL_EASYSRC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" +#ifndef CURL_DISABLE_LIBCURL_OPTION + +/* global variable declarations, for easy-interface source code generation */ + +extern struct curl_slist *easysrc_decl; /* Variable declarations */ +extern struct curl_slist *easysrc_data; /* Build slists, forms etc. */ +extern struct curl_slist *easysrc_code; /* Setopt calls etc. */ +extern struct curl_slist *easysrc_toohard; /* Unconvertible setopt */ +extern struct curl_slist *easysrc_clean; /* Clean up (reverse order) */ + +extern int easysrc_form_count; /* Number of curl_httppost variables */ +extern int easysrc_slist_count; /* Number of curl_slist variables */ + +extern CURLcode easysrc_init(void); +extern CURLcode easysrc_add(struct curl_slist **plist, const char *bupf); +extern CURLcode easysrc_addf(struct curl_slist **plist, const char *fmt, ...); +extern CURLcode easysrc_perform(void); +extern CURLcode easysrc_cleanup(void); + +void dumpeasysrc(struct GlobalConfig *config); + +#endif /* CURL_DISABLE_LIBCURL_OPTION */ + +#endif /* HEADER_CURL_TOOL_EASYSRC_H */ diff --git a/src/tool_formparse.c b/src/tool_formparse.c new file mode 100644 index 0000000..f26f259 --- /dev/null +++ b/src/tool_formparse.c @@ -0,0 +1,361 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_mfiles.h" +#include "tool_msgs.h" +#include "tool_formparse.h" + +#include "memdebug.h" /* keep this as LAST include */ + + +/* + * helper function to get a word from form param + * after call get_parm_word, str either point to string end + * or point to any of end chars. + */ +static char *get_param_word(char **str, char **end_pos) +{ + char *ptr = *str; + char *word_begin = NULL; + char *ptr2; + char *escape = NULL; + const char *end_chars = ";,"; + + /* the first non-space char is here */ + word_begin = ptr; + if(*ptr == '"') { + ++ptr; + while(*ptr) { + if(*ptr == '\\') { + if(ptr[1] == '\\' || ptr[1] == '"') { + /* remember the first escape position */ + if(!escape) + escape = ptr; + /* skip escape of back-slash or double-quote */ + ptr += 2; + continue; + } + } + if(*ptr == '"') { + *end_pos = ptr; + if(escape) { + /* has escape, we restore the unescaped string here */ + ptr = ptr2 = escape; + do { + if(*ptr == '\\' && (ptr[1] == '\\' || ptr[1] == '"')) + ++ptr; + *ptr2++ = *ptr++; + } + while(ptr < *end_pos); + *end_pos = ptr2; + } + while(*ptr && NULL==strchr(end_chars, *ptr)) + ++ptr; + *str = ptr; + return word_begin+1; + } + ++ptr; + } + /* end quote is missing, treat it as non-quoted. */ + ptr = word_begin; + } + + while(*ptr && NULL==strchr(end_chars, *ptr)) + ++ptr; + *str = *end_pos = ptr; + return word_begin; +} + +/*************************************************************************** + * + * formparse() + * + * Reads a 'name=value' parameter and builds the appropriate linked list. + * + * Specify files to upload with 'name=@filename', or 'name=@"filename"' + * in case the filename contain ',' or ';'. Supports specified + * given Content-Type of the files. Such as ';type=<content-type>'. + * + * If literal_value is set, any initial '@' or '<' in the value string + * loses its special meaning, as does any embedded ';type='. + * + * You may specify more than one file for a single name (field). Specify + * multiple files by writing it like: + * + * 'name=@filename,filename2,filename3' + * + * or use double-quotes quote the filename: + * + * 'name=@"filename","filename2","filename3"' + * + * If you want content-types specified for each too, write them like: + * + * 'name=@filename;type=image/gif,filename2,filename3' + * + * If you want custom headers added for a single part, write them in a separate + * file and do like this: + * + * 'name=foo;headers=@headerfile' or why not + * 'name=@filemame;headers=@headerfile' + * + * To upload a file, but to fake the file name that will be included in the + * formpost, do like this: + * + * 'name=@filename;filename=/dev/null' or quote the faked filename like: + * 'name=@filename;filename="play, play, and play.txt"' + * + * If filename/path contains ',' or ';', it must be quoted by double-quotes, + * else curl will fail to figure out the correct filename. if the filename + * tobe quoted contains '"' or '\', '"' and '\' must be escaped by backslash. + * + * This function uses curl_formadd to fulfill it's job. Is heavily based on + * the old curl_formparse code. + * + ***************************************************************************/ + +int formparse(struct OperationConfig *config, + const char *input, + struct curl_httppost **httppost, + struct curl_httppost **last_post, + bool literal_value) +{ + /* nextarg MUST be a string in the format 'name=contents' and we'll + build a linked list with the info */ + char name[256]; + char *contents = NULL; + char type_major[128] = ""; + char type_minor[128] = ""; + char *contp; + const char *type = NULL; + char *sep; + + if((1 == sscanf(input, "%255[^=]=", name)) && + ((contp = strchr(input, '=')) != NULL)) { + /* the input was using the correct format */ + + /* Allocate the contents */ + contents = strdup(contp+1); + if(!contents) { + fprintf(config->global->errors, "out of memory\n"); + return 1; + } + contp = contents; + + if('@' == contp[0] && !literal_value) { + + /* we use the @-letter to indicate file name(s) */ + + struct multi_files *multi_start = NULL; + struct multi_files *multi_current = NULL; + + char *ptr = contp; + char *end = ptr + strlen(ptr); + + do { + /* since this was a file, it may have a content-type specifier + at the end too, or a filename. Or both. */ + char *filename = NULL; + char *word_end; + bool semicolon; + + type = NULL; + + ++ptr; + contp = get_param_word(&ptr, &word_end); + semicolon = (';' == *ptr) ? TRUE : FALSE; + *word_end = '\0'; /* terminate the contp */ + + /* have other content, continue parse */ + while(semicolon) { + /* have type or filename field */ + ++ptr; + while(*ptr && (ISSPACE(*ptr))) + ++ptr; + + if(checkprefix("type=", ptr)) { + /* set type pointer */ + type = &ptr[5]; + + /* verify that this is a fine type specifier */ + if(2 != sscanf(type, "%127[^/]/%127[^;,\n]", + type_major, type_minor)) { + warnf(config->global, + "Illegally formatted content-type field!\n"); + Curl_safefree(contents); + FreeMultiInfo(&multi_start, &multi_current); + return 2; /* illegal content-type syntax! */ + } + + /* now point beyond the content-type specifier */ + sep = (char *)type + strlen(type_major)+strlen(type_minor)+1; + + /* there's a semicolon following - we check if it is a filename + specified and if not we simply assume that it is text that + the user wants included in the type and include that too up + to the next sep. */ + ptr = sep; + if(*sep==';') { + if(!checkprefix(";filename=", sep)) { + ptr = sep + 1; + (void)get_param_word(&ptr, &sep); + semicolon = (';' == *ptr) ? TRUE : FALSE; + } + } + else + semicolon = FALSE; + + if(*sep) + *sep = '\0'; /* zero terminate type string */ + } + else if(checkprefix("filename=", ptr)) { + ptr += 9; + filename = get_param_word(&ptr, &word_end); + semicolon = (';' == *ptr) ? TRUE : FALSE; + *word_end = '\0'; + } + else { + /* unknown prefix, skip to next block */ + char *unknown = NULL; + unknown = get_param_word(&ptr, &word_end); + semicolon = (';' == *ptr) ? TRUE : FALSE; + if(*unknown) { + *word_end = '\0'; + warnf(config->global, "skip unknown form field: %s\n", unknown); + } + } + } + /* now ptr point to comma or string end */ + + + /* if type == NULL curl_formadd takes care of the problem */ + + if(*contp && !AddMultiFiles(contp, type, filename, &multi_start, + &multi_current)) { + warnf(config->global, "Error building form post!\n"); + Curl_safefree(contents); + FreeMultiInfo(&multi_start, &multi_current); + return 3; + } + + /* *ptr could be '\0', so we just check with the string end */ + } while(ptr < end); /* loop if there's another file name */ + + /* now we add the multiple files section */ + if(multi_start) { + struct curl_forms *forms = NULL; + struct multi_files *start = multi_start; + unsigned int i, count = 0; + while(start) { + start = start->next; + ++count; + } + forms = malloc((count+1)*sizeof(struct curl_forms)); + if(!forms) { + fprintf(config->global->errors, "Error building form post!\n"); + Curl_safefree(contents); + FreeMultiInfo(&multi_start, &multi_current); + return 4; + } + for(i = 0, start = multi_start; i < count; ++i, start = start->next) { + forms[i].option = start->form.option; + forms[i].value = start->form.value; + } + forms[count].option = CURLFORM_END; + FreeMultiInfo(&multi_start, &multi_current); + if(curl_formadd(httppost, last_post, + CURLFORM_COPYNAME, name, + CURLFORM_ARRAY, forms, CURLFORM_END) != 0) { + warnf(config->global, "curl_formadd failed!\n"); + Curl_safefree(forms); + Curl_safefree(contents); + return 5; + } + Curl_safefree(forms); + } + } + else { + struct curl_forms info[4]; + int i = 0; + char *ct = literal_value ? NULL : strstr(contp, ";type="); + + info[i].option = CURLFORM_COPYNAME; + info[i].value = name; + i++; + + if(ct) { + info[i].option = CURLFORM_CONTENTTYPE; + info[i].value = &ct[6]; + i++; + ct[0] = '\0'; /* zero terminate here */ + } + + if(contp[0]=='<' && !literal_value) { + info[i].option = CURLFORM_FILECONTENT; + info[i].value = contp+1; + i++; + info[i].option = CURLFORM_END; + + if(curl_formadd(httppost, last_post, + CURLFORM_ARRAY, info, CURLFORM_END ) != 0) { + warnf(config->global, "curl_formadd failed, possibly the file %s is " + "bad!\n", contp + 1); + Curl_safefree(contents); + return 6; + } + } + else { +#ifdef CURL_DOES_CONVERSIONS + if(convert_to_network(contp, strlen(contp))) { + warnf(config->global, "curl_formadd failed!\n"); + Curl_safefree(contents); + return 7; + } +#endif + info[i].option = CURLFORM_COPYCONTENTS; + info[i].value = contp; + i++; + info[i].option = CURLFORM_END; + if(curl_formadd(httppost, last_post, + CURLFORM_ARRAY, info, CURLFORM_END) != 0) { + warnf(config->global, "curl_formadd failed!\n"); + Curl_safefree(contents); + return 8; + } + } + } + + } + else { + warnf(config->global, "Illegally formatted input field!\n"); + return 1; + } + Curl_safefree(contents); + return 0; +} diff --git a/src/tool_formparse.h b/src/tool_formparse.h new file mode 100644 index 0000000..f773626 --- /dev/null +++ b/src/tool_formparse.h @@ -0,0 +1,33 @@ +#ifndef HEADER_CURL_TOOL_FORMPARSE_H +#define HEADER_CURL_TOOL_FORMPARSE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +int formparse(struct OperationConfig *config, + const char *input, + struct curl_httppost **httppost, + struct curl_httppost **last_post, + bool literal_value); + +#endif /* HEADER_CURL_TOOL_FORMPARSE_H */ + diff --git a/src/tool_getparam.c b/src/tool_getparam.c new file mode 100644 index 0000000..c86e6b4 --- /dev/null +++ b/src/tool_getparam.c @@ -0,0 +1,1918 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_binmode.h" +#include "tool_cfgable.h" +#include "tool_cb_prg.h" +#include "tool_formparse.h" +#include "tool_getparam.h" +#include "tool_helpers.h" +#include "tool_libinfo.h" +#include "tool_metalink.h" +#include "tool_msgs.h" +#include "tool_paramhlp.h" +#include "tool_parsecfg.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef MSDOS +# define USE_WATT32 +#endif + +#define GetStr(str,val) do { \ + if(*(str)) { \ + free(*(str)); \ + *(str) = NULL; \ + } \ + if((val)) { \ + *(str) = strdup((val)); \ + if(!(*(str))) \ + return PARAM_NO_MEM; \ + } \ +} WHILE_FALSE + +struct LongShort { + const char *letter; /* short name option */ + const char *lname; /* long name option */ + bool extraparam; /* whether it takes an additional argument */ +}; + +static const struct LongShort aliases[]= { + /* all these ones, starting with "*" or "$" as a short-option have *no* + short option to mention. */ + {"*", "url", TRUE}, + {"*4", "dns-ipv4-addr", TRUE}, + {"*6", "dns-ipv6-addr", TRUE}, + {"*a", "random-file", TRUE}, + {"*b", "egd-file", TRUE}, + {"*B", "oauth2-bearer", TRUE}, + {"*c", "connect-timeout", TRUE}, + {"*d", "ciphers", TRUE}, + {"*D", "dns-interface", TRUE}, + {"*e", "disable-epsv", FALSE}, + {"*E", "epsv", FALSE}, + /* 'epsv' made like this to make --no-epsv and --epsv to work + although --disable-epsv is the documented option */ +#ifdef USE_ENVIRONMENT + {"*f", "environment", FALSE}, +#endif + {"*F", "dns-servers", TRUE}, + {"*g", "trace", TRUE}, + {"*G", "npn", FALSE}, + {"*h", "trace-ascii", TRUE}, + {"*H", "alpn", FALSE}, + {"*i", "limit-rate", TRUE}, + {"*j", "compressed", FALSE}, + {"*J", "tr-encoding", FALSE}, + {"*k", "digest", FALSE}, + {"*l", "negotiate", FALSE}, + {"*m", "ntlm", FALSE}, + {"*M", "ntlm-wb", FALSE}, + {"*n", "basic", FALSE}, + {"*o", "anyauth", FALSE}, +#ifdef USE_WATT32 + {"*p", "wdebug", FALSE}, +#endif + {"*q", "ftp-create-dirs", FALSE}, + {"*r", "create-dirs", FALSE}, + {"*s", "max-redirs", TRUE}, + {"*t", "proxy-ntlm", FALSE}, + {"*u", "crlf", FALSE}, + {"*v", "stderr", TRUE}, + {"*w", "interface", TRUE}, + {"*x", "krb" , TRUE}, + {"*x", "krb4" , TRUE}, + /* 'krb4' is the previous name */ + {"*y", "max-filesize", TRUE}, + {"*z", "disable-eprt", FALSE}, + {"*Z", "eprt", FALSE}, + /* 'eprt' made like this to make --no-eprt and --eprt to work + although --disable-eprt is the documented option */ + {"$a", "ftp-ssl", FALSE}, + /* 'ftp-ssl' deprecated name since 7.20.0 */ + {"$a", "ssl", FALSE}, + /* 'ssl' new option name in 7.20.0, previously this was ftp-ssl */ + {"$b", "ftp-pasv", FALSE}, + {"$c", "socks5", TRUE}, + {"$c", "socks", TRUE}, + /* 'socks' is how the option once was documented but we prefer + the --socks5 version for explicit version */ + {"$d", "tcp-nodelay", FALSE}, + {"$e", "proxy-digest", FALSE}, + {"$f", "proxy-basic", FALSE}, + {"$g", "retry", TRUE}, + {"$h", "retry-delay", TRUE}, + {"$i", "retry-max-time", TRUE}, + {"$k", "proxy-negotiate", FALSE}, + {"$m", "ftp-account", TRUE}, + {"$n", "proxy-anyauth", FALSE}, + {"$o", "trace-time", FALSE}, + {"$p", "ignore-content-length", FALSE}, + {"$q", "ftp-skip-pasv-ip", FALSE}, + {"$r", "ftp-method", TRUE}, + {"$s", "local-port", TRUE}, + {"$t", "socks4", TRUE}, + {"$T", "socks4a", TRUE}, + {"$u", "ftp-alternative-to-user", TRUE}, + {"$v", "ftp-ssl-reqd", FALSE}, + /* 'ftp-ssl-reqd' deprecated name since 7.20.0 */ + {"$v", "ssl-reqd", FALSE}, + /* 'ssl-reqd' new in 7.20.0, previously this was ftp-ssl-reqd */ + {"$w", "sessionid", FALSE}, + /* 'sessionid' listed as --no-sessionid in the help */ + {"$x", "ftp-ssl-control", FALSE}, + {"$y", "ftp-ssl-ccc", FALSE}, + {"$j", "ftp-ssl-ccc-mode", TRUE}, + {"$z", "libcurl", TRUE}, + {"$#", "raw", FALSE}, + {"$0", "post301", FALSE}, + {"$1", "keepalive", FALSE}, + /* 'keepalive' listed as --no-keepalive in the help */ + {"$2", "socks5-hostname", TRUE}, + {"$3", "keepalive-time", TRUE}, + {"$4", "post302", FALSE}, + {"$5", "noproxy", TRUE}, +#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) + {"$6", "socks5-gssapi-service", TRUE}, + {"$7", "socks5-gssapi-nec", FALSE}, + {"$O", "proxy-service-name", TRUE}, + {"$P", "service-name", TRUE}, +#endif + {"$8", "proxy1.0", TRUE}, + {"$9", "tftp-blksize", TRUE}, + {"$A", "mail-from", TRUE}, + {"$B", "mail-rcpt", TRUE}, + {"$C", "ftp-pret", FALSE}, + {"$D", "proto", TRUE}, + {"$E", "proto-redir", TRUE}, + {"$F", "resolve", TRUE}, + {"$G", "delegation", TRUE}, + {"$H", "mail-auth", TRUE}, + {"$I", "post303", FALSE}, + {"$J", "metalink", FALSE}, + {"$K", "sasl-ir", FALSE}, + {"$L", "test-event", FALSE}, + {"$M", "unix-socket", TRUE}, + {"$N", "path-as-is", FALSE}, + {"0", "http1.0", FALSE}, + {"01", "http1.1", FALSE}, + {"02", "http2", FALSE}, + {"1", "tlsv1", FALSE}, + {"10", "tlsv1.0", FALSE}, + {"11", "tlsv1.1", FALSE}, + {"12", "tlsv1.2", FALSE}, + {"2", "sslv2", FALSE}, + {"3", "sslv3", FALSE}, + {"4", "ipv4", FALSE}, + {"6", "ipv6", FALSE}, + {"a", "append", FALSE}, + {"A", "user-agent", TRUE}, + {"b", "cookie", TRUE}, + {"B", "use-ascii", FALSE}, + {"c", "cookie-jar", TRUE}, + {"C", "continue-at", TRUE}, + {"d", "data", TRUE}, + {"dr", "data-raw", TRUE}, + {"da", "data-ascii", TRUE}, + {"db", "data-binary", TRUE}, + {"de", "data-urlencode", TRUE}, + {"D", "dump-header", TRUE}, + {"e", "referer", TRUE}, + {"E", "cert", TRUE}, + {"Ea", "cacert", TRUE}, + {"Eb", "cert-type", TRUE}, + {"Ec", "key", TRUE}, + {"Ed", "key-type", TRUE}, + {"Ee", "pass", TRUE}, + {"Ef", "engine", TRUE}, + {"Eg", "capath ", TRUE}, + {"Eh", "pubkey", TRUE}, + {"Ei", "hostpubmd5", TRUE}, + {"Ej", "crlfile", TRUE}, + {"Ek", "tlsuser", TRUE}, + {"El", "tlspassword", TRUE}, + {"Em", "tlsauthtype", TRUE}, + {"En", "ssl-allow-beast", FALSE}, + {"Eo", "login-options", TRUE}, + {"Ep", "pinnedpubkey", TRUE}, + {"Eq", "cert-status", FALSE}, + {"Er", "false-start", FALSE}, + {"f", "fail", FALSE}, + {"F", "form", TRUE}, + {"Fs", "form-string", TRUE}, + {"g", "globoff", FALSE}, + {"G", "get", FALSE}, + {"h", "help", FALSE}, + {"H", "header", TRUE}, + {"Hp", "proxy-header", TRUE}, + {"i", "include", FALSE}, + {"I", "head", FALSE}, + {"j", "junk-session-cookies", FALSE}, + {"J", "remote-header-name", FALSE}, + {"k", "insecure", FALSE}, + {"K", "config", TRUE}, + {"l", "list-only", FALSE}, + {"L", "location", FALSE}, + {"Lt", "location-trusted", FALSE}, + {"m", "max-time", TRUE}, + {"M", "manual", FALSE}, + {"n", "netrc", FALSE}, + {"no", "netrc-optional", FALSE}, + {"ne", "netrc-file", TRUE}, + {"N", "buffer", FALSE}, + /* 'buffer' listed as --no-buffer in the help */ + {"o", "output", TRUE}, + {"O", "remote-name", FALSE}, + {"Oa", "remote-name-all", FALSE}, + {"p", "proxytunnel", FALSE}, + {"P", "ftpport", TRUE}, + /* 'ftpport' old version */ + {"P", "ftp-port", TRUE}, + {"q", "disable", FALSE}, + {"Q", "quote", TRUE}, + {"r", "range", TRUE}, + {"R", "remote-time", FALSE}, + {"s", "silent", FALSE}, + {"S", "show-error", FALSE}, + {"t", "telnet-options", TRUE}, + /* 'telnet-options' documented as telnet-option */ + {"T", "upload-file", TRUE}, + {"u", "user", TRUE}, + {"U", "proxy-user", TRUE}, + {"v", "verbose", FALSE}, + {"V", "version", FALSE}, + {"w", "write-out", TRUE}, + {"x", "proxy", TRUE}, + {"X", "request", TRUE}, + {"X", "http-request", TRUE}, + /* 'http-request' OBSOLETE VERSION */ + {"Y", "speed-limit", TRUE}, + {"y", "speed-time", TRUE}, + {"z", "time-cond", TRUE}, + {"#", "progress-bar", FALSE}, + {":", "next", FALSE}, + {"~", "xattr", FALSE}, +}; + +/* Split the argument of -E to 'certname' and 'passphrase' separated by colon. + * We allow ':' and '\' to be escaped by '\' so that we can use certificate + * nicknames containing ':'. See <https://sourceforge.net/p/curl/bugs/1196/> + * for details. */ +#ifndef UNITTESTS +static +#endif +void parse_cert_parameter(const char *cert_parameter, + char **certname, + char **passphrase) +{ + size_t param_length = strlen(cert_parameter); + size_t span; + const char *param_place = NULL; + char *certname_place = NULL; + *certname = NULL; + *passphrase = NULL; + + /* most trivial assumption: cert_parameter is empty */ + if(param_length == 0) + return; + + /* next less trivial: cert_parameter contains no colon nor backslash; this + * means no passphrase was given and no characters escaped */ + if(!strpbrk(cert_parameter, ":\\")) { + *certname = strdup(cert_parameter); + return; + } + /* deal with escaped chars; find unescaped colon if it exists */ + certname_place = malloc(param_length + 1); + if(!certname_place) + return; + + *certname = certname_place; + param_place = cert_parameter; + while(*param_place) { + span = strcspn(param_place, ":\\"); + strncpy(certname_place, param_place, span); + param_place += span; + certname_place += span; + /* we just ate all the non-special chars. now we're on either a special + * char or the end of the string. */ + switch(*param_place) { + case '\0': + break; + case '\\': + param_place++; + switch(*param_place) { + case '\0': + *certname_place++ = '\\'; + break; + case '\\': + *certname_place++ = '\\'; + param_place++; + break; + case ':': + *certname_place++ = ':'; + param_place++; + break; + default: + *certname_place++ = '\\'; + *certname_place++ = *param_place; + param_place++; + break; + } + break; + case ':': + /* Since we live in a world of weirdness and confusion, the win32 + dudes can use : when using drive letters and thus c:\file:password + needs to work. In order not to break compatibility, we still use : as + separator, but we try to detect when it is used for a file name! On + windows. */ +#ifdef WIN32 + if(param_place && + (param_place == &cert_parameter[1]) && + (cert_parameter[2] == '\\' || cert_parameter[2] == '/') && + (ISALPHA(cert_parameter[0])) ) { + /* colon in the second column, followed by a backslash, and the + first character is an alphabetic letter: + + this is a drive letter colon */ + *certname_place++ = ':'; + param_place++; + break; + } +#endif + /* escaped colons and Windows drive letter colons were handled + * above; if we're still here, this is a separating colon */ + param_place++; + if(strlen(param_place) > 0) { + *passphrase = strdup(param_place); + } + goto done; + } + } +done: + *certname_place = '\0'; +} + +ParameterError getparameter(char *flag, /* f or -long-flag */ + char *nextarg, /* NULL if unset */ + bool *usedarg, /* set to TRUE if the arg + has been used */ + struct GlobalConfig *global, + struct OperationConfig *config) +{ + char letter; + char subletter = '\0'; /* subletters can only occur on long options */ + int rc; + const char *parse = NULL; + unsigned int j; + time_t now; + int hit = -1; + bool longopt = FALSE; + bool singleopt = FALSE; /* when true means '-o foo' used '-ofoo' */ + ParameterError err; + bool toggle = TRUE; /* how to switch boolean options, on or off. Controlled + by using --OPTION or --no-OPTION */ + + + if(('-' != flag[0]) || + (('-' == flag[0]) && ('-' == flag[1]))) { + /* this should be a long name */ + char *word = ('-' == flag[0]) ? flag+2 : flag; + size_t fnam = strlen(word); + int numhits = 0; + + if(!strncmp(word, "no-", 3)) { + /* disable this option but ignore the "no-" part when looking for it */ + word += 3; + toggle = FALSE; + } + + for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) { + if(curlx_strnequal(aliases[j].lname, word, fnam)) { + longopt = TRUE; + numhits++; + if(curlx_raw_equal(aliases[j].lname, word)) { + parse = aliases[j].letter; + hit = j; + numhits = 1; /* a single unique hit */ + break; + } + parse = aliases[j].letter; + hit = j; + } + } + if(numhits > 1) { + /* this is at least the second match! */ + return PARAM_OPTION_AMBIGUOUS; + } + if(hit < 0) { + return PARAM_OPTION_UNKNOWN; + } + } + else { + flag++; /* prefixed with one dash, pass it */ + hit = -1; + parse = flag; + } + + do { + /* we can loop here if we have multiple single-letters */ + + if(!longopt) { + letter = (char)*parse; + subletter='\0'; + } + else { + letter = parse[0]; + subletter = parse[1]; + } + *usedarg = FALSE; /* default is that we don't use the arg */ + + if(hit < 0) { + for(j = 0; j < sizeof(aliases)/sizeof(aliases[0]); j++) { + if(letter == aliases[j].letter[0]) { + hit = j; + break; + } + } + if(hit < 0) { + return PARAM_OPTION_UNKNOWN; + } + } + + if(aliases[hit].extraparam) { + /* this option requires an extra parameter */ + if(!longopt && parse[1]) { + nextarg = (char *)&parse[1]; /* this is the actual extra parameter */ + singleopt = TRUE; /* don't loop anymore after this */ + } + else if(!nextarg) + return PARAM_REQUIRES_PARAMETER; + else + *usedarg = TRUE; /* mark it as used */ + } + + switch(letter) { + case '*': /* options without a short option */ + switch(subletter) { + case '4': /* --dns-ipv4-addr */ + /* addr in dot notation */ + GetStr(&config->dns_ipv4_addr, nextarg); + break; + case '6': /* --dns-ipv6-addr */ + /* addr in dot notation */ + GetStr(&config->dns_ipv6_addr, nextarg); + break; + case 'a': /* random-file */ + GetStr(&config->random_file, nextarg); + break; + case 'b': /* egd-file */ + GetStr(&config->egd_file, nextarg); + break; + case 'B': /* XOAUTH2 Bearer */ + GetStr(&config->xoauth2_bearer, nextarg); + break; + case 'c': /* connect-timeout */ + err = str2udouble(&config->connecttimeout, nextarg); + if(err) + return err; + break; + case 'd': /* ciphers */ + GetStr(&config->cipher_list, nextarg); + break; + case 'D': /* --dns-interface */ + /* interface name */ + GetStr(&config->dns_interface, nextarg); + break; + case 'e': /* --disable-epsv */ + config->disable_epsv = toggle; + break; + case 'E': /* --epsv */ + config->disable_epsv = (!toggle)?TRUE:FALSE; + break; +#ifdef USE_ENVIRONMENT + case 'f': + config->writeenv = toggle; + break; +#endif + case 'F': /* --dns-servers */ + /* IP addrs of DNS servers */ + GetStr(&config->dns_servers, nextarg); + break; + case 'g': /* --trace */ + GetStr(&global->trace_dump, nextarg); + if(global->tracetype && (global->tracetype != TRACE_BIN)) + warnf(global, "--trace overrides an earlier trace/verbose option\n"); + global->tracetype = TRACE_BIN; + break; + case 'G': /* --npn */ + config->nonpn = (!toggle)?TRUE:FALSE; + break; + case 'h': /* --trace-ascii */ + GetStr(&global->trace_dump, nextarg); + if(global->tracetype && (global->tracetype != TRACE_ASCII)) + warnf(global, + "--trace-ascii overrides an earlier trace/verbose option\n"); + global->tracetype = TRACE_ASCII; + break; + case 'H': /* --alpn */ + config->noalpn = (!toggle)?TRUE:FALSE; + break; + case 'i': /* --limit-rate */ + { + /* We support G, M, K too */ + char *unit; + curl_off_t value = curlx_strtoofft(nextarg, &unit, 0); + + if(!*unit) + unit = (char *)"b"; + else if(strlen(unit) > 1) + unit = (char *)"w"; /* unsupported */ + + switch(*unit) { + case 'G': + case 'g': + value *= 1024*1024*1024; + break; + case 'M': + case 'm': + value *= 1024*1024; + break; + case 'K': + case 'k': + value *= 1024; + break; + case 'b': + case 'B': + /* for plain bytes, leave as-is */ + break; + default: + warnf(global, "unsupported rate unit. Use G, M, K or B!\n"); + return PARAM_BAD_USE; + } + config->recvpersecond = value; + config->sendpersecond = value; + } + break; + + case 'j': /* --compressed */ + if(toggle && !(curlinfo->features & CURL_VERSION_LIBZ)) + return PARAM_LIBCURL_DOESNT_SUPPORT; + config->encoding = toggle; + break; + + case 'J': /* --tr-encoding */ + config->tr_encoding = toggle; + break; + + case 'k': /* --digest */ + if(toggle) + config->authtype |= CURLAUTH_DIGEST; + else + config->authtype &= ~CURLAUTH_DIGEST; + break; + + case 'l': /* --negotiate */ + if(toggle) { + if(curlinfo->features & CURL_VERSION_SPNEGO) + config->authtype |= CURLAUTH_NEGOTIATE; + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + } + else + config->authtype &= ~CURLAUTH_NEGOTIATE; + break; + + case 'm': /* --ntlm */ + if(toggle) { + if(curlinfo->features & CURL_VERSION_NTLM) + config->authtype |= CURLAUTH_NTLM; + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + } + else + config->authtype &= ~CURLAUTH_NTLM; + break; + + case 'M': /* --ntlm-wb */ + if(toggle) { + if(curlinfo->features & CURL_VERSION_NTLM_WB) + config->authtype |= CURLAUTH_NTLM_WB; + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + } + else + config->authtype &= ~CURLAUTH_NTLM_WB; + break; + + case 'n': /* --basic for completeness */ + if(toggle) + config->authtype |= CURLAUTH_BASIC; + else + config->authtype &= ~CURLAUTH_BASIC; + break; + + case 'o': /* --anyauth, let libcurl pick it */ + if(toggle) + config->authtype = CURLAUTH_ANY; + /* --no-anyauth simply doesn't touch it */ + break; + +#ifdef USE_WATT32 + case 'p': /* --wdebug */ + dbug_init(); + break; +#endif + case 'q': /* --ftp-create-dirs */ + config->ftp_create_dirs = toggle; + break; + + case 'r': /* --create-dirs */ + config->create_dirs = toggle; + break; + + case 's': /* --max-redirs */ + /* specified max no of redirects (http(s)), this accepts -1 as a + special condition */ + err = str2num(&config->maxredirs, nextarg); + if(err) + return err; + if(config->maxredirs < -1) + return PARAM_BAD_NUMERIC; + break; + + case 't': /* --proxy-ntlm */ + if(curlinfo->features & CURL_VERSION_NTLM) + config->proxyntlm = toggle; + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + + case 'u': /* --crlf */ + /* LF -> CRLF conversion? */ + config->crlf = toggle; + break; + + case 'v': /* --stderr */ + if(strcmp(nextarg, "-")) { + FILE *newfile = fopen(nextarg, FOPEN_WRITETEXT); + if(!newfile) + warnf(global, "Failed to open %s!\n", nextarg); + else { + if(global->errors_fopened) + fclose(global->errors); + global->errors = newfile; + global->errors_fopened = TRUE; + } + } + else + global->errors = stdout; + break; + case 'w': /* --interface */ + /* interface */ + GetStr(&config->iface, nextarg); + break; + case 'x': /* --krb */ + /* kerberos level string */ + if(curlinfo->features & CURL_VERSION_KERBEROS4) + GetStr(&config->krblevel, nextarg); + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + case 'y': /* --max-filesize */ + err = str2offset(&config->max_filesize, nextarg); + if(err) + return err; + break; + case 'z': /* --disable-eprt */ + config->disable_eprt = toggle; + break; + case 'Z': /* --eprt */ + config->disable_eprt = (!toggle)?TRUE:FALSE; + break; + + default: /* the URL! */ + { + struct getout *url; + if(config->url_get || ((config->url_get = config->url_list) != NULL)) { + /* there's a node here, if it already is filled-in continue to find + an "empty" node */ + while(config->url_get && (config->url_get->flags & GETOUT_URL)) + config->url_get = config->url_get->next; + } + + /* now there might or might not be an available node to fill in! */ + + if(config->url_get) + /* existing node */ + url = config->url_get; + else + /* there was no free node, create one! */ + url = new_getout(config); + + if(!url) + return PARAM_NO_MEM; + else { + /* fill in the URL */ + GetStr(&url->url, nextarg); + url->flags |= GETOUT_URL; + } + } + } + break; + case '$': /* more options without a short option */ + switch(subletter) { + case 'a': /* --ftp-ssl */ + if(toggle && !(curlinfo->features & CURL_VERSION_SSL)) + return PARAM_LIBCURL_DOESNT_SUPPORT; + config->ftp_ssl = toggle; + break; + case 'b': /* --ftp-pasv */ + Curl_safefree(config->ftpport); + break; + case 'c': /* --socks5 specifies a socks5 proxy to use, and resolves + the name locally and passes on the resolved address */ + GetStr(&config->socksproxy, nextarg); + config->socksver = CURLPROXY_SOCKS5; + break; + case 't': /* --socks4 specifies a socks4 proxy to use */ + GetStr(&config->socksproxy, nextarg); + config->socksver = CURLPROXY_SOCKS4; + break; + case 'T': /* --socks4a specifies a socks4a proxy to use */ + GetStr(&config->socksproxy, nextarg); + config->socksver = CURLPROXY_SOCKS4A; + break; + case '2': /* --socks5-hostname specifies a socks5 proxy and enables name + resolving with the proxy */ + GetStr(&config->socksproxy, nextarg); + config->socksver = CURLPROXY_SOCKS5_HOSTNAME; + break; + case 'd': /* --tcp-nodelay option */ + config->tcp_nodelay = toggle; + break; + case 'e': /* --proxy-digest */ + config->proxydigest = toggle; + break; + case 'f': /* --proxy-basic */ + config->proxybasic = toggle; + break; + case 'g': /* --retry */ + err = str2unum(&config->req_retry, nextarg); + if(err) + return err; + break; + case 'h': /* --retry-delay */ + err = str2unum(&config->retry_delay, nextarg); + if(err) + return err; + break; + case 'i': /* --retry-max-time */ + err = str2unum(&config->retry_maxtime, nextarg); + if(err) + return err; + break; + + case 'k': /* --proxy-negotiate */ + if(curlinfo->features & CURL_VERSION_SPNEGO) + config->proxynegotiate = toggle; + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + + case 'm': /* --ftp-account */ + GetStr(&config->ftp_account, nextarg); + break; + case 'n': /* --proxy-anyauth */ + config->proxyanyauth = toggle; + break; + case 'o': /* --trace-time */ + global->tracetime = toggle; + break; + case 'p': /* --ignore-content-length */ + config->ignorecl = toggle; + break; + case 'q': /* --ftp-skip-pasv-ip */ + config->ftp_skip_ip = toggle; + break; + case 'r': /* --ftp-method (undocumented at this point) */ + config->ftp_filemethod = ftpfilemethod(config, nextarg); + break; + case 's': /* --local-port */ + rc = sscanf(nextarg, "%d - %d", + &config->localport, + &config->localportrange); + if(!rc) + return PARAM_BAD_USE; + else if(rc == 1) + config->localportrange = 1; /* default number of ports to try */ + else { + config->localportrange -= config->localport; + if(config->localportrange < 1) { + warnf(global, "bad range input\n"); + return PARAM_BAD_USE; + } + } + break; + case 'u': /* --ftp-alternative-to-user */ + GetStr(&config->ftp_alternative_to_user, nextarg); + break; + case 'v': /* --ftp-ssl-reqd */ + if(toggle && !(curlinfo->features & CURL_VERSION_SSL)) + return PARAM_LIBCURL_DOESNT_SUPPORT; + config->ftp_ssl_reqd = toggle; + break; + case 'w': /* --no-sessionid */ + config->disable_sessionid = (!toggle)?TRUE:FALSE; + break; + case 'x': /* --ftp-ssl-control */ + if(toggle && !(curlinfo->features & CURL_VERSION_SSL)) + return PARAM_LIBCURL_DOESNT_SUPPORT; + config->ftp_ssl_control = toggle; + break; + case 'y': /* --ftp-ssl-ccc */ + config->ftp_ssl_ccc = toggle; + if(!config->ftp_ssl_ccc_mode) + config->ftp_ssl_ccc_mode = CURLFTPSSL_CCC_PASSIVE; + break; + case 'j': /* --ftp-ssl-ccc-mode */ + config->ftp_ssl_ccc = TRUE; + config->ftp_ssl_ccc_mode = ftpcccmethod(config, nextarg); + break; + case 'z': /* --libcurl */ +#ifdef CURL_DISABLE_LIBCURL_OPTION + warnf(global, + "--libcurl option was disabled at build-time!\n"); + return PARAM_OPTION_UNKNOWN; +#else + GetStr(&global->libcurl, nextarg); + break; +#endif + case '#': /* --raw */ + config->raw = toggle; + break; + case '0': /* --post301 */ + config->post301 = toggle; + break; + case '1': /* --no-keepalive */ + config->nokeepalive = (!toggle)?TRUE:FALSE; + break; + case '3': /* --keepalive-time */ + err = str2unum(&config->alivetime, nextarg); + if(err) + return err; + break; + case '4': /* --post302 */ + config->post302 = toggle; + break; + case 'I': /* --post303 */ + config->post303 = toggle; + break; + case '5': /* --noproxy */ + /* This specifies the noproxy list */ + GetStr(&config->noproxy, nextarg); + break; +#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) + case '6': /* --socks5-gssapi-service */ + GetStr(&config->socks5_gssapi_service, nextarg); + break; + case '7': /* --socks5-gssapi-nec*/ + config->socks5_gssapi_nec = toggle; + break; + case 'O': /* --proxy-service-name */ + GetStr(&config->proxy_service_name, nextarg); + break; + case 'P': /* --service-name */ + GetStr(&config->service_name, nextarg); + break; +#endif + case '8': /* --proxy1.0 */ + /* http 1.0 proxy */ + GetStr(&config->proxy, nextarg); + config->proxyver = CURLPROXY_HTTP_1_0; + break; + case '9': /* --tftp-blksize */ + err = str2unum(&config->tftp_blksize, nextarg); + if(err) + return err; + break; + case 'A': /* --mail-from */ + GetStr(&config->mail_from, nextarg); + break; + case 'B': /* --mail-rcpt */ + /* append receiver to a list */ + err = add2list(&config->mail_rcpt, nextarg); + if(err) + return err; + break; + case 'C': /* --ftp-pret */ + config->ftp_pret = toggle; + break; + case 'D': /* --proto */ + config->proto_present = TRUE; + if(proto2num(config, &config->proto, nextarg)) + return PARAM_BAD_USE; + break; + case 'E': /* --proto-redir */ + config->proto_redir_present = TRUE; + if(proto2num(config, &config->proto_redir, nextarg)) + return PARAM_BAD_USE; + break; + case 'F': /* --resolve */ + err = add2list(&config->resolve, nextarg); + if(err) + return err; + break; + case 'G': /* --delegation LEVEL */ + config->gssapi_delegation = delegation(config, nextarg); + break; + case 'H': /* --mail-auth */ + GetStr(&config->mail_auth, nextarg); + break; + case 'J': /* --metalink */ + { +#ifdef USE_METALINK + int mlmaj, mlmin, mlpatch; + metalink_get_version(&mlmaj, &mlmin, &mlpatch); + if((mlmaj*10000)+(mlmin*100)+mlpatch < CURL_REQ_LIBMETALINK_VERS) { + warnf(global, + "--metalink option cannot be used because the version of " + "the linked libmetalink library is too old. " + "Required: %d.%d.%d, found %d.%d.%d\n", + CURL_REQ_LIBMETALINK_MAJOR, + CURL_REQ_LIBMETALINK_MINOR, + CURL_REQ_LIBMETALINK_PATCH, + mlmaj, mlmin, mlpatch); + return PARAM_BAD_USE; + } + else + config->use_metalink = toggle; +#else + warnf(global, "--metalink option is ignored because the binary is " + "built without the Metalink support.\n"); +#endif + break; + } + case 'K': /* --sasl-ir */ + config->sasl_ir = toggle; + break; + case 'L': /* --test-event */ +#ifdef CURLDEBUG + config->test_event_based = toggle; +#else + warnf(global, "--test-event is ignored unless a debug build!\n"); +#endif + break; + case 'M': /* --unix-socket */ + GetStr(&config->unix_socket_path, nextarg); + break; + case 'N': /* --path-as-is */ + config->path_as_is = toggle; + break; + } + break; + case '#': /* --progress-bar */ + if(toggle) + global->progressmode = CURL_PROGRESS_BAR; + else + global->progressmode = CURL_PROGRESS_STATS; + break; + case ':': /* --next */ + return PARAM_NEXT_OPERATION; + case '~': /* --xattr */ + config->xattr = toggle; + break; + case '0': /* --http* options */ + switch(subletter) { + case '\0': + /* HTTP version 1.0 */ + config->httpversion = CURL_HTTP_VERSION_1_0; + break; + case '1': + /* HTTP version 1.1 */ + config->httpversion = CURL_HTTP_VERSION_1_1; + break; + case '2': + /* HTTP version 2.0 */ + config->httpversion = CURL_HTTP_VERSION_2_0; + break; + } + break; + case '1': /* --tlsv1* options */ + switch(subletter) { + case '\0': + /* TLS version 1.x */ + config->ssl_version = CURL_SSLVERSION_TLSv1; + break; + case '0': + /* TLS version 1.0 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_0; + break; + case '1': + /* TLS version 1.1 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_1; + break; + case '2': + /* TLS version 1.2 */ + config->ssl_version = CURL_SSLVERSION_TLSv1_2; + break; + } + break; + case '2': + /* SSL version 2 */ + config->ssl_version = CURL_SSLVERSION_SSLv2; + break; + case '3': + /* SSL version 3 */ + config->ssl_version = CURL_SSLVERSION_SSLv3; + break; + case '4': + /* IPv4 */ + config->ip_version = 4; + break; + case '6': + /* IPv6 */ + config->ip_version = 6; + break; + case 'a': + /* This makes the FTP sessions use APPE instead of STOR */ + config->ftp_append = toggle; + break; + case 'A': + /* This specifies the User-Agent name */ + GetStr(&config->useragent, nextarg); + break; + case 'b': /* cookie string coming up: */ + if(nextarg[0] == '@') { + nextarg++; + } + else if(strchr(nextarg, '=')) { + /* A cookie string must have a =-letter */ + GetStr(&config->cookie, nextarg); + break; + } + /* We have a cookie file to read from! */ + GetStr(&config->cookiefile, nextarg); + break; + case 'B': + /* use ASCII/text when transferring */ + config->use_ascii = toggle; + break; + case 'c': + /* get the file name to dump all cookies in */ + GetStr(&config->cookiejar, nextarg); + break; + case 'C': + /* This makes us continue an ftp transfer at given position */ + if(!curlx_strequal(nextarg, "-")) { + err = str2offset(&config->resume_from, nextarg); + if(err) + return err; + config->resume_from_current = FALSE; + } + else { + config->resume_from_current = TRUE; + config->resume_from = 0; + } + config->use_resume=TRUE; + break; + case 'd': + /* postfield data */ + { + char *postdata = NULL; + FILE *file; + size_t size = 0; + bool raw_mode = (subletter == 'r'); + + if(subletter == 'e') { /* --data-urlencode*/ + /* [name]=[content], we encode the content part only + * [name]@[file name] + * + * Case 2: we first load the file using that name and then encode + * the content. + */ + const char *p = strchr(nextarg, '='); + size_t nlen; + char is_file; + if(!p) + /* there was no '=' letter, check for a '@' instead */ + p = strchr(nextarg, '@'); + if(p) { + nlen = p - nextarg; /* length of the name part */ + is_file = *p++; /* pass the separator */ + } + else { + /* neither @ nor =, so no name and it isn't a file */ + nlen = is_file = 0; + p = nextarg; + } + if('@' == is_file) { + /* a '@' letter, it means that a file name or - (stdin) follows */ + if(curlx_strequal("-", p)) { + file = stdin; + set_binmode(stdin); + } + else { + file = fopen(p, "rb"); + if(!file) + warnf(global, + "Couldn't read data from file \"%s\", this makes " + "an empty POST.\n", nextarg); + } + + err = file2memory(&postdata, &size, file); + + if(file && (file != stdin)) + fclose(file); + if(err) + return err; + } + else { + GetStr(&postdata, p); + if(postdata) + size = strlen(postdata); + } + + if(!postdata) { + /* no data from the file, point to a zero byte string to make this + get sent as a POST anyway */ + postdata = strdup(""); + if(!postdata) + return PARAM_NO_MEM; + size = 0; + } + else { + char *enc = curl_easy_escape(config->easy, postdata, (int)size); + Curl_safefree(postdata); /* no matter if it worked or not */ + if(enc) { + /* now make a string with the name from above and append the + encoded string */ + size_t outlen = nlen + strlen(enc) + 2; + char *n = malloc(outlen); + if(!n) { + curl_free(enc); + return PARAM_NO_MEM; + } + if(nlen > 0) { /* only append '=' if we have a name */ + snprintf(n, outlen, "%.*s=%s", nlen, nextarg, enc); + size = outlen-1; + } + else { + strcpy(n, enc); + size = outlen-2; /* since no '=' was inserted */ + } + curl_free(enc); + postdata = n; + } + else + return PARAM_NO_MEM; + } + } + else if('@' == *nextarg && !raw_mode) { + /* the data begins with a '@' letter, it means that a file name + or - (stdin) follows */ + nextarg++; /* pass the @ */ + + if(curlx_strequal("-", nextarg)) { + file = stdin; + if(subletter == 'b') /* forced data-binary */ + set_binmode(stdin); + } + else { + file = fopen(nextarg, "rb"); + if(!file) + warnf(global, "Couldn't read data from file \"%s\", this makes " + "an empty POST.\n", nextarg); + } + + if(subletter == 'b') + /* forced binary */ + err = file2memory(&postdata, &size, file); + else { + err = file2string(&postdata, file); + if(postdata) + size = strlen(postdata); + } + + if(file && (file != stdin)) + fclose(file); + if(err) + return err; + + if(!postdata) { + /* no data from the file, point to a zero byte string to make this + get sent as a POST anyway */ + postdata = strdup(""); + if(!postdata) + return PARAM_NO_MEM; + } + } + else { + GetStr(&postdata, nextarg); + if(postdata) + size = strlen(postdata); + } + +#ifdef CURL_DOES_CONVERSIONS + if(subletter != 'b') { + /* NOT forced binary, convert to ASCII */ + if(convert_to_network(postdata, strlen(postdata))) { + Curl_safefree(postdata); + return PARAM_NO_MEM; + } + } +#endif + + if(config->postfields) { + /* we already have a string, we append this one with a separating + &-letter */ + char *oldpost = config->postfields; + curl_off_t oldlen = config->postfieldsize; + curl_off_t newlen = oldlen + curlx_uztoso(size) + 2; + config->postfields = malloc((size_t)newlen); + if(!config->postfields) { + Curl_safefree(oldpost); + Curl_safefree(postdata); + return PARAM_NO_MEM; + } + memcpy(config->postfields, oldpost, (size_t)oldlen); + /* use byte value 0x26 for '&' to accommodate non-ASCII platforms */ + config->postfields[oldlen] = '\x26'; + memcpy(&config->postfields[oldlen+1], postdata, size); + config->postfields[oldlen+1+size] = '\0'; + Curl_safefree(oldpost); + Curl_safefree(postdata); + config->postfieldsize += size+1; + } + else { + config->postfields = postdata; + config->postfieldsize = curlx_uztoso(size); + } + } + /* + We can't set the request type here, as this data might be used in + a simple GET if -G is used. Already or soon. + + if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq)) { + Curl_safefree(postdata); + return PARAM_BAD_USE; + } + */ + break; + case 'D': + /* dump-header to given file name */ + GetStr(&config->headerfile, nextarg); + break; + case 'e': + { + char *ptr = strstr(nextarg, ";auto"); + if(ptr) { + /* Automatic referer requested, this may be combined with a + set initial one */ + config->autoreferer = TRUE; + *ptr = 0; /* zero terminate here */ + } + else + config->autoreferer = FALSE; + GetStr(&config->referer, nextarg); + } + break; + case 'E': + switch(subletter) { + case 'a': /* CA info PEM file */ + /* CA info PEM file */ + GetStr(&config->cacert, nextarg); + break; + case 'b': /* cert file type */ + GetStr(&config->cert_type, nextarg); + break; + case 'c': /* private key file */ + GetStr(&config->key, nextarg); + break; + case 'd': /* private key file type */ + GetStr(&config->key_type, nextarg); + break; + case 'e': /* private key passphrase */ + GetStr(&config->key_passwd, nextarg); + cleanarg(nextarg); + break; + case 'f': /* crypto engine */ + GetStr(&config->engine, nextarg); + if(config->engine && curlx_raw_equal(config->engine, "list")) + return PARAM_ENGINES_REQUESTED; + break; + case 'g': /* CA info PEM file */ + /* CA cert directory */ + GetStr(&config->capath, nextarg); + break; + case 'h': /* --pubkey public key file */ + GetStr(&config->pubkey, nextarg); + break; + case 'i': /* --hostpubmd5 md5 of the host public key */ + GetStr(&config->hostpubmd5, nextarg); + if(!config->hostpubmd5 || strlen(config->hostpubmd5) != 32) + return PARAM_BAD_USE; + break; + case 'j': /* CRL info PEM file */ + /* CRL file */ + GetStr(&config->crlfile, nextarg); + break; + case 'k': /* TLS username */ + if(curlinfo->features & CURL_VERSION_TLSAUTH_SRP) + GetStr(&config->tls_username, nextarg); + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + case 'l': /* TLS password */ + if(curlinfo->features & CURL_VERSION_TLSAUTH_SRP) + GetStr(&config->tls_password, nextarg); + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + case 'm': /* TLS authentication type */ + if(curlinfo->features & CURL_VERSION_TLSAUTH_SRP) { + GetStr(&config->tls_authtype, nextarg); + if(!strequal(config->tls_authtype, "SRP")) + return PARAM_LIBCURL_DOESNT_SUPPORT; /* only support TLS-SRP */ + } + else + return PARAM_LIBCURL_DOESNT_SUPPORT; + break; + case 'n': /* no empty SSL fragments, --ssl-allow-beast */ + if(curlinfo->features & CURL_VERSION_SSL) + config->ssl_allow_beast = toggle; + break; + + case 'o': /* --login-options */ + GetStr(&config->login_options, nextarg); + break; + + case 'p': /* Pinned public key DER file */ + /* Pinned public key DER file */ + GetStr(&config->pinnedpubkey, nextarg); + break; + + case 'q': /* --cert-status */ + config->verifystatus = TRUE; + break; + + case 'r': /* --false-start */ + config->falsestart = TRUE; + break; + + default: /* certificate file */ + { + char *certname, *passphrase; + parse_cert_parameter(nextarg, &certname, &passphrase); + Curl_safefree(config->cert); + config->cert = certname; + if(passphrase) { + Curl_safefree(config->key_passwd); + config->key_passwd = passphrase; + } + cleanarg(nextarg); + } + } + break; + case 'f': + /* fail hard on errors */ + config->failonerror = toggle; + break; + case 'F': + /* "form data" simulation, this is a little advanced so lets do our best + to sort this out slowly and carefully */ + if(formparse(config, + nextarg, + &config->httppost, + &config->last_post, + (subletter=='s')?TRUE:FALSE)) /* 's' means literal string */ + return PARAM_BAD_USE; + if(SetHTTPrequest(config, HTTPREQ_POST, &config->httpreq)) + return PARAM_BAD_USE; + break; + + case 'g': /* g disables URLglobbing */ + config->globoff = toggle; + break; + + case 'G': /* HTTP GET */ + config->use_httpget = TRUE; + break; + + case 'h': /* h for help */ + if(toggle) { + return PARAM_HELP_REQUESTED; + } + /* we now actually support --no-help too! */ + break; + case 'H': + /* A custom header to append to a list */ + if(subletter == 'p') /* --proxy-header */ + err = add2list(&config->proxyheaders, nextarg); + else + err = add2list(&config->headers, nextarg); + if(err) + return err; + break; + case 'i': + config->include_headers = toggle; /* include the headers as well in the + general output stream */ + break; + case 'j': + config->cookiesession = toggle; + break; + case 'I': + /* + * no_body will imply include_headers later on + */ + config->no_body = toggle; + if(SetHTTPrequest(config, + (config->no_body)?HTTPREQ_HEAD:HTTPREQ_GET, + &config->httpreq)) + return PARAM_BAD_USE; + break; + case 'J': /* --remote-header-name */ + if(config->include_headers) { + warnf(global, + "--include and --remote-header-name cannot be combined.\n"); + return PARAM_BAD_USE; + } + config->content_disposition = toggle; + break; + case 'k': /* allow insecure SSL connects */ + config->insecure_ok = toggle; + break; + case 'K': /* parse config file */ + if(parseconfig(nextarg, global)) + warnf(global, "error trying read config from the '%s' file\n", + nextarg); + break; + case 'l': + config->dirlistonly = toggle; /* only list the names of the FTP dir */ + break; + case 'L': + config->followlocation = toggle; /* Follow Location: HTTP headers */ + switch (subletter) { + case 't': + /* Continue to send authentication (user+password) when following + * locations, even when hostname changed */ + config->unrestricted_auth = toggle; + break; + } + break; + case 'm': + /* specified max time */ + err = str2udouble(&config->timeout, nextarg); + if(err) + return err; + break; + case 'M': /* M for manual, huge help */ + if(toggle) { /* --no-manual shows no manual... */ +#ifdef USE_MANUAL + return PARAM_MANUAL_REQUESTED; +#else + warnf(global, + "built-in manual was disabled at build-time!\n"); + return PARAM_OPTION_UNKNOWN; +#endif + } + break; + case 'n': + switch(subletter) { + case 'o': /* CA info PEM file */ + /* use .netrc or URL */ + config->netrc_opt = toggle; + break; + case 'e': /* netrc-file */ + GetStr(&config->netrc_file, nextarg); + break; + default: + /* pick info from .netrc, if this is used for http, curl will + automatically enfore user+password with the request */ + config->netrc = toggle; + break; + } + break; + case 'N': + /* disable the output I/O buffering. note that the option is called + --buffer but is mostly used in the negative form: --no-buffer */ + if(longopt) + config->nobuffer = (!toggle)?TRUE:FALSE; + else + config->nobuffer = toggle; + break; + case 'O': /* --remote-name */ + if(subletter == 'a') { /* --remote-name-all */ + config->default_node_flags = toggle?GETOUT_USEREMOTE:0; + break; + } + /* fall-through! */ + case 'o': /* --output */ + /* output file */ + { + struct getout *url; + if(config->url_out || ((config->url_out = config->url_list) != NULL)) { + /* there's a node here, if it already is filled-in continue to find + an "empty" node */ + while(config->url_out && (config->url_out->flags & GETOUT_OUTFILE)) + config->url_out = config->url_out->next; + } + + /* now there might or might not be an available node to fill in! */ + + if(config->url_out) + /* existing node */ + url = config->url_out; + else + /* there was no free node, create one! */ + url = new_getout(config); + + if(!url) + return PARAM_NO_MEM; + else { + /* fill in the outfile */ + if('o' == letter) { + GetStr(&url->outfile, nextarg); + url->flags &= ~GETOUT_USEREMOTE; /* switch off */ + } + else { + url->outfile = NULL; /* leave it */ + if(toggle) + url->flags |= GETOUT_USEREMOTE; /* switch on */ + else + url->flags &= ~GETOUT_USEREMOTE; /* switch off */ + } + url->flags |= GETOUT_OUTFILE; + } + } + break; + case 'P': + /* This makes the FTP sessions use PORT instead of PASV */ + /* use <eth0> or <192.168.10.10> style addresses. Anything except + this will make us try to get the "default" address. + NOTE: this is a changed behaviour since the released 4.1! + */ + GetStr(&config->ftpport, nextarg); + break; + case 'p': + /* proxy tunnel for non-http protocols */ + config->proxytunnel = toggle; + break; + + case 'q': /* if used first, already taken care of, we do it like + this so we don't cause an error! */ + break; + case 'Q': + /* QUOTE command to send to FTP server */ + switch(nextarg[0]) { + case '-': + /* prefixed with a dash makes it a POST TRANSFER one */ + nextarg++; + err = add2list(&config->postquote, nextarg); + break; + case '+': + /* prefixed with a plus makes it a just-before-transfer one */ + nextarg++; + err = add2list(&config->prequote, nextarg); + break; + default: + err = add2list(&config->quote, nextarg); + break; + } + if(err) + return err; + break; + case 'r': + /* Specifying a range WITHOUT A DASH will create an illegal HTTP range + (and won't actually be range by definition). The man page previously + claimed that to be a good way, why this code is added to work-around + it. */ + if(ISDIGIT(*nextarg) && !strchr(nextarg, '-')) { + char buffer[32]; + curl_off_t off; + warnf(global, + "A specified range MUST include at least one dash (-). " + "Appending one for you!\n"); + off = curlx_strtoofft(nextarg, NULL, 10); + snprintf(buffer, sizeof(buffer), "%" CURL_FORMAT_CURL_OFF_T "-", off); + Curl_safefree(config->range); + config->range = strdup(buffer); + if(!config->range) + return PARAM_NO_MEM; + } + { + /* byte range requested */ + char *tmp_range; + tmp_range = nextarg; + while(*tmp_range != '\0') { + if(!ISDIGIT(*tmp_range) && *tmp_range != '-' && *tmp_range != ',') { + warnf(global, "Invalid character is found in given range. " + "A specified range MUST have only digits in " + "\'start\'-\'stop\'. The server's response to this " + "request is uncertain.\n"); + break; + } + tmp_range++; + } + /* byte range requested */ + GetStr(&config->range, nextarg); + } + break; + case 'R': + /* use remote file's time */ + config->remote_time = toggle; + break; + case 's': + /* don't show progress meter, don't show errors : */ + if(toggle) + global->mute = global->noprogress = TRUE; + else + global->mute = global->noprogress = FALSE; + if(global->showerror < 0) + /* if still on the default value, set showerror to the reverse of + toggle. This is to allow -S and -s to be used in an independent + order but still have the same effect. */ + global->showerror = (!toggle)?TRUE:FALSE; /* toggle off */ + break; + case 'S': + /* show errors */ + global->showerror = toggle?1:0; /* toggle on if used with -s */ + break; + case 't': + /* Telnet options */ + err = add2list(&config->telnet_options, nextarg); + if(err) + return err; + break; + case 'T': + /* we are uploading */ + { + struct getout *url; + if(config->url_out || ((config->url_out = config->url_list) != NULL)) { + /* there's a node here, if it already is filled-in continue to find + an "empty" node */ + while(config->url_out && (config->url_out->flags & GETOUT_UPLOAD)) + config->url_out = config->url_out->next; + } + + /* now there might or might not be an available node to fill in! */ + + if(config->url_out) + /* existing node */ + url = config->url_out; + else + /* there was no free node, create one! */ + url = new_getout(config); + + if(!url) + return PARAM_NO_MEM; + else { + url->flags |= GETOUT_UPLOAD; /* mark -T used */ + if(!*nextarg) + url->flags |= GETOUT_NOUPLOAD; + else { + /* "-" equals stdin, but keep the string around for now */ + GetStr(&url->infile, nextarg); + } + } + } + break; + case 'u': + /* user:password */ + GetStr(&config->userpwd, nextarg); + cleanarg(nextarg); + break; + case 'U': + /* Proxy user:password */ + GetStr(&config->proxyuserpwd, nextarg); + cleanarg(nextarg); + break; + case 'v': + if(toggle) { + /* the '%' thing here will cause the trace get sent to stderr */ + Curl_safefree(global->trace_dump); + global->trace_dump = strdup("%"); + if(!global->trace_dump) + return PARAM_NO_MEM; + if(global->tracetype && (global->tracetype != TRACE_PLAIN)) + warnf(global, + "-v, --verbose overrides an earlier trace/verbose option\n"); + global->tracetype = TRACE_PLAIN; + } + else + /* verbose is disabled here */ + global->tracetype = TRACE_NONE; + break; + case 'V': + if(toggle) /* --no-version yields no output! */ + return PARAM_VERSION_INFO_REQUESTED; + break; + + case 'w': + /* get the output string */ + if('@' == *nextarg) { + /* the data begins with a '@' letter, it means that a file name + or - (stdin) follows */ + FILE *file; + const char *fname; + nextarg++; /* pass the @ */ + if(curlx_strequal("-", nextarg)) { + fname = "<stdin>"; + file = stdin; + } + else { + fname = nextarg; + file = fopen(nextarg, FOPEN_READTEXT); + } + err = file2string(&config->writeout, file); + if(file && (file != stdin)) + fclose(file); + if(err) + return err; + if(!config->writeout) + warnf(global, "Failed to read %s", fname); + } + else + GetStr(&config->writeout, nextarg); + break; + case 'x': + /* proxy */ + GetStr(&config->proxy, nextarg); + config->proxyver = CURLPROXY_HTTP; + break; + case 'X': + /* set custom request */ + GetStr(&config->customrequest, nextarg); + break; + case 'y': + /* low speed time */ + err = str2unum(&config->low_speed_time, nextarg); + if(err) + return err; + if(!config->low_speed_limit) + config->low_speed_limit = 1; + break; + case 'Y': + /* low speed limit */ + err = str2unum(&config->low_speed_limit, nextarg); + if(err) + return err; + if(!config->low_speed_time) + config->low_speed_time = 30; + break; + case 'z': /* time condition coming up */ + switch(*nextarg) { + case '+': + nextarg++; + /* FALLTHROUGH */ + default: + /* If-Modified-Since: (section 14.28 in RFC2068) */ + config->timecond = CURL_TIMECOND_IFMODSINCE; + break; + case '-': + /* If-Unmodified-Since: (section 14.24 in RFC2068) */ + config->timecond = CURL_TIMECOND_IFUNMODSINCE; + nextarg++; + break; + case '=': + /* Last-Modified: (section 14.29 in RFC2068) */ + config->timecond = CURL_TIMECOND_LASTMOD; + nextarg++; + break; + } + now = time(NULL); + config->condtime=curl_getdate(nextarg, &now); + if(-1 == (int)config->condtime) { + /* now let's see if it is a file name to get the time from instead! */ + struct_stat statbuf; + if(-1 == stat(nextarg, &statbuf)) { + /* failed, remove time condition */ + config->timecond = CURL_TIMECOND_NONE; + warnf(global, + "Illegal date format for -z, --timecond (and not " + "a file name). Disabling time condition. " + "See curl_getdate(3) for valid date syntax.\n"); + } + else { + /* pull the time out from the file */ + config->condtime = statbuf.st_mtime; + } + } + break; + default: /* unknown flag */ + return PARAM_OPTION_UNKNOWN; + } + hit = -1; + + } while(!longopt && !singleopt && *++parse && !*usedarg); + + return PARAM_OK; +} + +ParameterError parse_args(struct GlobalConfig *config, int argc, + argv_item_t argv[]) +{ + int i; + bool stillflags; + char *orig_opt = NULL; + ParameterError result = PARAM_OK; + struct OperationConfig *operation = config->first; + + for(i = 1, stillflags = TRUE; i < argc && !result; i++) { + orig_opt = argv[i]; + + if(stillflags && ('-' == argv[i][0])) { + char *nextarg; + bool passarg; + char *flag = argv[i]; + + if(curlx_strequal("--", argv[i])) + /* This indicates the end of the flags and thus enables the + following (URL) argument to start with -. */ + stillflags = FALSE; + else { + nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL; + + result = getparameter(flag, nextarg, &passarg, config, operation); + if(result == PARAM_NEXT_OPERATION) { + /* Reset result as PARAM_NEXT_OPERATION is only used here and not + returned from this function */ + result = PARAM_OK; + + if(operation->url_list && operation->url_list->url) { + /* Allocate the next config */ + operation->next = malloc(sizeof(struct OperationConfig)); + if(operation->next) { + /* Initialise the newly created config */ + config_init(operation->next); + + /* Copy the easy handle */ + operation->next->easy = config->easy; + + /* Set the global config pointer */ + operation->next->global = config; + + /* Update the last operation pointer */ + config->last = operation->next; + + /* Move onto the new config */ + operation->next->prev = operation; + operation = operation->next; + } + else + result = PARAM_NO_MEM; + } + } + else if(!result && passarg) + i++; /* we're supposed to skip this */ + } + } + else { + bool used; + + /* Just add the URL please */ + result = getparameter((char *)"--url", argv[i], &used, config, + operation); + } + } + + if(result && result != PARAM_HELP_REQUESTED && + result != PARAM_MANUAL_REQUESTED && + result != PARAM_VERSION_INFO_REQUESTED && + result != PARAM_ENGINES_REQUESTED) { + const char *reason = param2text(result); + + if(orig_opt && !curlx_strequal(":", orig_opt)) + helpf(config->errors, "option %s: %s\n", orig_opt, reason); + else + helpf(config->errors, "%s\n", reason); + } + + return result; +} diff --git a/src/tool_getparam.h b/src/tool_getparam.h new file mode 100644 index 0000000..ef4366b --- /dev/null +++ b/src/tool_getparam.h @@ -0,0 +1,62 @@ +#ifndef HEADER_CURL_TOOL_GETPARAM_H +#define HEADER_CURL_TOOL_GETPARAM_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +typedef enum { + PARAM_OK = 0, + PARAM_OPTION_AMBIGUOUS, + PARAM_OPTION_UNKNOWN, + PARAM_REQUIRES_PARAMETER, + PARAM_BAD_USE, + PARAM_HELP_REQUESTED, + PARAM_MANUAL_REQUESTED, + PARAM_VERSION_INFO_REQUESTED, + PARAM_ENGINES_REQUESTED, + PARAM_GOT_EXTRA_PARAMETER, + PARAM_BAD_NUMERIC, + PARAM_NEGATIVE_NUMERIC, + PARAM_LIBCURL_DOESNT_SUPPORT, + PARAM_NO_MEM, + PARAM_NEXT_OPERATION, + PARAM_LAST +} ParameterError; + +struct GlobalConfig; +struct OperationConfig; + +ParameterError getparameter(char *flag, char *nextarg, bool *usedarg, + struct GlobalConfig *global, + struct OperationConfig *operation); + +#ifdef UNITTESTS +void parse_cert_parameter(const char *cert_parameter, + char **certname, + char **passphrase); +#endif + +ParameterError parse_args(struct GlobalConfig *config, int argc, + argv_item_t argv[]); + +#endif /* HEADER_CURL_TOOL_GETPARAM_H */ + diff --git a/src/getpass.c b/src/tool_getpass.c index b441a5a..0f7ed01 100644 --- a/src/getpass.c +++ b/src/tool_getpass.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,46 +19,48 @@ * KIND, either express or implied. * ***************************************************************************/ - -/* This file is a reimplementation of the previous one, due to license - problems. */ - -#include "setup.h" +#include "tool_setup.h" #ifndef HAVE_GETPASS_R /* this file is only for systems without getpass_r() */ -#include <stdio.h> -#include <string.h> - -#ifdef HAVE_UNISTD_H -#include <unistd.h> +#ifdef HAVE_FCNTL_H +# include <fcntl.h> #endif -#include "getpass.h" +#ifdef HAVE_TERMIOS_H +# include <termios.h> +#elif defined(HAVE_TERMIO_H) +# include <termio.h> +#endif -#ifdef HAVE_FCNTL_H -#include <fcntl.h> +#ifdef __VMS +# include descrip +# include starlet +# include iodef #endif -#ifdef HAVE_TERMIOS_H -#include <termios.h> -#else -#ifdef HAVE_TERMIO_H -#include <termio.h> + +#ifdef WIN32 +# include <conio.h> #endif + +#ifdef NETWARE +# ifdef __NOVELL_LIBC__ +# include <screen.h> +# else +# include <nwconio.h> +# endif #endif -/* The last #include file should be: */ -#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) -#include "memdebug.h" +#ifdef HAVE_UNISTD_H +#include <unistd.h> #endif +#include "tool_getpass.h" + +#include "memdebug.h" /* keep this as LAST include */ #ifdef __VMS /* VMS implementation */ -#include descrip -#include starlet -#include iodef -/* #include iosbdef */ char *getpass_r(const char *prompt, char *buffer, size_t buflen) { long sts; @@ -76,15 +78,15 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) $DESCRIPTOR(ttdesc, "TT"); - buffer[0]='\0'; - sts = sys$assign(&ttdesc, &chan,0,0); - if (sts & 1) { + buffer[0] = '\0'; + sts = sys$assign(&ttdesc, &chan, 0, 0); + if(sts & 1) { sts = sys$qiow(0, chan, IO$_READPROMPT | IO$M_NOECHO, &iosb, 0, 0, buffer, buflen, 0, 0, prompt, strlen(prompt)); - if((sts & 1) && (iosb.iosb$w_status&1)) + if((sts & 1) && (iosb.iosb$w_status & 1)) buffer[iosb.iosb$w_bcnt] = '\0'; sts = sys$dassgn(chan); @@ -94,14 +96,8 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) #define DONE #endif /* __VMS */ - -#ifdef WIN32 -/* Windows implementation */ -#include <conio.h> -#endif - #ifdef __SYMBIAN32__ -#define getch() getchar() +# define getch() getchar() #endif #if defined(WIN32) || defined(__SYMBIAN32__) @@ -111,25 +107,25 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) size_t i; fputs(prompt, stderr); - for(i=0; i<buflen; i++) { + for(i = 0; i < buflen; i++) { buffer[i] = (char)getch(); - if ( buffer[i] == '\r' || buffer[i] == '\n' ) { - buffer[i] = 0; + if(buffer[i] == '\r' || buffer[i] == '\n') { + buffer[i] = '\0'; break; } else - if ( buffer[i] == '\b') + if(buffer[i] == '\b') /* remove this letter and if this is not the first key, remove the previous one as well */ - i = i - (i>=1?2:1); + i = i - (i >= 1 ? 2 : 1); } #ifndef __SYMBIAN32__ /* since echo is disabled, print a newline */ fputs("\n", stderr); #endif /* if user didn't hit ENTER, terminate buffer */ - if (i==buflen) - buffer[buflen-1]=0; + if(i == buflen) + buffer[buflen-1] = '\0'; return buffer; /* we always return success */ } @@ -139,13 +135,11 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) #ifdef NETWARE /* NetWare implementation */ #ifdef __NOVELL_LIBC__ -#include <screen.h> char *getpass_r(const char *prompt, char *buffer, size_t buflen) { return getpassword(prompt, buffer, buflen); } #else -#include <nwconio.h> char *getpass_r(const char *prompt, char *buffer, size_t buflen) { size_t i = 0; @@ -153,21 +147,23 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) printf("%s", prompt); do { buffer[i++] = getch(); - if (buffer[i-1] == '\b') { + if(buffer[i-1] == '\b') { /* remove this letter and if this is not the first key, remove the previous one as well */ - if (i > 1) { + if(i > 1) { printf("\b \b"); i = i - 2; - } else { + } + else { RingTheBell(); i = i - 1; } - } else if (buffer[i-1] != 13) { - putchar('*'); } - } while ((buffer[i-1] != 13) && (i < buflen)); - buffer[i-1] = 0; + else if(buffer[i-1] != 13) + putchar('*'); + + } while((buffer[i-1] != 13) && (i < buflen)); + buffer[i-1] = '\0'; printf("\r\n"); return buffer; } @@ -178,13 +174,11 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) #ifndef DONE /* not previously provided */ #ifdef HAVE_TERMIOS_H -#define struct_term struct termios -#else -#ifdef HAVE_TERMIO_H -#define struct_term struct termio +# define struct_term struct termios +#elif defined(HAVE_TERMIO_H) +# define struct_term struct termio #else -#undef struct_term -#endif +# undef struct_term #endif static bool ttyecho(bool enable, int fd) @@ -194,25 +188,23 @@ static bool ttyecho(bool enable, int fd) static struct_term noecho; #endif if(!enable) { - /* disable echo by extracting the current 'withecho' mode and remove the - ECHO bit and set back the struct */ + /* disable echo by extracting the current 'withecho' mode and remove the + ECHO bit and set back the struct */ #ifdef HAVE_TERMIOS_H tcgetattr(fd, &withecho); noecho = withecho; noecho.c_lflag &= ~ECHO; tcsetattr(fd, TCSANOW, &noecho); -#else /* HAVE_TERMIOS_H */ -#ifdef HAVE_TERMIO_H +#elif defined(HAVE_TERMIO_H) ioctl(fd, TCGETA, &withecho); noecho = withecho; noecho.c_lflag &= ~ECHO; ioctl(fd, TCSETA, &noecho); -#else /* HAVE_TERMIO_H */ -/* neither HAVE_TERMIO_H nor HAVE_TERMIOS_H, we can't disable echo! */ - (void)fd; /* prevent compiler warning on unused variable */ +#else + /* neither HAVE_TERMIO_H nor HAVE_TERMIOS_H, we can't disable echo! */ + (void)fd; return FALSE; /* not disabled */ #endif -#endif return TRUE; /* disabled */ } else { @@ -220,14 +212,11 @@ static bool ttyecho(bool enable, int fd) now use to reset the terminal status) */ #ifdef HAVE_TERMIOS_H tcsetattr(fd, TCSAFLUSH, &withecho); -#else /* HAVE_TERMIOS_H */ -#ifdef HAVE_TERMIO_H +#elif defined(HAVE_TERMIO_H) ioctl(fd, TCSETA, &withecho); #else -/* neither HAVE_TERMIO_H nor HAVE_TERMIOS_H */ return FALSE; /* not enabled */ #endif -#endif return TRUE; /* enabled */ } } @@ -238,18 +227,18 @@ char *getpass_r(const char *prompt, /* prompt to display */ { ssize_t nread; bool disabled; - int fd=open("/dev/tty", O_RDONLY); + int fd = open("/dev/tty", O_RDONLY); if(-1 == fd) - fd = 1; /* use stdin if the tty couldn't be used */ + fd = STDIN_FILENO; /* use stdin if the tty couldn't be used */ disabled = ttyecho(FALSE, fd); /* disable terminal echo */ fputs(prompt, stderr); - nread=read(fd, password, buflen); + nread = read(fd, password, buflen); if(nread > 0) - password[--nread]=0; /* zero terminate where enter is stored */ + password[--nread] = '\0'; /* zero terminate where enter is stored */ else - password[0]=0; /* got nothing */ + password[0] = '\0'; /* got nothing */ if(disabled) { /* if echo actually was disabled, add a newline */ @@ -257,7 +246,7 @@ char *getpass_r(const char *prompt, /* prompt to display */ (void)ttyecho(TRUE, fd); /* enable echo */ } - if(1 != fd) + if(STDIN_FILENO != fd) close(fd); return password; /* return pointer to buffer */ diff --git a/src/getpass.h b/src/tool_getpass.h index 3b29d47..d4fc7e2 100644 --- a/src/getpass.h +++ b/src/tool_getpass.h @@ -1,5 +1,5 @@ -#ifndef __GETPASS_H -#define __GETPASS_H +#ifndef HEADER_CURL_TOOL_GETPASS_H +#define HEADER_CURL_TOOL_GETPASS_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,6 +21,8 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" + #ifndef HAVE_GETPASS_R /* If there's a system-provided function named like this, we trust it is also found in one of the standard headers. */ @@ -28,7 +30,7 @@ /* * Returning NULL will abort the continued operation! */ -char* getpass_r(const char *prompt, char* buffer, size_t buflen ); +char* getpass_r(const char *prompt, char* buffer, size_t buflen); #endif -#endif +#endif /* HEADER_CURL_TOOL_GETPASS_H */ diff --git a/src/tool_help.c b/src/tool_help.c new file mode 100644 index 0000000..46ae341 --- /dev/null +++ b/src/tool_help.c @@ -0,0 +1,345 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "tool_panykey.h" +#include "tool_help.h" +#include "tool_libinfo.h" +#include "tool_version.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef MSDOS +# define USE_WATT32 +#endif + +/* + * A few of these source lines are >80 columns wide, but that's only because + * breaking the strings narrower makes this chunk look even worse! + * + * Starting with 7.18.0, this list of command line options is sorted based + * on the long option name. It is not done automatically, although a command + * line like the following can help out: + * + * curl --help | cut -c5- | grep "^-" | sort + */ + +static const char *const helptext[] = { + "Usage: curl [options...] <url>", + "Options: (H) means HTTP/HTTPS only, (F) means FTP only", + " --anyauth Pick \"any\" authentication method (H)", + " -a, --append Append to target file when uploading (F/SFTP)", + " --basic Use HTTP Basic Authentication (H)", + " --cacert FILE CA certificate to verify peer against (SSL)", + " --capath DIR CA directory to verify peer against (SSL)", + " -E, --cert CERT[:PASSWD] Client certificate file and password (SSL)", + " --cert-status Verify the status of the server certificate (SSL)", + " --cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)", + " --ciphers LIST SSL ciphers to use (SSL)", + " --compressed Request compressed response (using deflate or gzip)", + " -K, --config FILE Read config from FILE", + " --connect-timeout SECONDS Maximum time allowed for connection", + " -C, --continue-at OFFSET Resumed transfer OFFSET", + " -b, --cookie STRING/FILE Read cookies from STRING/FILE (H)", + " -c, --cookie-jar FILE Write cookies to FILE after operation (H)", + " --create-dirs Create necessary local directory hierarchy", + " --crlf Convert LF to CRLF in upload", + " --crlfile FILE Get a CRL list in PEM format from the given file", + " -d, --data DATA HTTP POST data (H)", + " --data-raw DATA HTTP POST data, '@' allowed (H)", + " --data-ascii DATA HTTP POST ASCII data (H)", + " --data-binary DATA HTTP POST binary data (H)", + " --data-urlencode DATA HTTP POST data url encoded (H)", + " --delegation STRING GSS-API delegation permission", + " --digest Use HTTP Digest Authentication (H)", + " --disable-eprt Inhibit using EPRT or LPRT (F)", + " --disable-epsv Inhibit using EPSV (F)", + " --dns-servers DNS server addrs to use: 1.1.1.1;2.2.2.2", + " --dns-interface Interface to use for DNS requests", + " --dns-ipv4-addr IPv4 address to use for DNS requests, dot notation", + " --dns-ipv6-addr IPv6 address to use for DNS requests, dot notation", + " -D, --dump-header FILE Write the headers to FILE", + " --egd-file FILE EGD socket path for random data (SSL)", + " --engine ENGINE Crypto engine (use \"--engine list\" for list) (SSL)", +#ifdef USE_ENVIRONMENT + " --environment Write results to environment variables (RISC OS)", +#endif + " -f, --fail Fail silently (no output at all) on HTTP errors (H)", + " --false-start Enable TLS False Start.", + " -F, --form CONTENT Specify HTTP multipart POST data (H)", + " --form-string STRING Specify HTTP multipart POST data (H)", + " --ftp-account DATA Account data string (F)", + " --ftp-alternative-to-user COMMAND " + "String to replace \"USER [name]\" (F)", + " --ftp-create-dirs Create the remote dirs if not present (F)", + " --ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)", + " --ftp-pasv Use PASV/EPSV instead of PORT (F)", + " -P, --ftp-port ADR Use PORT with given address instead of PASV (F)", + " --ftp-skip-pasv-ip Skip the IP address for PASV (F)\n" + " --ftp-pret Send PRET before PASV (for drftpd) (F)", + " --ftp-ssl-ccc Send CCC after authenticating (F)", + " --ftp-ssl-ccc-mode ACTIVE/PASSIVE Set CCC mode (F)", + " --ftp-ssl-control Require SSL/TLS for FTP login, " + "clear for transfer (F)", + " -G, --get Send the -d data with a HTTP GET (H)", + " -g, --globoff Disable URL sequences and ranges using {} and []", + " -H, --header LINE Pass custom header LINE to server (H)", + " -I, --head Show document info only", + " -h, --help This help text", + " --hostpubmd5 MD5 " + "Hex-encoded MD5 string of the host public key. (SSH)", + " -0, --http1.0 Use HTTP 1.0 (H)", + " --http1.1 Use HTTP 1.1 (H)", + " --http2 Use HTTP 2 (H)", + " --ignore-content-length Ignore the HTTP Content-Length header", + " -i, --include Include protocol headers in the output (H/F)", + " -k, --insecure Allow connections to SSL sites without certs (H)", + " --interface INTERFACE Use network INTERFACE (or address)", + " -4, --ipv4 Resolve name to IPv4 address", + " -6, --ipv6 Resolve name to IPv6 address", + " -j, --junk-session-cookies Ignore session cookies read from file (H)", + " --keepalive-time SECONDS Wait SECONDS between keepalive probes", + " --key KEY Private key file name (SSL/SSH)", + " --key-type TYPE Private key file type (DER/PEM/ENG) (SSL)", + " --krb LEVEL Enable Kerberos with security LEVEL (F)", +#ifndef CURL_DISABLE_LIBCURL_OPTION + " --libcurl FILE Dump libcurl equivalent code of this command line", +#endif + " --limit-rate RATE Limit transfer speed to RATE", + " -l, --list-only List only mode (F/POP3)", + " --local-port RANGE Force use of RANGE for local port numbers", + " -L, --location Follow redirects (H)", + " --location-trusted " + "Like '--location', and send auth to other hosts (H)", + " --login-options OPTIONS Server login options (IMAP, POP3, SMTP)", + " -M, --manual Display the full manual", + " --mail-from FROM Mail from this address (SMTP)", + " --mail-rcpt TO Mail to this/these addresses (SMTP)", + " --mail-auth AUTH Originator address of the original email (SMTP)", + " --max-filesize BYTES Maximum file size to download (H/F)", + " --max-redirs NUM Maximum number of redirects allowed (H)", + " -m, --max-time SECONDS Maximum time allowed for the transfer", + " --metalink Process given URLs as metalink XML file", + " --negotiate Use HTTP Negotiate (SPNEGO) authentication (H)", + " -n, --netrc Must read .netrc for user name and password", + " --netrc-optional Use either .netrc or URL; overrides -n", + " --netrc-file FILE Specify FILE for netrc", + " -:, --next " + "Allows the following URL to use a separate set of options", + " --no-alpn Disable the ALPN TLS extension (H)", + " -N, --no-buffer Disable buffering of the output stream", + " --no-keepalive Disable keepalive use on the connection", + " --no-npn Disable the NPN TLS extension (H)", + " --no-sessionid Disable SSL session-ID reusing (SSL)", + " --noproxy List of hosts which do not use proxy", + " --ntlm Use HTTP NTLM authentication (H)", + " --oauth2-bearer TOKEN OAuth 2 Bearer Token (IMAP, POP3, SMTP)", + " -o, --output FILE Write to FILE instead of stdout", + " --pass PASS Pass phrase for the private key (SSL/SSH)", + " --path-as-is Do not squash .. sequences in URL path", + " --pinnedpubkey FILE Public key (PEM/DER) to verify peer against " + "(OpenSSL/GnuTLS/NSS/wolfSSL/CyaSSL/GSKit only)", + " --post301 " + "Do not switch to GET after following a 301 redirect (H)", + " --post302 " + "Do not switch to GET after following a 302 redirect (H)", + " --post303 " + "Do not switch to GET after following a 303 redirect (H)", + " -#, --progress-bar Display transfer progress as a progress bar", + " --proto PROTOCOLS Enable/disable PROTOCOLS", + " --proto-redir PROTOCOLS Enable/disable PROTOCOLS on redirect", + " -x, --proxy [PROTOCOL://]HOST[:PORT] Use proxy on given port", + " --proxy-anyauth Pick \"any\" proxy authentication method (H)", + " --proxy-basic Use Basic authentication on the proxy (H)", + " --proxy-digest Use Digest authentication on the proxy (H)", + " --proxy-negotiate " + "Use HTTP Negotiate (SPNEGO) authentication on the proxy (H)", + " --proxy-ntlm Use NTLM authentication on the proxy (H)", +#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) + " --proxy-service-name NAME SPNEGO proxy service name", + " --service-name NAME SPNEGO service name", +#endif + " -U, --proxy-user USER[:PASSWORD] Proxy user and password", + " --proxy1.0 HOST[:PORT] Use HTTP/1.0 proxy on given port", + " -p, --proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)", + " --pubkey KEY Public key file name (SSH)", + " -Q, --quote CMD Send command(s) to server before transfer (F/SFTP)", + " --random-file FILE File for reading random data from (SSL)", + " -r, --range RANGE Retrieve only the bytes within RANGE", + " --raw Do HTTP \"raw\"; no transfer decoding (H)", + " -e, --referer Referer URL (H)", + " -J, --remote-header-name Use the header-provided filename (H)", + " -O, --remote-name Write output to a file named as the remote file", + " --remote-name-all Use the remote file name for all URLs", + " -R, --remote-time Set the remote file's time on the local output", + " -X, --request COMMAND Specify request command to use", + " --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS", + " --retry NUM " + "Retry request NUM times if transient problems occur", + " --retry-delay SECONDS Wait SECONDS between retries", + " --retry-max-time SECONDS Retry only within this period", + " --sasl-ir Enable initial response in SASL authentication", + " -S, --show-error " + "Show error. With -s, make curl show errors when they occur", + " -s, --silent Silent mode (don't output anything)", + " --socks4 HOST[:PORT] SOCKS4 proxy on given host + port", + " --socks4a HOST[:PORT] SOCKS4a proxy on given host + port", + " --socks5 HOST[:PORT] SOCKS5 proxy on given host + port", + " --socks5-hostname HOST[:PORT] " + "SOCKS5 proxy, pass host name to proxy", +#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) + " --socks5-gssapi-service NAME SOCKS5 proxy service name for GSS-API", + " --socks5-gssapi-nec Compatibility with NEC SOCKS5 server", +#endif + " -Y, --speed-limit RATE " + "Stop transfers below RATE for 'speed-time' secs", + " -y, --speed-time SECONDS " + "Trigger 'speed-limit' abort after SECONDS (default: 30)", + " --ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)", + " --ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)", + " -2, --sslv2 Use SSLv2 (SSL)", + " -3, --sslv3 Use SSLv3 (SSL)", + " --ssl-allow-beast Allow security flaw to improve interop (SSL)", + " --stderr FILE Where to redirect stderr (use \"-\" for stdout)", + " --tcp-nodelay Use the TCP_NODELAY option", + " -t, --telnet-option OPT=VAL Set telnet option", + " --tftp-blksize VALUE Set TFTP BLKSIZE option (must be >512)", + " -z, --time-cond TIME Transfer based on a time condition", + " -1, --tlsv1 Use => TLSv1 (SSL)", + " --tlsv1.0 Use TLSv1.0 (SSL)", + " --tlsv1.1 Use TLSv1.1 (SSL)", + " --tlsv1.2 Use TLSv1.2 (SSL)", + " --trace FILE Write a debug trace to FILE", + " --trace-ascii FILE Like --trace, but without hex output", + " --trace-time Add time stamps to trace/verbose output", + " --tr-encoding Request compressed transfer encoding (H)", + " -T, --upload-file FILE Transfer FILE to destination", + " --url URL URL to work with", + " -B, --use-ascii Use ASCII/text transfer", + " -u, --user USER[:PASSWORD] Server user and password", + " --tlsuser USER TLS username", + " --tlspassword STRING TLS password", + " --tlsauthtype STRING TLS authentication type (default: SRP)", + " --unix-socket FILE Connect through this Unix domain socket", + " -A, --user-agent STRING Send User-Agent STRING to server (H)", + " -v, --verbose Make the operation more talkative", + " -V, --version Show version number and quit", +#ifdef USE_WATT32 + " --wdebug Turn on Watt-32 debugging", +#endif + " -w, --write-out FORMAT Use output FORMAT after completion", + " --xattr Store metadata in extended file attributes", + " -q Disable .curlrc (must be first parameter)", + NULL +}; + +#ifdef NETWARE +# define PRINT_LINES_PAUSE 23 +#endif + +#ifdef __SYMBIAN32__ +# define PRINT_LINES_PAUSE 16 +#endif + +struct feat { + const char *name; + int bitmask; +}; + +static const struct feat feats[] = { + {"AsynchDNS", CURL_VERSION_ASYNCHDNS}, + {"Debug", CURL_VERSION_DEBUG}, + {"TrackMemory", CURL_VERSION_CURLDEBUG}, + {"IDN", CURL_VERSION_IDN}, + {"IPv6", CURL_VERSION_IPV6}, + {"Largefile", CURL_VERSION_LARGEFILE}, + {"SSPI", CURL_VERSION_SSPI}, + {"GSS-API", CURL_VERSION_GSSAPI}, + {"Kerberos", CURL_VERSION_KERBEROS5}, + {"SPNEGO", CURL_VERSION_SPNEGO}, + {"NTLM", CURL_VERSION_NTLM}, + {"NTLM_WB", CURL_VERSION_NTLM_WB}, + {"SSL", CURL_VERSION_SSL}, + {"libz", CURL_VERSION_LIBZ}, + {"CharConv", CURL_VERSION_CONV}, + {"TLS-SRP", CURL_VERSION_TLSAUTH_SRP}, + {"HTTP2", CURL_VERSION_HTTP2}, + {"UnixSockets", CURL_VERSION_UNIX_SOCKETS}, +}; + +void tool_help(void) +{ + int i; + for(i = 0; helptext[i]; i++) { + puts(helptext[i]); +#ifdef PRINT_LINES_PAUSE + if(i && ((i % PRINT_LINES_PAUSE) == 0)) + tool_pressanykey(); +#endif + } +} + +void tool_version_info(void) +{ + const char *const *proto; + + printf(CURL_ID "%s\n", curl_version()); + if(curlinfo->protocols) { + printf("Protocols: "); + for(proto = curlinfo->protocols; *proto; ++proto) { + printf("%s ", *proto); + } + puts(""); /* newline */ + } + if(curlinfo->features) { + unsigned int i; + printf("Features: "); + for(i = 0; i < sizeof(feats)/sizeof(feats[0]); i++) { + if(curlinfo->features & feats[i].bitmask) + printf("%s ", feats[i].name); + } +#ifdef USE_METALINK + printf("Metalink "); +#endif + puts(""); /* newline */ + } +} + +void tool_list_engines(CURL *curl) +{ + struct curl_slist *engines = NULL; + + /* Get the list of engines */ + curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines); + + puts("Build-time engines:"); + if(engines) { + for(; engines; engines = engines->next) + printf(" %s\n", engines->data); + } + else { + puts(" <none>"); + } + + /* Cleanup the list of engines */ + curl_slist_free_all(engines); +} diff --git a/src/tool_help.h b/src/tool_help.h new file mode 100644 index 0000000..9ef5006 --- /dev/null +++ b/src/tool_help.h @@ -0,0 +1,31 @@ +#ifndef HEADER_CURL_TOOL_HELP_H +#define HEADER_CURL_TOOL_HELP_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +void tool_help(void); +void tool_list_engines(CURL *curl); +void tool_version_info(void); + +#endif /* HEADER_CURL_TOOL_HELP_H */ + diff --git a/src/tool_helpers.c b/src/tool_helpers.c new file mode 100644 index 0000000..5479a1c --- /dev/null +++ b/src/tool_helpers.c @@ -0,0 +1,79 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_msgs.h" +#include "tool_getparam.h" +#include "tool_helpers.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* +** Helper functions that are used from more tha one source file. +*/ + +const char *param2text(int res) +{ + ParameterError error = (ParameterError)res; + switch(error) { + case PARAM_GOT_EXTRA_PARAMETER: + return "had unsupported trailing garbage"; + case PARAM_OPTION_UNKNOWN: + return "is unknown"; + case PARAM_OPTION_AMBIGUOUS: + return "is ambiguous"; + case PARAM_REQUIRES_PARAMETER: + return "requires parameter"; + case PARAM_BAD_USE: + return "is badly used here"; + case PARAM_BAD_NUMERIC: + return "expected a proper numerical parameter"; + case PARAM_NEGATIVE_NUMERIC: + return "expected a positive numerical parameter"; + case PARAM_LIBCURL_DOESNT_SUPPORT: + return "the installed libcurl version doesn't support this"; + case PARAM_NO_MEM: + return "out of memory"; + default: + return "unknown error"; + } +} + +int SetHTTPrequest(struct OperationConfig *config, HttpReq req, HttpReq *store) +{ + if((*store == HTTPREQ_UNSPEC) || + (*store == req)) { + *store = req; + return 0; + } + + warnf(config->global, "You can only select one HTTP request!\n"); + + return 1; +} diff --git a/src/tool_helpers.h b/src/tool_helpers.h new file mode 100644 index 0000000..73bcfc7 --- /dev/null +++ b/src/tool_helpers.h @@ -0,0 +1,32 @@ +#ifndef HEADER_CURL_TOOL_HELPERS_H +#define HEADER_CURL_TOOL_HELPERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +const char *param2text(int res); + +int SetHTTPrequest(struct OperationConfig *config, HttpReq req, + HttpReq *store); + +#endif /* HEADER_CURL_TOOL_HELPERS_H */ + diff --git a/src/homedir.c b/src/tool_homedir.c index ab1d369..73a66f8 100644 --- a/src/homedir.c +++ b/src/tool_homedir.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,31 +19,17 @@ * KIND, either express or implied. * ***************************************************************************/ - -#include "setup.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include "tool_setup.h" #ifdef HAVE_PWD_H -#include <pwd.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef __VMS -#include <unixlib.h> +# include <pwd.h> #endif -#include "homedir.h" +#include "tool_homedir.h" -#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) -#include "memdebug.h" -#endif +#include "memdebug.h" /* keep this as LAST include */ -static -char *GetEnv(const char *variable, char do_expand) +static char *GetEnv(const char *variable, char do_expand) { char *env = NULL; #ifdef WIN32 @@ -54,30 +40,23 @@ char *GetEnv(const char *variable, char do_expand) * started. Don't accept truncated results (i.e. rc >= sizeof(buf1)). */ rc = GetEnvironmentVariable(variable, buf1, sizeof(buf1)); - if (rc > 0 && rc < sizeof(buf1)) { + if(rc > 0 && rc < sizeof(buf1)) { env = buf1; variable = buf1; } - if (do_expand && strchr(variable,'%')) { + if(do_expand && strchr(variable, '%')) { /* buf2 == variable if not expanded */ rc = ExpandEnvironmentStrings (variable, buf2, sizeof(buf2)); - if (rc > 0 && rc < sizeof(buf2) && - !strchr(buf2,'%')) /* no vars still unexpanded */ + if(rc > 0 && rc < sizeof(buf2) && + !strchr(buf2, '%')) /* no vars still unexpanded */ env = buf2; } #else (void)do_expand; -#ifdef __VMS - env = getenv(variable); - if (env && strcmp("HOME",variable) == 0) { - env = decc_translate_vms(env); - } -#else /* no length control */ env = getenv(variable); #endif -#endif - return (env && env[0])?strdup(env):NULL; + return (env && env[0]) ? strdup(env) : NULL; } /* return the home directory of the current user as an allocated string */ @@ -97,13 +76,9 @@ char *homedir(void) { struct passwd *pw = getpwuid(geteuid()); - if (pw) { -#ifdef __VMS - home = decc_translate_vms(pw->pw_dir); -#else + if(pw) { home = pw->pw_dir; -#endif - if (home && home[0]) + if(home && home[0]) home = strdup(home); else home = NULL; diff --git a/src/homedir.h b/src/tool_homedir.h index c88d517..d588615 100644 --- a/src/homedir.h +++ b/src/tool_homedir.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_HOMEDIR_H -#define HEADER_CURL_HOMEDIR_H +#ifndef HEADER_CURL_TOOL_HOMEDIR_H +#define HEADER_CURL_TOOL_HOMEDIR_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,7 +21,8 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" char *homedir(void); -#endif /* HEADER_CURL_HOMEDIR_H */ +#endif /* HEADER_CURL_TOOL_HOMEDIR_H */ diff --git a/src/writeenv.h b/src/tool_hugehelp.c.cvs index 8d92f6c..5895900 100644 --- a/src/writeenv.h +++ b/src/tool_hugehelp.c.cvs @@ -1,5 +1,3 @@ -#ifndef HEADER_CURL_WRITEENV_H -#define HEADER_CURL_WRITEENV_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -22,6 +20,10 @@ * ***************************************************************************/ -void ourWriteEnv(CURL *curl); +#include "tool_setup.h" +#include "tool_hugehelp.h" -#endif /* HEADER_CURL_WRITEENV_H */ +void hugehelp(void) +{ + puts ( "This is a silly replacement for the actual file."); +} diff --git a/src/hugehelp.h b/src/tool_hugehelp.h index b84be17..442579e 100644 --- a/src/hugehelp.h +++ b/src/tool_hugehelp.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_HUGEHELP_H -#define HEADER_CURL_HUGEHELP_H +#ifndef HEADER_CURL_TOOL_HUGEHELP_H +#define HEADER_CURL_TOOL_HUGEHELP_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,6 +21,8 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" + void hugehelp(void); -#endif /* HEADER_CURL_HUGEHELP_H */ +#endif /* HEADER_CURL_TOOL_HUGEHELP_H */ diff --git a/src/tool_libinfo.c b/src/tool_libinfo.c new file mode 100644 index 0000000..a8ffb8f --- /dev/null +++ b/src/tool_libinfo.c @@ -0,0 +1,102 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_libinfo.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* global variable definitions, for libcurl run-time info */ + +curl_version_info_data *curlinfo = NULL; +long built_in_protos = 0; + +/* + * libcurl_info_init: retrieves run-time information about libcurl, + * setting a global pointer 'curlinfo' to libcurl's run-time info + * struct, and a global bit pattern 'built_in_protos' composed of + * CURLPROTO_* bits indicating which protocols are actually built + * into library being used. + */ + +CURLcode get_libcurl_info(void) +{ + static struct proto_name_pattern { + const char *proto_name; + long proto_pattern; + } const possibly_built_in[] = { + { "dict", CURLPROTO_DICT }, + { "file", CURLPROTO_FILE }, + { "ftp", CURLPROTO_FTP }, + { "ftps", CURLPROTO_FTPS }, + { "gopher", CURLPROTO_GOPHER }, + { "http", CURLPROTO_HTTP }, + { "https", CURLPROTO_HTTPS }, + { "imap", CURLPROTO_IMAP }, + { "imaps", CURLPROTO_IMAPS }, + { "ldap", CURLPROTO_LDAP }, + { "ldaps", CURLPROTO_LDAPS }, + { "pop3", CURLPROTO_POP3 }, + { "pop3s", CURLPROTO_POP3S }, + { "rtmp", CURLPROTO_RTMP }, + { "rtsp", CURLPROTO_RTSP }, + { "scp", CURLPROTO_SCP }, + { "sftp", CURLPROTO_SFTP }, + { "smb", CURLPROTO_SMB }, + { "smbs", CURLPROTO_SMBS }, + { "smtp", CURLPROTO_SMTP }, + { "smtps", CURLPROTO_SMTPS }, + { "telnet", CURLPROTO_TELNET }, + { "tftp", CURLPROTO_TFTP }, + { NULL, 0 } + }; + + struct proto_name_pattern const *p; + const char *const *proto; + + /* Pointer to libcurl's run-time version information */ + curlinfo = curl_version_info(CURLVERSION_NOW); + if(!curlinfo) + return CURLE_FAILED_INIT; + + /* Build CURLPROTO_* bit pattern with libcurl's built-in protocols */ + built_in_protos = 0; + if(curlinfo->protocols) { + for(proto = curlinfo->protocols; *proto; proto++) { + for(p = possibly_built_in; p->proto_name; p++) { + if(curlx_raw_equal(*proto, p->proto_name)) { + built_in_protos |= p->proto_pattern; + break; + } + } + } + } + + return CURLE_OK; +} + diff --git a/src/tool_libinfo.h b/src/tool_libinfo.h new file mode 100644 index 0000000..5c149d9 --- /dev/null +++ b/src/tool_libinfo.h @@ -0,0 +1,34 @@ +#ifndef HEADER_CURL_TOOL_LIBINFO_H +#define HEADER_CURL_TOOL_LIBINFO_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* global variable declarations, for libcurl run-time info */ + +extern curl_version_info_data *curlinfo; +extern long built_in_protos; + +CURLcode get_libcurl_info(void); + +#endif /* HEADER_CURL_TOOL_LIBINFO_H */ + diff --git a/src/tool_main.c b/src/tool_main.c new file mode 100644 index 0000000..9a5ceba --- /dev/null +++ b/src/tool_main.c @@ -0,0 +1,275 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include <sys/stat.h> + +#ifdef HAVE_SIGNAL_H +#include <signal.h> +#endif + +#ifdef USE_NSS +#include <nspr.h> +#include <plarenas.h> +#endif + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_convert.h" +#include "tool_msgs.h" +#include "tool_operate.h" +#include "tool_panykey.h" +#include "tool_vms.h" +#include "tool_main.h" +#include "tool_libinfo.h" + +/* + * This is low-level hard-hacking memory leak tracking and similar. Using + * the library level code from this client-side is ugly, but we do this + * anyway for convenience. + */ +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef __VMS +/* + * vms_show is a global variable, used in main() as parameter for + * function vms_special_exit() to allow proper curl tool exiting. + * Its value may be set in other tool_*.c source files thanks to + * forward declaration present in tool_vms.h + */ +int vms_show = 0; +#endif + +/* if we build a static library for unit tests, there is no main() function */ +#ifndef UNITTESTS + +/* + * Ensure that file descriptors 0, 1 and 2 (stdin, stdout, stderr) are + * open before starting to run. Otherwise, the first three network + * sockets opened by curl could be used for input sources, downloaded data + * or error logs as they will effectively be stdin, stdout and/or stderr. + */ +static void main_checkfds(void) +{ +#ifdef HAVE_PIPE + int fd[2] = { STDIN_FILENO, STDIN_FILENO }; + while(fd[0] == STDIN_FILENO || + fd[0] == STDOUT_FILENO || + fd[0] == STDERR_FILENO || + fd[1] == STDIN_FILENO || + fd[1] == STDOUT_FILENO || + fd[1] == STDERR_FILENO) + if(pipe(fd) < 0) + return; /* Out of handles. This isn't really a big problem now, but + will be when we try to create a socket later. */ + close(fd[0]); + close(fd[1]); +#endif +} + +#ifdef CURLDEBUG +static void memory_tracking_init(void) +{ + char *env; + /* if CURL_MEMDEBUG is set, this starts memory tracking message logging */ + env = curlx_getenv("CURL_MEMDEBUG"); + if(env) { + /* use the value as file name */ + char fname[CURL_MT_LOGFNAME_BUFSIZE]; + if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE) + env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0'; + strcpy(fname, env); + curl_free(env); + curl_memdebug(fname); + /* this weird stuff here is to make curl_free() get called + before curl_memdebug() as otherwise memory tracking will + log a free() without an alloc! */ + } + /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */ + env = curlx_getenv("CURL_MEMLIMIT"); + if(env) { + char *endptr; + long num = strtol(env, &endptr, 10); + if((endptr != env) && (endptr == env + strlen(env)) && (num > 0)) + curl_memlimit(num); + curl_free(env); + } +} +#else +# define memory_tracking_init() Curl_nop_stmt +#endif + +/* + * This is the main global constructor for the app. Call this before + * _any_ libcurl usage. If this fails, *NO* libcurl functions may be + * used, or havoc may be the result. + */ +static CURLcode main_init(struct GlobalConfig *config) +{ + CURLcode result = CURLE_OK; + +#if defined(__DJGPP__) || defined(__GO32__) + /* stop stat() wasting time */ + _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE; +#endif + + /* Initialise the global config */ + config->showerror = -1; /* Will show errors */ + config->errors = stderr; /* Default errors to stderr */ + + /* Allocate the initial operate config */ + config->first = config->last = malloc(sizeof(struct OperationConfig)); + if(config->first) { + /* Perform the libcurl initialization */ + result = curl_global_init(CURL_GLOBAL_DEFAULT); + if(!result) { + /* Get information about libcurl */ + result = get_libcurl_info(); + + if(!result) { + /* Get a curl handle to use for all forthcoming curl transfers */ + config->easy = curl_easy_init(); + if(config->easy) { + /* Initialise the config */ + config_init(config->first); + config->first->easy = config->easy; + config->first->global = config; + } + else { + helpf(stderr, "error initializing curl easy handle\n"); + result = CURLE_FAILED_INIT; + free(config->first); + } + } + else { + helpf(stderr, "error retrieving curl library information\n"); + free(config->first); + } + } + else { + helpf(stderr, "error initializing curl library\n"); + free(config->first); + } + } + else { + helpf(stderr, "error initializing curl\n"); + result = CURLE_FAILED_INIT; + } + + return result; +} + +static void free_config_fields(struct GlobalConfig *config) +{ + Curl_safefree(config->trace_dump); + + if(config->errors_fopened && config->errors) + fclose(config->errors); + config->errors = NULL; + + if(config->trace_fopened && config->trace_stream) + fclose(config->trace_stream); + config->trace_stream = NULL; + + Curl_safefree(config->libcurl); +} + +/* + * This is the main global destructor for the app. Call this after + * _all_ libcurl usage is done. + */ +static void main_free(struct GlobalConfig *config) +{ + /* Cleanup the easy handle */ + curl_easy_cleanup(config->easy); + config->easy = NULL; + + /* Main cleanup */ + curl_global_cleanup(); + convert_cleanup(); + metalink_cleanup(); +#ifdef USE_NSS + if(PR_Initialized()) { + /* prevent valgrind from reporting still reachable mem from NSRP arenas */ + PL_ArenaFinish(); + /* prevent valgrind from reporting possibly lost memory (fd cache, ...) */ + PR_Cleanup(); + } +#endif + free_config_fields(config); + + /* Free the config structures */ + config_free(config->last); + config->first = NULL; + config->last = NULL; +} + +/* +** curl tool main function. +*/ +int main(int argc, char *argv[]) +{ + CURLcode result = CURLE_OK; + struct GlobalConfig global; + memset(&global, 0, sizeof(global)); + + main_checkfds(); + +#if defined(HAVE_SIGNAL) && defined(SIGPIPE) + (void)signal(SIGPIPE, SIG_IGN); +#endif + + /* Initialize memory tracking */ + memory_tracking_init(); + + /* Initialize the curl library - do not call any libcurl functions before + this point */ + result = main_init(&global); + if(!result) { + /* Start our curl operation */ + result = operate(&global, argc, argv); + +#ifdef __SYMBIAN32__ + if(global.showerror) + tool_pressanykey(); +#endif + + /* Perform the main cleanup */ + main_free(&global); + } + +#ifdef __NOVELL_LIBC__ + if(getenv("_IN_NETWARE_BASH_") == NULL) + tool_pressanykey(); +#endif + +#ifdef __VMS + vms_special_exit(result, vms_show); +#else + return (int)result; +#endif +} + +#endif /* ndef UNITTESTS */ diff --git a/src/tool_main.h b/src/tool_main.h new file mode 100644 index 0000000..9a7972f --- /dev/null +++ b/src/tool_main.h @@ -0,0 +1,44 @@ +#ifndef HEADER_CURL_TOOL_MAIN_H +#define HEADER_CURL_TOOL_MAIN_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define DEFAULT_MAXREDIRS 50L + +#define RETRY_SLEEP_DEFAULT 1000L /* ms */ +#define RETRY_SLEEP_MAX 600000L /* ms == 10 minutes */ + +#ifndef STDIN_FILENO +# define STDIN_FILENO fileno(stdin) +#endif + +#ifndef STDOUT_FILENO +# define STDOUT_FILENO fileno(stdout) +#endif + +#ifndef STDERR_FILENO +# define STDERR_FILENO fileno(stderr) +#endif + +#endif /* HEADER_CURL_TOOL_MAIN_H */ + diff --git a/src/tool_metalink.c b/src/tool_metalink.c new file mode 100644 index 0000000..5873adf --- /dev/null +++ b/src/tool_metalink.c @@ -0,0 +1,982 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef USE_METALINK + +#include <sys/stat.h> + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#ifdef USE_OPENSSL +# include <openssl/md5.h> +# include <openssl/sha.h> +#elif defined(USE_GNUTLS_NETTLE) +# include <nettle/md5.h> +# include <nettle/sha.h> +# define MD5_CTX struct md5_ctx +# define SHA_CTX struct sha1_ctx +# define SHA256_CTX struct sha256_ctx +#elif defined(USE_GNUTLS) +# include <gcrypt.h> +# define MD5_CTX gcry_md_hd_t +# define SHA_CTX gcry_md_hd_t +# define SHA256_CTX gcry_md_hd_t +#elif defined(USE_NSS) +# include <nss.h> +# include <pk11pub.h> +# define MD5_CTX void * +# define SHA_CTX void * +# define SHA256_CTX void * + static NSSInitContext *nss_context; +#elif defined(USE_POLARSSL) +# include <polarssl/md5.h> +# include <polarssl/sha1.h> +# include <polarssl/sha256.h> +# define MD5_CTX md5_context +# define SHA_CTX sha1_context +# define SHA256_CTX sha256_context +#elif (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && \ + (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1040)) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \ + (__IPHONE_OS_VERSION_MAX_ALLOWED >= 20000)) +/* For Apple operating systems: CommonCrypto has the functions we need. + The library's headers are even backward-compatible with OpenSSL's + headers as long as we define COMMON_DIGEST_FOR_OPENSSL first. + + These functions are available on Tiger and later, as well as iOS 2.0 + and later. If you're building for an older cat, well, sorry. */ +# define COMMON_DIGEST_FOR_OPENSSL +# include <CommonCrypto/CommonDigest.h> +#elif defined(_WIN32) +/* For Windows: If no other crypto library is provided, we fallback + to the hash functions provided within the Microsoft Windows CryptoAPI */ +# include <wincrypt.h> +/* Custom structure in order to store the required provider and hash handle */ +struct win32_crypto_hash { + HCRYPTPROV hCryptProv; + HCRYPTHASH hHash; +}; +/* Custom Microsoft AES Cryptographic Provider defines required for MinGW */ +# ifndef ALG_SID_SHA_256 +# define ALG_SID_SHA_256 12 +# endif +# ifndef CALG_SHA_256 +# define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256) +# endif +# define MD5_CTX struct win32_crypto_hash +# define SHA_CTX struct win32_crypto_hash +# define SHA256_CTX struct win32_crypto_hash +#else +# error "Can't compile METALINK support without a crypto library." +#endif + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_getparam.h" +#include "tool_paramhlp.h" +#include "tool_cfgable.h" +#include "tool_metalink.h" +#include "tool_msgs.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* Copied from tool_getparam.c */ +#define GetStr(str,val) do { \ + if(*(str)) { \ + free(*(str)); \ + *(str) = NULL; \ + } \ + if((val)) \ + *(str) = strdup((val)); \ + if(!(val)) \ + return PARAM_NO_MEM; \ +} WHILE_FALSE + +#ifdef USE_GNUTLS_NETTLE + +static int MD5_Init(MD5_CTX *ctx) +{ + md5_init(ctx); + return 1; +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + md5_update(ctx, inputLen, input); +} + +static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx) +{ + md5_digest(ctx, 16, digest); +} + +static int SHA1_Init(SHA_CTX *ctx) +{ + sha1_init(ctx); + return 1; +} + +static void SHA1_Update(SHA_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + sha1_update(ctx, inputLen, input); +} + +static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx) +{ + sha1_digest(ctx, 20, digest); +} + +static int SHA256_Init(SHA256_CTX *ctx) +{ + sha256_init(ctx); + return 1; +} + +static void SHA256_Update(SHA256_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + sha256_update(ctx, inputLen, input); +} + +static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx) +{ + sha256_digest(ctx, 32, digest); +} + +#elif defined(USE_GNUTLS) + +static int MD5_Init(MD5_CTX *ctx) +{ + gcry_md_open(ctx, GCRY_MD_MD5, 0); + return 1; +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + gcry_md_write(*ctx, input, inputLen); +} + +static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx) +{ + memcpy(digest, gcry_md_read(*ctx, 0), 16); + gcry_md_close(*ctx); +} + +static int SHA1_Init(SHA_CTX *ctx) +{ + gcry_md_open(ctx, GCRY_MD_SHA1, 0); + return 1; +} + +static void SHA1_Update(SHA_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + gcry_md_write(*ctx, input, inputLen); +} + +static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx) +{ + memcpy(digest, gcry_md_read(*ctx, 0), 20); + gcry_md_close(*ctx); +} + +static int SHA256_Init(SHA256_CTX *ctx) +{ + gcry_md_open(ctx, GCRY_MD_SHA256, 0); + return 1; +} + +static void SHA256_Update(SHA256_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + gcry_md_write(*ctx, input, inputLen); +} + +static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx) +{ + memcpy(digest, gcry_md_read(*ctx, 0), 32); + gcry_md_close(*ctx); +} + +#elif defined(USE_NSS) + +static int nss_hash_init(void **pctx, SECOidTag hash_alg) +{ + PK11Context *ctx; + + /* we have to initialize NSS if not initialized alraedy */ + if(!NSS_IsInitialized() && !nss_context) { + static NSSInitParameters params; + params.length = sizeof params; + nss_context = NSS_InitContext("", "", "", "", ¶ms, NSS_INIT_READONLY + | NSS_INIT_NOCERTDB | NSS_INIT_NOMODDB | NSS_INIT_FORCEOPEN + | NSS_INIT_NOROOTINIT | NSS_INIT_OPTIMIZESPACE | NSS_INIT_PK11RELOAD); + } + + ctx = PK11_CreateDigestContext(hash_alg); + if(!ctx) + return /* failure */ 0; + + if(PK11_DigestBegin(ctx) != SECSuccess) { + PK11_DestroyContext(ctx, PR_TRUE); + return /* failure */ 0; + } + + *pctx = ctx; + return /* success */ 1; +} + +static void nss_hash_final(void **pctx, unsigned char *out, unsigned int len) +{ + PK11Context *ctx = *pctx; + unsigned int outlen; + PK11_DigestFinal(ctx, out, &outlen, len); + PK11_DestroyContext(ctx, PR_TRUE); +} + +static int MD5_Init(MD5_CTX *pctx) +{ + return nss_hash_init(pctx, SEC_OID_MD5); +} + +static void MD5_Update(MD5_CTX *pctx, + const unsigned char *input, + unsigned int input_len) +{ + PK11_DigestOp(*pctx, input, input_len); +} + +static void MD5_Final(unsigned char digest[16], MD5_CTX *pctx) +{ + nss_hash_final(pctx, digest, 16); +} + +static int SHA1_Init(SHA_CTX *pctx) +{ + return nss_hash_init(pctx, SEC_OID_SHA1); +} + +static void SHA1_Update(SHA_CTX *pctx, + const unsigned char *input, + unsigned int input_len) +{ + PK11_DigestOp(*pctx, input, input_len); +} + +static void SHA1_Final(unsigned char digest[20], SHA_CTX *pctx) +{ + nss_hash_final(pctx, digest, 20); +} + +static int SHA256_Init(SHA256_CTX *pctx) +{ + return nss_hash_init(pctx, SEC_OID_SHA256); +} + +static void SHA256_Update(SHA256_CTX *pctx, + const unsigned char *input, + unsigned int input_len) +{ + PK11_DigestOp(*pctx, input, input_len); +} + +static void SHA256_Final(unsigned char digest[32], SHA256_CTX *pctx) +{ + nss_hash_final(pctx, digest, 32); +} + +#elif defined(USE_POLARSSL) + +static int MD5_Init(MD5_CTX *ctx) +{ + md5_starts(ctx); + return 1; +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + md5_update(ctx, input, inputLen); +} + +static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx) +{ + md5_finish(ctx, digest); +} + +static int SHA1_Init(SHA_CTX *ctx) +{ + sha1_starts(ctx); + return 1; +} + +static void SHA1_Update(SHA_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + sha1_update(ctx, input, inputLen); +} + +static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx) +{ + sha1_finish(ctx, digest); +} + +static int SHA256_Init(SHA256_CTX *ctx) +{ + sha256_starts(ctx, 0); /* 0 = sha256 */ + return 1; +} + +static void SHA256_Update(SHA256_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + sha256_update(ctx, input, inputLen); +} + +static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx) +{ + sha256_finish(ctx, digest); +} + +#elif defined(_WIN32) && !defined(USE_OPENSSL) + +static void win32_crypto_final(struct win32_crypto_hash *ctx, + unsigned char *digest, + unsigned int digestLen) +{ + unsigned long length; + CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0); + if(length == digestLen) + CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &length, 0); + if(ctx->hHash) + CryptDestroyHash(ctx->hHash); + if(ctx->hCryptProv) + CryptReleaseContext(ctx->hCryptProv, 0); +} + +static int MD5_Init(MD5_CTX *ctx) +{ + if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + CryptCreateHash(ctx->hCryptProv, CALG_MD5, 0, 0, &ctx->hHash); + } + return 1; +} + +static void MD5_Update(MD5_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0); +} + +static void MD5_Final(unsigned char digest[16], MD5_CTX *ctx) +{ + win32_crypto_final(ctx, digest, 16); +} + +static int SHA1_Init(SHA_CTX *ctx) +{ + if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + CryptCreateHash(ctx->hCryptProv, CALG_SHA1, 0, 0, &ctx->hHash); + } + return 1; +} + +static void SHA1_Update(SHA_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0); +} + +static void SHA1_Final(unsigned char digest[20], SHA_CTX *ctx) +{ + win32_crypto_final(ctx, digest, 20); +} + +static int SHA256_Init(SHA256_CTX *ctx) +{ + if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, + PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { + CryptCreateHash(ctx->hCryptProv, CALG_SHA_256, 0, 0, &ctx->hHash); + } + return 1; +} + +static void SHA256_Update(SHA256_CTX *ctx, + const unsigned char *input, + unsigned int inputLen) +{ + CryptHashData(ctx->hHash, (unsigned char *)input, inputLen, 0); +} + +static void SHA256_Final(unsigned char digest[32], SHA256_CTX *ctx) +{ + win32_crypto_final(ctx, digest, 32); +} + +#endif /* CRYPTO LIBS */ + +const digest_params MD5_DIGEST_PARAMS[] = { + { + (Curl_digest_init_func) MD5_Init, + (Curl_digest_update_func) MD5_Update, + (Curl_digest_final_func) MD5_Final, + sizeof(MD5_CTX), + 16 + } +}; + +const digest_params SHA1_DIGEST_PARAMS[] = { + { + (Curl_digest_init_func) SHA1_Init, + (Curl_digest_update_func) SHA1_Update, + (Curl_digest_final_func) SHA1_Final, + sizeof(SHA_CTX), + 20 + } +}; + +const digest_params SHA256_DIGEST_PARAMS[] = { + { + (Curl_digest_init_func) SHA256_Init, + (Curl_digest_update_func) SHA256_Update, + (Curl_digest_final_func) SHA256_Final, + sizeof(SHA256_CTX), + 32 + } +}; + +static const metalink_digest_def SHA256_DIGEST_DEF[] = { + {"sha-256", SHA256_DIGEST_PARAMS} +}; + +static const metalink_digest_def SHA1_DIGEST_DEF[] = { + {"sha-1", SHA1_DIGEST_PARAMS} +}; + +static const metalink_digest_def MD5_DIGEST_DEF[] = { + {"md5", MD5_DIGEST_PARAMS} +}; + +/* + * The alias of supported hash functions in the order by preference + * (basically stronger hash comes first). We included "sha-256" and + * "sha256". The former is the name defined in the IANA registry named + * "Hash Function Textual Names". The latter is widely (and + * historically) used in Metalink version 3. + */ +static const metalink_digest_alias digest_aliases[] = { + {"sha-256", SHA256_DIGEST_DEF}, + {"sha256", SHA256_DIGEST_DEF}, + {"sha-1", SHA1_DIGEST_DEF}, + {"sha1", SHA1_DIGEST_DEF}, + {"md5", MD5_DIGEST_DEF}, + {NULL, NULL} +}; + +digest_context *Curl_digest_init(const digest_params *dparams) +{ + digest_context *ctxt; + + /* Create digest context */ + ctxt = malloc(sizeof *ctxt); + + if(!ctxt) + return ctxt; + + ctxt->digest_hashctx = malloc(dparams->digest_ctxtsize); + + if(!ctxt->digest_hashctx) { + free(ctxt); + return NULL; + } + + ctxt->digest_hash = dparams; + + if(dparams->digest_init(ctxt->digest_hashctx) != 1) { + free(ctxt); + return NULL; + } + + return ctxt; +} + +int Curl_digest_update(digest_context *context, + const unsigned char *data, + unsigned int len) +{ + (*context->digest_hash->digest_update)(context->digest_hashctx, data, len); + + return 0; +} + +int Curl_digest_final(digest_context *context, unsigned char *result) +{ + (*context->digest_hash->digest_final)(result, context->digest_hashctx); + + free(context->digest_hashctx); + free(context); + + return 0; +} + +static unsigned char hex_to_uint(const char *s) +{ + int v[2]; + int i; + for(i = 0; i < 2; ++i) { + v[i] = Curl_raw_toupper(s[i]); + if('0' <= v[i] && v[i] <= '9') { + v[i] -= '0'; + } + else if('A' <= v[i] && v[i] <= 'Z') { + v[i] -= 'A'-10; + } + } + return (unsigned char)((v[0] << 4) | v[1]); +} + +/* + * Check checksum of file denoted by filename. The expected hash value + * is given in hex_hash which is hex-encoded string. + * + * This function returns 1 if it succeeds or one of the following + * integers: + * + * 0: + * Checksum didn't match. + * -1: + * Could not open file; or could not read data from file. + * -2: + * Hash algorithm not available. + */ +static int check_hash(const char *filename, + const metalink_digest_def *digest_def, + const unsigned char *digest, FILE *error) +{ + unsigned char *result; + digest_context *dctx; + int check_ok, flags, fd; + + flags = O_RDONLY; +#ifdef O_BINARY + /* O_BINARY is required in order to avoid binary EOF in text mode */ + flags |= O_BINARY; +#endif + + fd = open(filename, flags); + if(fd == -1) { + fprintf(error, "Metalink: validating (%s) [%s] FAILED (%s)\n", filename, + digest_def->hash_name, strerror(errno)); + return -1; + } + + dctx = Curl_digest_init(digest_def->dparams); + if(!dctx) { + fprintf(error, "Metalink: validating (%s) [%s] FAILED (%s)\n", filename, + digest_def->hash_name, "failed to initialize hash algorithm"); + close(fd); + return -2; + } + + result = malloc(digest_def->dparams->digest_resultlen); + if(!result) { + close(fd); + return -1; + } + while(1) { + unsigned char buf[4096]; + ssize_t len = read(fd, buf, sizeof(buf)); + if(len == 0) { + break; + } + else if(len == -1) { + fprintf(error, "Metalink: validating (%s) [%s] FAILED (%s)\n", filename, + digest_def->hash_name, strerror(errno)); + Curl_digest_final(dctx, result); + close(fd); + return -1; + } + Curl_digest_update(dctx, buf, (unsigned int)len); + } + Curl_digest_final(dctx, result); + check_ok = memcmp(result, digest, + digest_def->dparams->digest_resultlen) == 0; + /* sha*sum style verdict output */ + if(check_ok) + fprintf(error, "Metalink: validating (%s) [%s] OK\n", filename, + digest_def->hash_name); + else + fprintf(error, "Metalink: validating (%s) [%s] FAILED (digest mismatch)\n", + filename, digest_def->hash_name); + + free(result); + close(fd); + return check_ok; +} + +int metalink_check_hash(struct GlobalConfig *config, + metalinkfile *mlfile, + const char *filename) +{ + int rv; + fprintf(config->errors, "Metalink: validating (%s)...\n", filename); + if(mlfile->checksum == NULL) { + fprintf(config->errors, + "Metalink: validating (%s) FAILED (digest missing)\n", filename); + return -2; + } + rv = check_hash(filename, mlfile->checksum->digest_def, + mlfile->checksum->digest, config->errors); + return rv; +} + +static metalink_checksum *new_metalink_checksum_from_hex_digest +(const metalink_digest_def *digest_def, const char *hex_digest) +{ + metalink_checksum *chksum; + unsigned char *digest; + size_t i; + size_t len = strlen(hex_digest); + digest = malloc(len/2); + if(!digest) + return 0; + + for(i = 0; i < len; i += 2) { + digest[i/2] = hex_to_uint(hex_digest+i); + } + chksum = malloc(sizeof(metalink_checksum)); + if(chksum) { + chksum->digest_def = digest_def; + chksum->digest = digest; + } + return chksum; +} + +static metalink_resource *new_metalink_resource(const char *url) +{ + metalink_resource *res; + res = malloc(sizeof(metalink_resource)); + if(res) { + res->next = NULL; + res->url = strdup(url); + if(!res->url) { + free(res); + return NULL; + } + } + return res; +} + +/* Returns nonzero if hex_digest is properly formatted; that is each + letter is in [0-9A-Za-z] and the length of the string equals to the + result length of digest * 2. */ +static int check_hex_digest(const char *hex_digest, + const metalink_digest_def *digest_def) +{ + size_t i; + for(i = 0; hex_digest[i]; ++i) { + char c = hex_digest[i]; + if(!(('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z'))) { + return 0; + } + } + return digest_def->dparams->digest_resultlen * 2 == i; +} + +static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo) +{ + metalinkfile *f; + f = (metalinkfile*)malloc(sizeof(metalinkfile)); + if(!f) + return NULL; + + f->next = NULL; + f->filename = strdup(fileinfo->name); + if(!f->filename) { + free(f); + return NULL; + } + f->checksum = NULL; + f->resource = NULL; + if(fileinfo->checksums) { + const metalink_digest_alias *digest_alias; + for(digest_alias = digest_aliases; digest_alias->alias_name; + ++digest_alias) { + metalink_checksum_t **p; + for(p = fileinfo->checksums; *p; ++p) { + if(Curl_raw_equal(digest_alias->alias_name, (*p)->type) && + check_hex_digest((*p)->hash, digest_alias->digest_def)) { + f->checksum = + new_metalink_checksum_from_hex_digest(digest_alias->digest_def, + (*p)->hash); + break; + } + } + if(f->checksum) { + break; + } + } + } + if(fileinfo->resources) { + metalink_resource_t **p; + metalink_resource root, *tail; + root.next = NULL; + tail = &root; + for(p = fileinfo->resources; *p; ++p) { + metalink_resource *res; + /* Filter by type if it is non-NULL. In Metalink v3, type + includes the type of the resource. In curl, we are only + interested in HTTP, HTTPS and FTP. In addition to them, + Metalink v3 file may contain bittorrent type URL, which + points to the BitTorrent metainfo file. We ignore it here. + In Metalink v4, type was deprecated and all + fileinfo->resources point to the target file. BitTorrent + metainfo file URL may be appeared in fileinfo->metaurls. + */ + if((*p)->type == NULL || + Curl_raw_equal((*p)->type, "http") || + Curl_raw_equal((*p)->type, "https") || + Curl_raw_equal((*p)->type, "ftp") || + Curl_raw_equal((*p)->type, "ftps")) { + res = new_metalink_resource((*p)->url); + tail->next = res; + tail = res; + } + } + f->resource = root.next; + } + return f; +} + +int parse_metalink(struct OperationConfig *config, struct OutStruct *outs, + const char *metalink_url) +{ + metalink_error_t r; + metalink_t* metalink; + metalink_file_t **files; + bool warnings = FALSE; + + /* metlaink_parse_final deletes outs->metalink_parser */ + r = metalink_parse_final(outs->metalink_parser, NULL, 0, &metalink); + outs->metalink_parser = NULL; + if(r != 0) { + return -1; + } + if(metalink->files == NULL) { + fprintf(config->global->errors, "Metalink: parsing (%s) WARNING " + "(missing or invalid file name)\n", + metalink_url); + metalink_delete(metalink); + return -1; + } + for(files = metalink->files; *files; ++files) { + struct getout *url; + /* Skip an entry which has no resource. */ + if(!(*files)->resources) { + fprintf(config->global->errors, "Metalink: parsing (%s) WARNING " + "(missing or invalid resource)\n", + metalink_url, (*files)->name); + continue; + } + if(config->url_get || + ((config->url_get = config->url_list) != NULL)) { + /* there's a node here, if it already is filled-in continue to + find an "empty" node */ + while(config->url_get && (config->url_get->flags & GETOUT_URL)) + config->url_get = config->url_get->next; + } + + /* now there might or might not be an available node to fill in! */ + + if(config->url_get) + /* existing node */ + url = config->url_get; + else + /* there was no free node, create one! */ + url = new_getout(config); + + if(url) { + metalinkfile *mlfile = new_metalinkfile(*files); + if(!mlfile) + break; + + if(!mlfile->checksum) { + warnings = TRUE; + fprintf(config->global->errors, + "Metalink: parsing (%s) WARNING (digest missing)\n", + metalink_url); + } + /* Set name as url */ + GetStr(&url->url, mlfile->filename); + + /* set flag metalink here */ + url->flags |= GETOUT_URL | GETOUT_METALINK; + + if(config->metalinkfile_list) { + config->metalinkfile_last->next = mlfile; + config->metalinkfile_last = mlfile; + } + else { + config->metalinkfile_list = config->metalinkfile_last = mlfile; + } + } + } + metalink_delete(metalink); + return (warnings) ? -2 : 0; +} + +size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb, + void *userdata) +{ + struct OutStruct *outs = userdata; + struct OperationConfig *config = outs->config; + int rv; + + /* + * Once that libcurl has called back tool_write_cb() the returned value + * is checked against the amount that was intended to be written, if + * it does not match then it fails with CURLE_WRITE_ERROR. So at this + * point returning a value different from sz*nmemb indicates failure. + */ + const size_t failure = (sz * nmemb) ? 0 : 1; + + if(!config) + return failure; + + rv = metalink_parse_update(outs->metalink_parser, buffer, sz *nmemb); + if(rv == 0) + return sz * nmemb; + else { + fprintf(config->global->errors, "Metalink: parsing FAILED\n"); + return failure; + } +} + +/* + * Returns nonzero if content_type includes mediatype. + */ +static int check_content_type(const char *content_type, const char *media_type) +{ + const char *ptr = content_type; + size_t media_type_len = strlen(media_type); + for(; *ptr && (*ptr == ' ' || *ptr == '\t'); ++ptr); + if(!*ptr) { + return 0; + } + return Curl_raw_nequal(ptr, media_type, media_type_len) && + (*(ptr+media_type_len) == '\0' || *(ptr+media_type_len) == ' ' || + *(ptr+media_type_len) == '\t' || *(ptr+media_type_len) == ';'); +} + +int check_metalink_content_type(const char *content_type) +{ + return check_content_type(content_type, "application/metalink+xml"); +} + +int count_next_metalink_resource(metalinkfile *mlfile) +{ + int count = 0; + metalink_resource *res; + for(res = mlfile->resource; res; res = res->next, ++count); + return count; +} + +static void delete_metalink_checksum(metalink_checksum *chksum) +{ + if(chksum == NULL) { + return; + } + Curl_safefree(chksum->digest); + Curl_safefree(chksum); +} + +static void delete_metalink_resource(metalink_resource *res) +{ + if(res == NULL) { + return; + } + Curl_safefree(res->url); + Curl_safefree(res); +} + +static void delete_metalinkfile(metalinkfile *mlfile) +{ + metalink_resource *res; + if(mlfile == NULL) { + return; + } + Curl_safefree(mlfile->filename); + delete_metalink_checksum(mlfile->checksum); + for(res = mlfile->resource; res;) { + metalink_resource *next; + next = res->next; + delete_metalink_resource(res); + res = next; + } + Curl_safefree(mlfile); +} + +void clean_metalink(struct OperationConfig *config) +{ + while(config->metalinkfile_list) { + metalinkfile *mlfile = config->metalinkfile_list; + config->metalinkfile_list = config->metalinkfile_list->next; + delete_metalinkfile(mlfile); + } + config->metalinkfile_last = 0; +} + +void metalink_cleanup(void) +{ +#ifdef USE_NSS + if(nss_context) { + NSS_ShutdownContext(nss_context); + nss_context = NULL; + } +#endif +} + +#endif /* USE_METALINK */ diff --git a/src/tool_metalink.h b/src/tool_metalink.h new file mode 100644 index 0000000..3685906 --- /dev/null +++ b/src/tool_metalink.h @@ -0,0 +1,167 @@ +#ifndef HEADER_CURL_TOOL_METALINK_H +#define HEADER_CURL_TOOL_METALINK_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +struct GlobalConfig; +struct OperationConfig; + +/* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */ +typedef int (* Curl_digest_init_func)(void *context); + +typedef void (* Curl_digest_update_func)(void *context, + const unsigned char *data, + unsigned int len); +typedef void (* Curl_digest_final_func)(unsigned char *result, void *context); + +typedef struct { + Curl_digest_init_func digest_init; /* Initialize context procedure */ + Curl_digest_update_func digest_update; /* Update context with data */ + Curl_digest_final_func digest_final; /* Get final result procedure */ + unsigned int digest_ctxtsize; /* Context structure size */ + unsigned int digest_resultlen; /* Result length (bytes) */ +} digest_params; + +typedef struct { + const digest_params *digest_hash; /* Hash function definition */ + void *digest_hashctx; /* Hash function context */ +} digest_context; + +digest_context * Curl_digest_init(const digest_params *dparams); +int Curl_digest_update(digest_context *context, + const unsigned char *data, + unsigned int len); +int Curl_digest_final(digest_context *context, unsigned char *result); + +typedef struct { + const char *hash_name; + const digest_params *dparams; +} metalink_digest_def; + +typedef struct { + const char *alias_name; + const metalink_digest_def *digest_def; +} metalink_digest_alias; + +typedef struct metalink_checksum { + const metalink_digest_def *digest_def; + /* raw digest value, not ascii hex digest */ + unsigned char *digest; +} metalink_checksum; + +typedef struct metalink_resource { + struct metalink_resource *next; + char *url; +} metalink_resource; + +typedef struct metalinkfile { + struct metalinkfile *next; + char *filename; + metalink_checksum *checksum; + metalink_resource *resource; +} metalinkfile; + +#ifdef USE_METALINK + +/* + * curl requires libmetalink 0.1.0 or newer + */ +#define CURL_REQ_LIBMETALINK_MAJOR 0 +#define CURL_REQ_LIBMETALINK_MINOR 1 +#define CURL_REQ_LIBMETALINK_PATCH 0 + +#define CURL_REQ_LIBMETALINK_VERS ((CURL_REQ_LIBMETALINK_MAJOR * 10000) + \ + (CURL_REQ_LIBMETALINK_MINOR * 100) + \ + CURL_REQ_LIBMETALINK_PATCH) + +extern const digest_params MD5_DIGEST_PARAMS[1]; +extern const digest_params SHA1_DIGEST_PARAMS[1]; +extern const digest_params SHA256_DIGEST_PARAMS[1]; + +#include <metalink/metalink.h> + +/* + * Counts the resource in the metalinkfile. + */ +int count_next_metalink_resource(metalinkfile *mlfile); +void clean_metalink(struct OperationConfig *config); + +/* + * Performs final parse operation and extracts information from + * Metalink and creates metalinkfile structs. + * + * This function returns 0 if it succeeds without warnings, or one of + * the following negative error codes: + * + * -1: Parsing failed; or no file is found + * -2: Parsing succeeded with some warnings. + */ +int parse_metalink(struct OperationConfig *config, struct OutStruct *outs, + const char *metalink_url); + +/* + * Callback function for CURLOPT_WRITEFUNCTION + */ +size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb, + void *userdata); + +/* + * Returns nonzero if content_type includes "application/metalink+xml" + * media-type. The check is done in case-insensitive manner. + */ +int check_metalink_content_type(const char *content_type); + +/* + * Check checksum of file denoted by filename. + * + * This function returns 1 if the checksum matches or one of the + * following integers: + * + * 0: + * Checksum didn't match. + * -1: + * Could not open file; or could not read data from file. + * -2: + * No checksum in Metalink supported, hash algorithm not available, or + * Metalink does not contain checksum. + */ +int metalink_check_hash(struct GlobalConfig *config, + metalinkfile *mlfile, + const char *filename); + +/* + * Release resources allocated at global scope. + */ +void metalink_cleanup(void); + +#else /* USE_METALINK */ + +#define count_next_metalink_resource(x) 0 +#define clean_metalink(x) (void)x + +/* metalink_cleanup() takes no arguments */ +#define metalink_cleanup() Curl_nop_stmt + +#endif /* USE_METALINK */ + +#endif /* HEADER_CURL_TOOL_METALINK_H */ diff --git a/src/tool_mfiles.c b/src/tool_mfiles.c new file mode 100644 index 0000000..3eda45f --- /dev/null +++ b/src/tool_mfiles.c @@ -0,0 +1,127 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "tool_mfiles.h" + +#include "memdebug.h" /* keep this as LAST include */ + +static void AppendNode(struct multi_files **first, + struct multi_files **last, + struct multi_files *new) +{ + DEBUGASSERT(((*first) && (*last)) || ((!*first) && (!*last))); + + if(*last) + (*last)->next = new; + else + *first = new; + *last = new; +} + +/* + * AddMultiFiles: Add a new list node possibly followed with a type_name. + * + * multi_first argument is the address of a pointer to the first element + * of the multi_files linked list. A NULL pointer indicates empty list. + * + * multi_last argument is the address of a pointer to the last element + * of the multi_files linked list. A NULL pointer indicates empty list. + * + * Pointers stored in multi_first and multi_last are modified while + * function is executed. An out of memory condition free's the whole + * list and returns with pointers stored in multi_first and multi_last + * set to NULL and a NULL function result. + * + * Function returns same pointer as stored at multi_last. + */ + +struct multi_files *AddMultiFiles(const char *file_name, + const char *type_name, + const char *show_filename, + struct multi_files **multi_first, + struct multi_files **multi_last) +{ + struct multi_files *multi; + struct multi_files *multi_type; + struct multi_files *multi_name; + + multi = calloc(1, sizeof(struct multi_files)); + if(multi) { + multi->form.option = CURLFORM_FILE; + multi->form.value = file_name; + AppendNode(multi_first, multi_last, multi); + } + else { + FreeMultiInfo(multi_first, multi_last); + return NULL; + } + + if(type_name) { + multi_type = calloc(1, sizeof(struct multi_files)); + if(multi_type) { + multi_type->form.option = CURLFORM_CONTENTTYPE; + multi_type->form.value = type_name; + AppendNode(multi_first, multi_last, multi_type); + } + else { + FreeMultiInfo(multi_first, multi_last); + return NULL; + } + } + + if(show_filename) { + multi_name = calloc(1, sizeof(struct multi_files)); + if(multi_name) { + multi_name->form.option = CURLFORM_FILENAME; + multi_name->form.value = show_filename; + AppendNode(multi_first, multi_last, multi_name); + } + else { + FreeMultiInfo(multi_first, multi_last); + return NULL; + } + } + + return *multi_last; +} + +/* + * FreeMultiInfo: Free the items of the list. + */ + +void FreeMultiInfo(struct multi_files **multi_first, + struct multi_files **multi_last) +{ + struct multi_files *next; + struct multi_files *item = *multi_first; + + while(item) { + next = item->next; + Curl_safefree(item); + item = next; + } + *multi_first = NULL; + if(multi_last) + *multi_last = NULL; +} + diff --git a/src/tool_mfiles.h b/src/tool_mfiles.h new file mode 100644 index 0000000..1ea6f4a --- /dev/null +++ b/src/tool_mfiles.h @@ -0,0 +1,46 @@ +#ifndef HEADER_CURL_TOOL_MFILES_H +#define HEADER_CURL_TOOL_MFILES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* + * Structure for storing the information needed to build + * a multiple files section. + */ + +struct multi_files { + struct curl_forms form; + struct multi_files *next; +}; + +struct multi_files *AddMultiFiles(const char *file_name, + const char *type_name, + const char *show_filename, + struct multi_files **multi_first, + struct multi_files **multi_last); + +void FreeMultiInfo(struct multi_files **multi_first, + struct multi_files **multi_last); + +#endif /* HEADER_CURL_TOOL_MFILES_H */ + diff --git a/src/tool_msgs.c b/src/tool_msgs.c new file mode 100644 index 0000000..38de977 --- /dev/null +++ b/src/tool_msgs.c @@ -0,0 +1,100 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_msgs.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#define WARN_PREFIX "Warning: " +#define WARN_TEXTWIDTH (79 - (int)strlen(WARN_PREFIX)) + +/* + * Emit warning formatted message on configured 'errors' stream unless + * mute (--silent) was selected. + */ + +void warnf(struct GlobalConfig *config, const char *fmt, ...) +{ + if(!config->mute) { + va_list ap; + int len; + char *ptr; + char print_buffer[256]; + + va_start(ap, fmt); + len = vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap); + va_end(ap); + + ptr = print_buffer; + while(len > 0) { + fputs(WARN_PREFIX, config->errors); + + if(len > (int)WARN_TEXTWIDTH) { + int cut = WARN_TEXTWIDTH-1; + + while(!ISSPACE(ptr[cut]) && cut) { + cut--; + } + if(0 == cut) + /* not a single cutting position was found, just cut it at the + max text width then! */ + cut = WARN_TEXTWIDTH-1; + + (void)fwrite(ptr, cut + 1, 1, config->errors); + fputs("\n", config->errors); + ptr += cut+1; /* skip the space too */ + len -= cut; + } + else { + fputs(ptr, config->errors); + len = 0; + } + } + } +} + +/* + * Emit help formatted message on given stream. + */ + +void helpf(FILE *errors, const char *fmt, ...) +{ + va_list ap; + if(fmt) { + va_start(ap, fmt); + fputs("curl: ", errors); /* prefix it */ + vfprintf(errors, fmt, ap); + va_end(ap); + } + fprintf(errors, "curl: try 'curl --help' " +#ifdef USE_MANUAL + "or 'curl --manual' " +#endif + "for more information\n"); +} + diff --git a/src/tool_msgs.h b/src/tool_msgs.h new file mode 100644 index 0000000..bf97bfb --- /dev/null +++ b/src/tool_msgs.h @@ -0,0 +1,31 @@ +#ifndef HEADER_CURL_TOOL_MSGS_H +#define HEADER_CURL_TOOL_MSGS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +void warnf(struct GlobalConfig *config, const char *fmt, ...); + +void helpf(FILE *errors, const char *fmt, ...); + +#endif /* HEADER_CURL_TOOL_MSGS_H */ + diff --git a/src/tool_operate.c b/src/tool_operate.c new file mode 100644 index 0000000..fea587b --- /dev/null +++ b/src/tool_operate.c @@ -0,0 +1,1900 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#ifdef HAVE_UTIME_H +# include <utime.h> +#elif defined(HAVE_SYS_UTIME_H) +# include <sys/utime.h> +#endif + +#ifdef HAVE_LOCALE_H +# include <locale.h> +#endif + +#ifdef HAVE_NETINET_TCP_H +# include <netinet/tcp.h> +#endif + +#ifdef __VMS +# include <fabdef.h> +#endif + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_binmode.h" +#include "tool_cfgable.h" +#include "tool_cb_dbg.h" +#include "tool_cb_hdr.h" +#include "tool_cb_prg.h" +#include "tool_cb_rea.h" +#include "tool_cb_see.h" +#include "tool_cb_wrt.h" +#include "tool_dirhie.h" +#include "tool_doswin.h" +#include "tool_easysrc.h" +#include "tool_getparam.h" +#include "tool_helpers.h" +#include "tool_homedir.h" +#include "tool_libinfo.h" +#include "tool_main.h" +#include "tool_metalink.h" +#include "tool_msgs.h" +#include "tool_operate.h" +#include "tool_operhlp.h" +#include "tool_paramhlp.h" +#include "tool_parsecfg.h" +#include "tool_setopt.h" +#include "tool_sleep.h" +#include "tool_urlglob.h" +#include "tool_util.h" +#include "tool_writeenv.h" +#include "tool_writeout.h" +#include "tool_xattr.h" +#include "tool_vms.h" +#include "tool_help.h" +#include "tool_hugehelp.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef CURLDEBUG +/* libcurl's debug builds provide an extra function */ +CURLcode curl_easy_perform_ev(CURL *easy); +#endif + +#define CURLseparator "--_curl_--" + +#ifndef O_BINARY +/* since O_BINARY as used in bitmasks, setting it to zero makes it usable in + source code but yet it doesn't ruin anything */ +# define O_BINARY 0 +#endif + +#define CURL_CA_CERT_ERRORMSG1 \ + "More details here: http://curl.haxx.se/docs/sslcerts.html\n\n" \ + "curl performs SSL certificate verification by default, " \ + "using a \"bundle\"\n" \ + " of Certificate Authority (CA) public keys (CA certs). If the default\n" \ + " bundle file isn't adequate, you can specify an alternate file\n" \ + " using the --cacert option.\n" + +#define CURL_CA_CERT_ERRORMSG2 \ + "If this HTTPS server uses a certificate signed by a CA represented in\n" \ + " the bundle, the certificate verification probably failed due to a\n" \ + " problem with the certificate (it might be expired, or the name might\n" \ + " not match the domain name in the URL).\n" \ + "If you'd like to turn off curl's verification of the certificate, use\n" \ + " the -k (or --insecure) option.\n" + +static bool is_fatal_error(CURLcode code) +{ + switch(code) { + /* TODO: Should CURLE_SSL_CACERT be included as critical error ? */ + case CURLE_FAILED_INIT: + case CURLE_OUT_OF_MEMORY: + case CURLE_UNKNOWN_OPTION: + case CURLE_FUNCTION_NOT_FOUND: + case CURLE_BAD_FUNCTION_ARGUMENT: + /* critical error */ + return TRUE; + default: + break; + } + + /* no error or not critical */ + return FALSE; +} + +#ifdef __VMS +/* + * get_vms_file_size does what it takes to get the real size of the file + * + * For fixed files, find out the size of the EOF block and adjust. + * + * For all others, have to read the entire file in, discarding the contents. + * Most posted text files will be small, and binary files like zlib archives + * and CD/DVD images should be either a STREAM_LF format or a fixed format. + * + */ +static curl_off_t vms_realfilesize(const char * name, + const struct_stat * stat_buf) +{ + char buffer[8192]; + curl_off_t count; + int ret_stat; + FILE * file; + + file = fopen(name, "r"); /* VMS */ + if(file == NULL) { + return 0; + } + count = 0; + ret_stat = 1; + while(ret_stat > 0) { + ret_stat = fread(buffer, 1, sizeof(buffer), file); + if(ret_stat != 0) + count += ret_stat; + } + fclose(file); + + return count; +} + +/* + * + * VmsSpecialSize checks to see if the stat st_size can be trusted and + * if not to call a routine to get the correct size. + * + */ +static curl_off_t VmsSpecialSize(const char * name, + const struct_stat * stat_buf) +{ + switch(stat_buf->st_fab_rfm) { + case FAB$C_VAR: + case FAB$C_VFC: + return vms_realfilesize(name, stat_buf); + break; + default: + return stat_buf->st_size; + } +} +#endif /* __VMS */ + +static CURLcode operate_do(struct GlobalConfig *global, + struct OperationConfig *config) +{ + char errorbuffer[CURL_ERROR_SIZE]; + struct ProgressData progressbar; + struct getout *urlnode; + + struct HdrCbData hdrcbdata; + struct OutStruct heads; + + metalinkfile *mlfile_last = NULL; + + CURL *curl = config->easy; + char *httpgetfields = NULL; + + CURLcode result = CURLE_OK; + unsigned long li; + + /* Save the values of noprogress and isatty to restore them later on */ + bool orig_noprogress = global->noprogress; + bool orig_isatty = global->isatty; + + errorbuffer[0] = '\0'; + + /* default headers output stream is stdout */ + memset(&hdrcbdata, 0, sizeof(struct HdrCbData)); + memset(&heads, 0, sizeof(struct OutStruct)); + heads.stream = stdout; + heads.config = config; + + /* + ** Beyond this point no return'ing from this function allowed. + ** Jump to label 'quit_curl' in order to abandon this function + ** from outside of nested loops further down below. + */ + + /* Check we have a url */ + if(!config->url_list || !config->url_list->url) { + helpf(global->errors, "no URL specified!\n"); + result = CURLE_FAILED_INIT; + goto quit_curl; + } + + /* On WIN32 we can't set the path to curl-ca-bundle.crt + * at compile time. So we look here for the file in two ways: + * 1: look at the environment variable CURL_CA_BUNDLE for a path + * 2: if #1 isn't found, use the windows API function SearchPath() + * to find it along the app's path (includes app's dir and CWD) + * + * We support the environment variable thing for non-Windows platforms + * too. Just for the sake of it. + */ + if(!config->cacert && + !config->capath && + !config->insecure_ok) { + char *env; + env = curlx_getenv("CURL_CA_BUNDLE"); + if(env) { + config->cacert = strdup(env); + if(!config->cacert) { + curl_free(env); + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + goto quit_curl; + } + } + else { + env = curlx_getenv("SSL_CERT_DIR"); + if(env) { + config->capath = strdup(env); + if(!config->capath) { + curl_free(env); + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + goto quit_curl; + } + } + else { + env = curlx_getenv("SSL_CERT_FILE"); + if(env) { + config->cacert = strdup(env); + if(!config->cacert) { + curl_free(env); + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + goto quit_curl; + } + } + } + } + + if(env) + curl_free(env); +#ifdef WIN32 + else { + result = FindWin32CACert(config, "curl-ca-bundle.crt"); + if(result) + goto quit_curl; + } +#endif + } + + if(config->postfields) { + if(config->use_httpget) { + /* Use the postfields data for a http get */ + httpgetfields = strdup(config->postfields); + Curl_safefree(config->postfields); + if(!httpgetfields) { + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + goto quit_curl; + } + if(SetHTTPrequest(config, + (config->no_body?HTTPREQ_HEAD:HTTPREQ_GET), + &config->httpreq)) { + result = CURLE_FAILED_INIT; + goto quit_curl; + } + } + else { + if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) { + result = CURLE_FAILED_INIT; + goto quit_curl; + } + } + } + + /* Single header file for all URLs */ + if(config->headerfile) { + /* open file for output: */ + if(!curlx_strequal(config->headerfile, "-")) { + FILE *newfile = fopen(config->headerfile, "wb"); + if(!newfile) { + warnf(config->global, "Failed to open %s\n", config->headerfile); + result = CURLE_WRITE_ERROR; + goto quit_curl; + } + else { + heads.filename = config->headerfile; + heads.s_isreg = TRUE; + heads.fopened = TRUE; + heads.stream = newfile; + } + } + else { + /* always use binary mode for protocol header output */ + set_binmode(heads.stream); + } + } + + /* + ** Nested loops start here. + */ + + /* loop through the list of given URLs */ + + for(urlnode = config->url_list; urlnode; urlnode = urlnode->next) { + + unsigned long up; /* upload file counter within a single upload glob */ + char *infiles; /* might be a glob pattern */ + char *outfiles; + unsigned long infilenum; + URLGlob *inglob; + + int metalink = 0; /* nonzero for metalink download. */ + metalinkfile *mlfile; + metalink_resource *mlres; + + outfiles = NULL; + infilenum = 1; + inglob = NULL; + + if(urlnode->flags & GETOUT_METALINK) { + metalink = 1; + if(mlfile_last == NULL) { + mlfile_last = config->metalinkfile_list; + } + mlfile = mlfile_last; + mlfile_last = mlfile_last->next; + mlres = mlfile->resource; + } + else { + mlfile = NULL; + mlres = NULL; + } + + /* urlnode->url is the full URL (it might be NULL) */ + + if(!urlnode->url) { + /* This node has no URL. Free node data without destroying the + node itself nor modifying next pointer and continue to next */ + Curl_safefree(urlnode->outfile); + Curl_safefree(urlnode->infile); + urlnode->flags = 0; + continue; /* next URL please */ + } + + /* save outfile pattern before expansion */ + if(urlnode->outfile) { + outfiles = strdup(urlnode->outfile); + if(!outfiles) { + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + break; + } + } + + infiles = urlnode->infile; + + if(!config->globoff && infiles) { + /* Unless explicitly shut off */ + result = glob_url(&inglob, infiles, &infilenum, + global->showerror?global->errors:NULL); + if(result) { + Curl_safefree(outfiles); + break; + } + } + + /* Here's the loop for uploading multiple files within the same + single globbed string. If no upload, we enter the loop once anyway. */ + for(up = 0 ; up < infilenum; up++) { + + char *uploadfile; /* a single file, never a glob */ + int separator; + URLGlob *urls; + unsigned long urlnum; + + uploadfile = NULL; + urls = NULL; + urlnum = 0; + + if(!up && !infiles) + Curl_nop_stmt; + else { + if(inglob) { + result = glob_next_url(&uploadfile, inglob); + if(result == CURLE_OUT_OF_MEMORY) + helpf(global->errors, "out of memory\n"); + } + else if(!up) { + uploadfile = strdup(infiles); + if(!uploadfile) { + helpf(global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + } + } + else + uploadfile = NULL; + if(!uploadfile) + break; + } + + if(metalink) { + /* For Metalink download, we don't use glob. Instead we use + the number of resources as urlnum. */ + urlnum = count_next_metalink_resource(mlfile); + } + else + if(!config->globoff) { + /* Unless explicitly shut off, we expand '{...}' and '[...]' + expressions and return total number of URLs in pattern set */ + result = glob_url(&urls, urlnode->url, &urlnum, + global->showerror?global->errors:NULL); + if(result) { + Curl_safefree(uploadfile); + break; + } + } + else + urlnum = 1; /* without globbing, this is a single URL */ + + /* if multiple files extracted to stdout, insert separators! */ + separator= ((!outfiles || curlx_strequal(outfiles, "-")) && urlnum > 1); + + /* Here's looping around each globbed URL */ + for(li = 0 ; li < urlnum; li++) { + + int infd; + bool infdopen; + char *outfile; + struct OutStruct outs; + struct InStruct input; + struct timeval retrystart; + curl_off_t uploadfilesize; + long retry_numretries; + long retry_sleep_default; + long retry_sleep; + char *this_url = NULL; + int metalink_next_res = 0; + + outfile = NULL; + infdopen = FALSE; + infd = STDIN_FILENO; + uploadfilesize = -1; /* -1 means unknown */ + + /* default output stream is stdout */ + memset(&outs, 0, sizeof(struct OutStruct)); + outs.stream = stdout; + outs.config = config; + + if(metalink) { + /* For Metalink download, use name in Metalink file as + filename. */ + outfile = strdup(mlfile->filename); + if(!outfile) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + this_url = strdup(mlres->url); + if(!this_url) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + } + else { + if(urls) { + result = glob_next_url(&this_url, urls); + if(result) + goto show_error; + } + else if(!li) { + this_url = strdup(urlnode->url); + if(!this_url) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + } + else + this_url = NULL; + if(!this_url) + break; + + if(outfiles) { + outfile = strdup(outfiles); + if(!outfile) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + } + } + + if(((urlnode->flags&GETOUT_USEREMOTE) || + (outfile && !curlx_strequal("-", outfile))) && + (metalink || !config->use_metalink)) { + + /* + * We have specified a file name to store the result in, or we have + * decided we want to use the remote file name. + */ + + if(!outfile) { + /* extract the file name from the URL */ + result = get_url_file_name(&outfile, this_url); + if(result) + goto show_error; + if(!*outfile && !config->content_disposition) { + helpf(global->errors, "Remote file name has no length!\n"); + result = CURLE_WRITE_ERROR; + goto quit_urls; + } +#if defined(MSDOS) || defined(WIN32) + /* For DOS and WIN32, we do some major replacing of + bad characters in the file name before using it */ + outfile = sanitize_dos_name(outfile); + if(!outfile) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } +#endif /* MSDOS || WIN32 */ + } + else if(urls) { + /* fill '#1' ... '#9' terms from URL pattern */ + char *storefile = outfile; + result = glob_match_url(&outfile, storefile, urls); + Curl_safefree(storefile); + if(result) { + /* bad globbing */ + warnf(config->global, "bad output glob!\n"); + goto quit_urls; + } + } + + /* Create the directory hierarchy, if not pre-existent to a multiple + file output call */ + + if(config->create_dirs || metalink) { + result = create_dir_hierarchy(outfile, global->errors); + /* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */ + if(result == CURLE_WRITE_ERROR) + goto quit_urls; + if(result) { + goto show_error; + } + } + + if((urlnode->flags & GETOUT_USEREMOTE) + && config->content_disposition) { + /* Our header callback MIGHT set the filename */ + DEBUGASSERT(!outs.filename); + } + + if(config->resume_from_current) { + /* We're told to continue from where we are now. Get the size + of the file as it is now and open it for append instead */ + struct_stat fileinfo; + /* VMS -- Danger, the filesize is only valid for stream files */ + if(0 == stat(outfile, &fileinfo)) + /* set offset to current file size: */ + config->resume_from = fileinfo.st_size; + else + /* let offset be 0 */ + config->resume_from = 0; + } + + if(config->resume_from) { +#ifdef __VMS + /* open file for output, forcing VMS output format into stream + mode which is needed for stat() call above to always work. */ + FILE *file = fopen(outfile, config->resume_from?"ab":"wb", + "ctx=stm", "rfm=stmlf", "rat=cr", "mrs=0"); +#else + /* open file for output: */ + FILE *file = fopen(outfile, config->resume_from?"ab":"wb"); +#endif + if(!file) { + helpf(global->errors, "Can't open '%s'!\n", outfile); + result = CURLE_WRITE_ERROR; + goto quit_urls; + } + outs.fopened = TRUE; + outs.stream = file; + outs.init = config->resume_from; + } + else { + outs.stream = NULL; /* open when needed */ + } + outs.filename = outfile; + outs.s_isreg = TRUE; + } + + if(uploadfile && !stdin_upload(uploadfile)) { + /* + * We have specified a file to upload and it isn't "-". + */ + struct_stat fileinfo; + + this_url = add_file_name_to_url(curl, this_url, uploadfile); + if(!this_url) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + /* VMS Note: + * + * Reading binary from files can be a problem... Only FIXED, VAR + * etc WITHOUT implied CC will work Others need a \n appended to a + * line + * + * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a + * fixed file with implied CC needs to have a byte added for every + * record processed, this can by derived from Filesize & recordsize + * for VARiable record files the records need to be counted! for + * every record add 1 for linefeed and subtract 2 for the record + * header for VARIABLE header files only the bare record data needs + * to be considered with one appended if implied CC + */ +#ifdef __VMS + /* Calculate the real upload site for VMS */ + infd = -1; + if(stat(uploadfile, &fileinfo) == 0) { + fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo); + switch (fileinfo.st_fab_rfm) { + case FAB$C_VAR: + case FAB$C_VFC: + case FAB$C_STMCR: + infd = open(uploadfile, O_RDONLY | O_BINARY); + break; + default: + infd = open(uploadfile, O_RDONLY | O_BINARY, + "rfm=stmlf", "ctx=stm"); + } + } + if(infd == -1) +#else + infd = open(uploadfile, O_RDONLY | O_BINARY); + if((infd == -1) || fstat(infd, &fileinfo)) +#endif + { + helpf(global->errors, "Can't open '%s'!\n", uploadfile); + if(infd != -1) { + close(infd); + infd = STDIN_FILENO; + } + result = CURLE_READ_ERROR; + goto quit_urls; + } + infdopen = TRUE; + + /* we ignore file size for char/block devices, sockets, etc. */ + if(S_ISREG(fileinfo.st_mode)) + uploadfilesize = fileinfo.st_size; + + } + else if(uploadfile && stdin_upload(uploadfile)) { + /* count to see if there are more than one auth bit set + in the authtype field */ + int authbits = 0; + int bitcheck = 0; + while(bitcheck < 32) { + if(config->authtype & (1UL << bitcheck++)) { + authbits++; + if(authbits > 1) { + /* more than one, we're done! */ + break; + } + } + } + + /* + * If the user has also selected --anyauth or --proxy-anyauth + * we should warn him/her. + */ + if(config->proxyanyauth || (authbits>1)) { + warnf(config->global, + "Using --anyauth or --proxy-anyauth with upload from stdin" + " involves a big risk of it not working. Use a temporary" + " file or a fixed auth type instead!\n"); + } + + DEBUGASSERT(infdopen == FALSE); + DEBUGASSERT(infd == STDIN_FILENO); + + set_binmode(stdin); + if(curlx_strequal(uploadfile, ".")) { + if(curlx_nonblock((curl_socket_t)infd, TRUE) < 0) + warnf(config->global, + "fcntl failed on fd=%d: %s\n", infd, strerror(errno)); + } + } + + if(uploadfile && config->resume_from_current) + config->resume_from = -1; /* -1 will then force get-it-yourself */ + + if(output_expected(this_url, uploadfile) && outs.stream && + isatty(fileno(outs.stream))) + /* we send the output to a tty, therefore we switch off the progress + meter */ + global->noprogress = global->isatty = TRUE; + else { + /* progress meter is per download, so restore config + values */ + global->noprogress = orig_noprogress; + global->isatty = orig_isatty; + } + + if(urlnum > 1 && !global->mute) { + fprintf(global->errors, "\n[%lu/%lu]: %s --> %s\n", + li+1, urlnum, this_url, outfile ? outfile : "<stdout>"); + if(separator) + printf("%s%s\n", CURLseparator, this_url); + } + if(httpgetfields) { + char *urlbuffer; + /* Find out whether the url contains a file name */ + const char *pc = strstr(this_url, "://"); + char sep = '?'; + if(pc) + pc += 3; + else + pc = this_url; + + pc = strrchr(pc, '/'); /* check for a slash */ + + if(pc) { + /* there is a slash present in the URL */ + + if(strchr(pc, '?')) + /* Ouch, there's already a question mark in the URL string, we + then append the data with an ampersand separator instead! */ + sep='&'; + } + /* + * Then append ? followed by the get fields to the url. + */ + if(pc) + urlbuffer = aprintf("%s%c%s", this_url, sep, httpgetfields); + else + /* Append / before the ? to create a well-formed url + if the url contains a hostname only + */ + urlbuffer = aprintf("%s/?%s", this_url, httpgetfields); + + if(!urlbuffer) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + + Curl_safefree(this_url); /* free previous URL */ + this_url = urlbuffer; /* use our new URL instead! */ + } + + if(!global->errors) + global->errors = stderr; + + if((!outfile || !strcmp(outfile, "-")) && !config->use_ascii) { + /* We get the output to stdout and we have not got the ASCII/text + flag, then set stdout to be binary */ + set_binmode(stdout); + } + + if(config->tcp_nodelay) + my_setopt(curl, CURLOPT_TCP_NODELAY, 1L); + + /* where to store */ + my_setopt(curl, CURLOPT_WRITEDATA, &outs); + if(metalink || !config->use_metalink) + /* what call to write */ + my_setopt(curl, CURLOPT_WRITEFUNCTION, tool_write_cb); +#ifdef USE_METALINK + else + /* Set Metalink specific write callback function to parse + XML data progressively. */ + my_setopt(curl, CURLOPT_WRITEFUNCTION, metalink_write_cb); +#endif /* USE_METALINK */ + + /* for uploads */ + input.fd = infd; + input.config = config; + /* Note that if CURLOPT_READFUNCTION is fread (the default), then + * lib/telnet.c will Curl_poll() on the input file descriptor + * rather then calling the READFUNCTION at regular intervals. + * The circumstances in which it is preferable to enable this + * behaviour, by omitting to set the READFUNCTION & READDATA options, + * have not been determined. + */ + my_setopt(curl, CURLOPT_READDATA, &input); + /* what call to read */ + my_setopt(curl, CURLOPT_READFUNCTION, tool_read_cb); + + /* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what + CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */ + my_setopt(curl, CURLOPT_SEEKDATA, &input); + my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb); + + if(config->recvpersecond) + /* tell libcurl to use a smaller sized buffer as it allows us to + make better sleeps! 7.9.9 stuff! */ + my_setopt(curl, CURLOPT_BUFFERSIZE, (long)config->recvpersecond); + + /* size of uploaded file: */ + if(uploadfilesize != -1) + my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize); + my_setopt_str(curl, CURLOPT_URL, this_url); /* what to fetch */ + my_setopt(curl, CURLOPT_NOPROGRESS, global->noprogress?1L:0L); + if(config->no_body) { + my_setopt(curl, CURLOPT_NOBODY, 1L); + my_setopt(curl, CURLOPT_HEADER, 1L); + } + /* If --metalink is used, we ignore --include (headers in + output) option because mixing headers to the body will + confuse XML parser and/or hash check will fail. */ + else if(!config->use_metalink) + my_setopt(curl, CURLOPT_HEADER, config->include_headers?1L:0L); + + if(config->xoauth2_bearer) + my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->xoauth2_bearer); + +#if !defined(CURL_DISABLE_PROXY) + { + /* TODO: Make this a run-time check instead of compile-time one. */ + + my_setopt_str(curl, CURLOPT_PROXY, config->proxy); + my_setopt_str(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd); + + /* new in libcurl 7.3 */ + my_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel?1L:0L); + + /* new in libcurl 7.5 */ + if(config->proxy) + my_setopt_enum(curl, CURLOPT_PROXYTYPE, (long)config->proxyver); + + /* new in libcurl 7.10 */ + if(config->socksproxy) { + my_setopt_str(curl, CURLOPT_PROXY, config->socksproxy); + my_setopt_enum(curl, CURLOPT_PROXYTYPE, (long)config->socksver); + } + + /* new in libcurl 7.10.6 */ + if(config->proxyanyauth) + my_setopt_bitmask(curl, CURLOPT_PROXYAUTH, + (long)CURLAUTH_ANY); + else if(config->proxynegotiate) + my_setopt_bitmask(curl, CURLOPT_PROXYAUTH, + (long)CURLAUTH_GSSNEGOTIATE); + else if(config->proxyntlm) + my_setopt_bitmask(curl, CURLOPT_PROXYAUTH, + (long)CURLAUTH_NTLM); + else if(config->proxydigest) + my_setopt_bitmask(curl, CURLOPT_PROXYAUTH, + (long)CURLAUTH_DIGEST); + else if(config->proxybasic) + my_setopt_bitmask(curl, CURLOPT_PROXYAUTH, + (long)CURLAUTH_BASIC); + + /* new in libcurl 7.19.4 */ + my_setopt(curl, CURLOPT_NOPROXY, config->noproxy); + } +#endif + + my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L); + my_setopt(curl, CURLOPT_UPLOAD, uploadfile?1L:0L); + my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L); + my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L); + + if(config->netrc_opt) + my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_OPTIONAL); + else if(config->netrc || config->netrc_file) + my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_REQUIRED); + else + my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_IGNORED); + + if(config->netrc_file) + my_setopt(curl, CURLOPT_NETRC_FILE, config->netrc_file); + + my_setopt(curl, CURLOPT_TRANSFERTEXT, config->use_ascii?1L:0L); + if(config->login_options) + my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options); + my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd); + my_setopt_str(curl, CURLOPT_RANGE, config->range); + my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer); + my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000)); + + if(built_in_protos & CURLPROTO_HTTP) { + + long postRedir = 0; + + my_setopt(curl, CURLOPT_FOLLOWLOCATION, + config->followlocation?1L:0L); + my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, + config->unrestricted_auth?1L:0L); + + switch(config->httpreq) { + case HTTPREQ_SIMPLEPOST: + my_setopt_str(curl, CURLOPT_POSTFIELDS, + config->postfields); + my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, + config->postfieldsize); + break; + case HTTPREQ_POST: + my_setopt_httppost(curl, CURLOPT_HTTPPOST, config->httppost); + break; + default: + break; + } + + my_setopt_str(curl, CURLOPT_REFERER, config->referer); + my_setopt(curl, CURLOPT_AUTOREFERER, config->autoreferer?1L:0L); + my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent); + my_setopt_slist(curl, CURLOPT_HTTPHEADER, config->headers); + + /* new in libcurl 7.36.0 */ + if(config->proxyheaders) { + my_setopt_slist(curl, CURLOPT_PROXYHEADER, config->proxyheaders); + my_setopt(curl, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE); + } + + /* new in libcurl 7.5 */ + my_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs); + + /* new in libcurl 7.9.1 */ + if(config->httpversion) + my_setopt_enum(curl, CURLOPT_HTTP_VERSION, config->httpversion); + + /* new in libcurl 7.10.6 (default is Basic) */ + if(config->authtype) + my_setopt_bitmask(curl, CURLOPT_HTTPAUTH, (long)config->authtype); + + /* curl 7.19.1 (the 301 version existed in 7.18.2), + 303 was added in 7.26.0 */ + if(config->post301) + postRedir |= CURL_REDIR_POST_301; + if(config->post302) + postRedir |= CURL_REDIR_POST_302; + if(config->post303) + postRedir |= CURL_REDIR_POST_303; + my_setopt(curl, CURLOPT_POSTREDIR, postRedir); + + /* new in libcurl 7.21.6 */ + if(config->encoding) + my_setopt_str(curl, CURLOPT_ACCEPT_ENCODING, ""); + + /* new in libcurl 7.21.6 */ + if(config->tr_encoding) + my_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1L); + + } /* (built_in_protos & CURLPROTO_HTTP) */ + + my_setopt_str(curl, CURLOPT_FTPPORT, config->ftpport); + my_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, + config->low_speed_limit); + my_setopt(curl, CURLOPT_LOW_SPEED_TIME, config->low_speed_time); + my_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, + config->sendpersecond); + my_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, + config->recvpersecond); + + if(config->use_resume) + my_setopt(curl, CURLOPT_RESUME_FROM_LARGE, config->resume_from); + else + my_setopt(curl, CURLOPT_RESUME_FROM_LARGE, CURL_OFF_T_C(0)); + + my_setopt_str(curl, CURLOPT_KEYPASSWD, config->key_passwd); + + if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) { + + /* SSH and SSL private key uses same command-line option */ + /* new in libcurl 7.16.1 */ + my_setopt_str(curl, CURLOPT_SSH_PRIVATE_KEYFILE, config->key); + /* new in libcurl 7.16.1 */ + my_setopt_str(curl, CURLOPT_SSH_PUBLIC_KEYFILE, config->pubkey); + + /* new in libcurl 7.17.1: SSH host key md5 checking allows us + to fail if we are not talking to who we think we should */ + my_setopt_str(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5, + config->hostpubmd5); + } + + if(config->cacert) + my_setopt_str(curl, CURLOPT_CAINFO, config->cacert); + if(config->capath) + my_setopt_str(curl, CURLOPT_CAPATH, config->capath); + if(config->crlfile) + my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile); + + if(config->pinnedpubkey) + my_setopt_str(curl, CURLOPT_PINNEDPUBLICKEY, config->pinnedpubkey); + + if(curlinfo->features & CURL_VERSION_SSL) { + my_setopt_str(curl, CURLOPT_SSLCERT, config->cert); + my_setopt_str(curl, CURLOPT_SSLCERTTYPE, config->cert_type); + my_setopt_str(curl, CURLOPT_SSLKEY, config->key); + my_setopt_str(curl, CURLOPT_SSLKEYTYPE, config->key_type); + + if(config->insecure_ok) { + my_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + } + else { + my_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); + /* libcurl default is strict verifyhost -> 2L */ + /* my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); */ + } + + if(config->verifystatus) + my_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1L); + + if(config->falsestart) + my_setopt(curl, CURLOPT_SSL_FALSESTART, 1L); + + my_setopt_enum(curl, CURLOPT_SSLVERSION, config->ssl_version); + } + if(config->path_as_is) + my_setopt(curl, CURLOPT_PATH_AS_IS, 1L); + + if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) { + if(!config->insecure_ok) { + char *home; + char *file; + result = CURLE_OUT_OF_MEMORY; + home = homedir(); + if(home) { + file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR); + if(file) { + /* new in curl 7.19.6 */ + result = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file); + curl_free(file); + if(result == CURLE_UNKNOWN_OPTION) + /* libssh2 version older than 1.1.1 */ + result = CURLE_OK; + } + Curl_safefree(home); + } + if(result) + goto show_error; + } + } + + if(config->no_body || config->remote_time) { + /* no body or use remote time */ + my_setopt(curl, CURLOPT_FILETIME, 1L); + } + + my_setopt(curl, CURLOPT_CRLF, config->crlf?1L:0L); + my_setopt_slist(curl, CURLOPT_QUOTE, config->quote); + my_setopt_slist(curl, CURLOPT_POSTQUOTE, config->postquote); + my_setopt_slist(curl, CURLOPT_PREQUOTE, config->prequote); + +#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) + if(config->cookie) + my_setopt_str(curl, CURLOPT_COOKIE, config->cookie); + + if(config->cookiefile) + my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile); + + /* new in libcurl 7.9 */ + if(config->cookiejar) + my_setopt_str(curl, CURLOPT_COOKIEJAR, config->cookiejar); + + /* new in libcurl 7.9.7 */ + my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession?1L:0L); +#else + if(config->cookie || config->cookiefile || config->cookiejar) { + warnf(config->global, "cookie option(s) used even though cookie " + "support is disabled!\n"); + return CURLE_NOT_BUILT_IN; + } +#endif + + my_setopt_enum(curl, CURLOPT_TIMECONDITION, (long)config->timecond); + my_setopt(curl, CURLOPT_TIMEVALUE, (long)config->condtime); + my_setopt_str(curl, CURLOPT_CUSTOMREQUEST, config->customrequest); + my_setopt(curl, CURLOPT_STDERR, global->errors); + + /* three new ones in libcurl 7.3: */ + my_setopt_str(curl, CURLOPT_INTERFACE, config->iface); + my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel); + + progressbarinit(&progressbar, config); + if((global->progressmode == CURL_PROGRESS_BAR) && + !global->noprogress && !global->mute) { + /* we want the alternative style, then we have to implement it + ourselves! */ + my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb); + my_setopt(curl, CURLOPT_XFERINFODATA, &progressbar); + } + + /* new in libcurl 7.24.0: */ + if(config->dns_servers) + my_setopt_str(curl, CURLOPT_DNS_SERVERS, config->dns_servers); + + /* new in libcurl 7.33.0: */ + if(config->dns_interface) + my_setopt_str(curl, CURLOPT_DNS_INTERFACE, config->dns_interface); + if(config->dns_ipv4_addr) + my_setopt_str(curl, CURLOPT_DNS_LOCAL_IP4, config->dns_ipv4_addr); + if(config->dns_ipv6_addr) + my_setopt_str(curl, CURLOPT_DNS_LOCAL_IP6, config->dns_ipv6_addr); + + /* new in libcurl 7.6.2: */ + my_setopt_slist(curl, CURLOPT_TELNETOPTIONS, config->telnet_options); + + /* new in libcurl 7.7: */ + my_setopt_str(curl, CURLOPT_RANDOM_FILE, config->random_file); + my_setopt_str(curl, CURLOPT_EGDSOCKET, config->egd_file); + my_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, + (long)(config->connecttimeout * 1000)); + + if(config->cipher_list) + my_setopt_str(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list); + + /* new in libcurl 7.9.2: */ + if(config->disable_epsv) + /* disable it */ + my_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L); + + /* new in libcurl 7.10.5 */ + if(config->disable_eprt) + /* disable it */ + my_setopt(curl, CURLOPT_FTP_USE_EPRT, 0L); + + if(global->tracetype != TRACE_NONE) { + my_setopt(curl, CURLOPT_DEBUGFUNCTION, tool_debug_cb); + my_setopt(curl, CURLOPT_DEBUGDATA, config); + my_setopt(curl, CURLOPT_VERBOSE, 1L); + } + + /* new in curl 7.9.3 */ + if(config->engine) { + result = res_setopt_str(curl, CURLOPT_SSLENGINE, config->engine); + if(result) + goto show_error; + my_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L); + } + + /* new in curl 7.10.7, extended in 7.19.4 but this only sets 0 or 1 */ + my_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, + config->ftp_create_dirs?1L:0L); + + /* new in curl 7.10.8 */ + if(config->max_filesize) + my_setopt(curl, CURLOPT_MAXFILESIZE_LARGE, + config->max_filesize); + + if(4 == config->ip_version) + my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + else if(6 == config->ip_version) + my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); + else + my_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER); + + /* new in curl 7.15.5 */ + if(config->ftp_ssl_reqd) + my_setopt_enum(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); + + /* new in curl 7.11.0 */ + else if(config->ftp_ssl) + my_setopt_enum(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY); + + /* new in curl 7.16.0 */ + else if(config->ftp_ssl_control) + my_setopt_enum(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_CONTROL); + + /* new in curl 7.16.1 */ + if(config->ftp_ssl_ccc) + my_setopt_enum(curl, CURLOPT_FTP_SSL_CCC, + (long)config->ftp_ssl_ccc_mode); + +#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) + { + /* TODO: Make this a run-time check instead of compile-time one. */ + + /* new in curl 7.19.4 */ + if(config->socks5_gssapi_service) + my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE, + config->socks5_gssapi_service); + + /* new in curl 7.19.4 */ + if(config->socks5_gssapi_nec) + my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_NEC, + config->socks5_gssapi_nec); + + /* new in curl 7.43.0 */ + if(config->proxy_service_name) + my_setopt_str(curl, CURLOPT_PROXY_SERVICE_NAME, + config->proxy_service_name); + + /* new in curl 7.43.0 */ + if(config->service_name) + my_setopt_str(curl, CURLOPT_SERVICE_NAME, + config->service_name); + + } +#endif + /* curl 7.13.0 */ + my_setopt_str(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account); + + my_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl?1L:0L); + + /* curl 7.14.2 */ + my_setopt(curl, CURLOPT_FTP_SKIP_PASV_IP, config->ftp_skip_ip?1L:0L); + + /* curl 7.15.1 */ + my_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long)config->ftp_filemethod); + + /* curl 7.15.2 */ + if(config->localport) { + my_setopt(curl, CURLOPT_LOCALPORT, (long)config->localport); + my_setopt_str(curl, CURLOPT_LOCALPORTRANGE, + (long)config->localportrange); + } + + /* curl 7.15.5 */ + my_setopt_str(curl, CURLOPT_FTP_ALTERNATIVE_TO_USER, + config->ftp_alternative_to_user); + + /* curl 7.16.0 */ + if(config->disable_sessionid) + /* disable it */ + my_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L); + + /* curl 7.16.2 */ + if(config->raw) { + my_setopt(curl, CURLOPT_HTTP_CONTENT_DECODING, 0L); + my_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0L); + } + + /* curl 7.17.1 */ + if(!config->nokeepalive) { + my_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L); + if(config->alivetime != 0) { +#if !defined(TCP_KEEPIDLE) || !defined(TCP_KEEPINTVL) + warnf(config->global, "Keep-alive functionality somewhat crippled " + "due to missing support in your operating system!\n"); +#endif + my_setopt(curl, CURLOPT_TCP_KEEPIDLE, config->alivetime); + my_setopt(curl, CURLOPT_TCP_KEEPINTVL, config->alivetime); + } + } + else + my_setopt(curl, CURLOPT_TCP_KEEPALIVE, 0L); + + /* curl 7.20.0 */ + if(config->tftp_blksize) + my_setopt(curl, CURLOPT_TFTP_BLKSIZE, config->tftp_blksize); + + if(config->mail_from) + my_setopt_str(curl, CURLOPT_MAIL_FROM, config->mail_from); + + if(config->mail_rcpt) + my_setopt_slist(curl, CURLOPT_MAIL_RCPT, config->mail_rcpt); + + /* curl 7.20.x */ + if(config->ftp_pret) + my_setopt(curl, CURLOPT_FTP_USE_PRET, 1L); + + if(config->proto_present) + my_setopt_flags(curl, CURLOPT_PROTOCOLS, config->proto); + if(config->proto_redir_present) + my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir); + + if(config->content_disposition + && (urlnode->flags & GETOUT_USEREMOTE) + && (checkprefix("http://", this_url) || + checkprefix("https://", this_url))) + hdrcbdata.honor_cd_filename = TRUE; + else + hdrcbdata.honor_cd_filename = FALSE; + + hdrcbdata.outs = &outs; + hdrcbdata.heads = &heads; + + my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb); + my_setopt(curl, CURLOPT_HEADERDATA, &hdrcbdata); + + if(config->resolve) + /* new in 7.21.3 */ + my_setopt_slist(curl, CURLOPT_RESOLVE, config->resolve); + + /* new in 7.21.4 */ + if(curlinfo->features & CURL_VERSION_TLSAUTH_SRP) { + if(config->tls_username) + my_setopt_str(curl, CURLOPT_TLSAUTH_USERNAME, + config->tls_username); + if(config->tls_password) + my_setopt_str(curl, CURLOPT_TLSAUTH_PASSWORD, + config->tls_password); + if(config->tls_authtype) + my_setopt_str(curl, CURLOPT_TLSAUTH_TYPE, + config->tls_authtype); + } + + /* new in 7.22.0 */ + if(config->gssapi_delegation) + my_setopt_str(curl, CURLOPT_GSSAPI_DELEGATION, + config->gssapi_delegation); + + /* new in 7.25.0 */ + if(config->ssl_allow_beast) + my_setopt(curl, CURLOPT_SSL_OPTIONS, (long)CURLSSLOPT_ALLOW_BEAST); + + if(config->mail_auth) + my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth); + + /* new in 7.31.0 */ + if(config->sasl_ir) + my_setopt(curl, CURLOPT_SASL_IR, 1L); + + if(config->nonpn) { + my_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 0L); + } + + if(config->noalpn) { + my_setopt(curl, CURLOPT_SSL_ENABLE_ALPN, 0L); + } + + /* new in 7.40.0 */ + if(config->unix_socket_path) + my_setopt_str(curl, CURLOPT_UNIX_SOCKET_PATH, + config->unix_socket_path); + + /* initialize retry vars for loop below */ + retry_sleep_default = (config->retry_delay) ? + config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */ + + retry_numretries = config->req_retry; + retry_sleep = retry_sleep_default; /* ms */ + retrystart = tvnow(); + +#ifndef CURL_DISABLE_LIBCURL_OPTION + result = easysrc_perform(); + if(result) { + goto show_error; + } +#endif + + for(;;) { +#ifdef USE_METALINK + if(!metalink && config->use_metalink) { + /* If outs.metalink_parser is non-NULL, delete it first. */ + if(outs.metalink_parser) + metalink_parser_context_delete(outs.metalink_parser); + outs.metalink_parser = metalink_parser_context_new(); + if(outs.metalink_parser == NULL) { + result = CURLE_OUT_OF_MEMORY; + goto show_error; + } + fprintf(config->global->errors, + "Metalink: parsing (%s) metalink/XML...\n", this_url); + } + else if(metalink) + fprintf(config->global->errors, + "Metalink: fetching (%s) from (%s)...\n", + mlfile->filename, this_url); +#endif /* USE_METALINK */ + +#ifdef CURLDEBUG + if(config->test_event_based) + result = curl_easy_perform_ev(curl); + else +#endif + result = curl_easy_perform(curl); + + if(!result && !outs.stream && !outs.bytes) { + /* we have received no data despite the transfer was successful + ==> force cration of an empty output file (if an output file + was specified) */ + long cond_unmet = 0L; + /* do not create (or even overwrite) the file in case we get no + data because of unmet condition */ + curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet); + if(!cond_unmet && !tool_create_output_file(&outs)) + result = CURLE_WRITE_ERROR; + } + + if(outs.is_cd_filename && outs.stream && !global->mute && + outs.filename) + printf("curl: Saved to filename '%s'\n", outs.filename); + + /* if retry-max-time is non-zero, make sure we haven't exceeded the + time */ + if(retry_numretries && + (!config->retry_maxtime || + (tvdiff(tvnow(), retrystart) < + config->retry_maxtime*1000L)) ) { + enum { + RETRY_NO, + RETRY_TIMEOUT, + RETRY_HTTP, + RETRY_FTP, + RETRY_LAST /* not used */ + } retry = RETRY_NO; + long response; + if((CURLE_OPERATION_TIMEDOUT == result) || + (CURLE_COULDNT_RESOLVE_HOST == result) || + (CURLE_COULDNT_RESOLVE_PROXY == result) || + (CURLE_FTP_ACCEPT_TIMEOUT == result)) + /* retry timeout always */ + retry = RETRY_TIMEOUT; + else if((CURLE_OK == result) || + (config->failonerror && + (CURLE_HTTP_RETURNED_ERROR == result))) { + /* If it returned OK. _or_ failonerror was enabled and it + returned due to such an error, check for HTTP transient + errors to retry on. */ + char *effective_url = NULL; + curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url); + if(effective_url && + checkprefix("http", effective_url)) { + /* This was HTTP(S) */ + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); + + switch(response) { + case 500: /* Internal Server Error */ + case 502: /* Bad Gateway */ + case 503: /* Service Unavailable */ + case 504: /* Gateway Timeout */ + retry = RETRY_HTTP; + /* + * At this point, we have already written data to the output + * file (or terminal). If we write to a file, we must rewind + * or close/re-open the file so that the next attempt starts + * over from the beginning. + * + * TODO: similar action for the upload case. We might need + * to start over reading from a previous point if we have + * uploaded something when this was returned. + */ + break; + } + } + } /* if CURLE_OK */ + else if(result) { + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); + + if(response/100 == 4) + /* + * This is typically when the FTP server only allows a certain + * amount of users and we are not one of them. All 4xx codes + * are transient. + */ + retry = RETRY_FTP; + } + + if(retry) { + static const char * const m[]={ + NULL, "timeout", "HTTP error", "FTP error" + }; + + warnf(config->global, "Transient problem: %s " + "Will retry in %ld seconds. " + "%ld retries left.\n", + m[retry], retry_sleep/1000L, retry_numretries); + + tool_go_sleep(retry_sleep); + retry_numretries--; + if(!config->retry_delay) { + retry_sleep *= 2; + if(retry_sleep > RETRY_SLEEP_MAX) + retry_sleep = RETRY_SLEEP_MAX; + } + if(outs.bytes && outs.filename && outs.stream) { + /* We have written data to a output file, we truncate file + */ + if(!global->mute) + fprintf(global->errors, "Throwing away %" + CURL_FORMAT_CURL_OFF_T " bytes\n", + outs.bytes); + fflush(outs.stream); + /* truncate file at the position where we started appending */ +#ifdef HAVE_FTRUNCATE + if(ftruncate( fileno(outs.stream), outs.init)) { + /* when truncate fails, we can't just append as then we'll + create something strange, bail out */ + if(!global->mute) + fprintf(global->errors, + "failed to truncate, exiting\n"); + result = CURLE_WRITE_ERROR; + goto quit_urls; + } + /* now seek to the end of the file, the position where we + just truncated the file in a large file-safe way */ + fseek(outs.stream, 0, SEEK_END); +#else + /* ftruncate is not available, so just reposition the file + to the location we would have truncated it. This won't + work properly with large files on 32-bit systems, but + most of those will have ftruncate. */ + fseek(outs.stream, (long)outs.init, SEEK_SET); +#endif + outs.bytes = 0; /* clear for next round */ + } + continue; /* curl_easy_perform loop */ + } + } /* if retry_numretries */ + else if(metalink) { + /* Metalink: Decide to try the next resource or + not. Basically, we want to try the next resource if + download was not successful. */ + long response; + if(CURLE_OK == result) { + /* TODO We want to try next resource when download was + not successful. How to know that? */ + char *effective_url = NULL; + curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url); + if(effective_url && + curlx_strnequal(effective_url, "http", 4)) { + /* This was HTTP(S) */ + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response); + if(response != 200 && response != 206) { + metalink_next_res = 1; + fprintf(global->errors, + "Metalink: fetching (%s) from (%s) FAILED " + "(HTTP status code %d)\n", + mlfile->filename, this_url, response); + } + } + } + else { + metalink_next_res = 1; + fprintf(global->errors, + "Metalink: fetching (%s) from (%s) FAILED (%s)\n", + mlfile->filename, this_url, + (errorbuffer[0]) ? + errorbuffer : curl_easy_strerror(result)); + } + } + if(metalink && !metalink_next_res) + fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n", + mlfile->filename, this_url); + + /* In all ordinary cases, just break out of loop here */ + break; /* curl_easy_perform loop */ + + } + + if((global->progressmode == CURL_PROGRESS_BAR) && + progressbar.calls) + /* if the custom progress bar has been displayed, we output a + newline here */ + fputs("\n", progressbar.out); + + if(config->writeout) + ourWriteOut(curl, &outs, config->writeout); + + if(config->writeenv) + ourWriteEnv(curl); + + /* + ** Code within this loop may jump directly here to label 'show_error' + ** in order to display an error message for CURLcode stored in 'res' + ** variable and exit loop once that necessary writing and cleanup + ** in label 'quit_urls' has been done. + */ + + show_error: + +#ifdef __VMS + if(is_vms_shell()) { + /* VMS DCL shell behavior */ + if(!global->showerror) + vms_show = VMSSTS_HIDE; + } + else +#endif + if(result && global->showerror) { + fprintf(global->errors, "curl: (%d) %s\n", result, (errorbuffer[0]) ? + errorbuffer : curl_easy_strerror(result)); + if(result == CURLE_SSL_CACERT) + fprintf(global->errors, "%s%s", + CURL_CA_CERT_ERRORMSG1, CURL_CA_CERT_ERRORMSG2); + } + + /* Fall through comment to 'quit_urls' label */ + + /* + ** Upon error condition and always that a message has already been + ** displayed, code within this loop may jump directly here to label + ** 'quit_urls' otherwise it should jump to 'show_error' label above. + ** + ** When 'res' variable is _not_ CURLE_OK loop will exit once that + ** all code following 'quit_urls' has been executed. Otherwise it + ** will loop to the beginning from where it may exit if there are + ** no more urls left. + */ + + quit_urls: + + /* Set file extended attributes */ + if(!result && config->xattr && outs.fopened && outs.stream) { + int rc = fwrite_xattr(curl, fileno(outs.stream)); + if(rc) + warnf(config->global, "Error setting extended attributes: %s\n", + strerror(errno)); + } + + /* Close the file */ + if(outs.fopened && outs.stream) { + int rc = fclose(outs.stream); + if(!result && rc) { + /* something went wrong in the writing process */ + result = CURLE_WRITE_ERROR; + fprintf(global->errors, "(%d) Failed writing body\n", result); + } + } + else if(!outs.s_isreg && outs.stream) { + /* Dump standard stream buffered data */ + int rc = fflush(outs.stream); + if(!result && rc) { + /* something went wrong in the writing process */ + result = CURLE_WRITE_ERROR; + fprintf(global->errors, "(%d) Failed writing body\n", result); + } + } + +#ifdef __AMIGA__ + if(!result && outs.s_isreg && outs.filename) { + /* Set the url (up to 80 chars) as comment for the file */ + if(strlen(url) > 78) + url[79] = '\0'; + SetComment(outs.filename, url); + } +#endif + +#ifdef HAVE_UTIME + /* File time can only be set _after_ the file has been closed */ + if(!result && config->remote_time && outs.s_isreg && outs.filename) { + /* Ask libcurl if we got a remote file time */ + long filetime = -1; + curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime); + if(filetime >= 0) { + struct utimbuf times; + times.actime = (time_t)filetime; + times.modtime = (time_t)filetime; + utime(outs.filename, ×); /* set the time we got */ + } + } +#endif + +#ifdef USE_METALINK + if(!metalink && config->use_metalink && result == CURLE_OK) { + int rv = parse_metalink(config, &outs, this_url); + if(rv == 0) + fprintf(config->global->errors, "Metalink: parsing (%s) OK\n", + this_url); + else if(rv == -1) + fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n", + this_url); + } + else if(metalink && result == CURLE_OK && !metalink_next_res) { + int rv = metalink_check_hash(global, mlfile, outs.filename); + if(rv == 0) { + metalink_next_res = 1; + } + } +#endif /* USE_METALINK */ + + /* No more business with this output struct */ + if(outs.alloc_filename) + Curl_safefree(outs.filename); +#ifdef USE_METALINK + if(outs.metalink_parser) + metalink_parser_context_delete(outs.metalink_parser); +#endif /* USE_METALINK */ + memset(&outs, 0, sizeof(struct OutStruct)); + hdrcbdata.outs = NULL; + + /* Free loop-local allocated memory and close loop-local opened fd */ + + Curl_safefree(outfile); + Curl_safefree(this_url); + + if(infdopen) + close(infd); + + if(metalink) { + /* Should exit if error is fatal. */ + if(is_fatal_error(result)) { + break; + } + if(!metalink_next_res) + break; + mlres = mlres->next; + if(mlres == NULL) + /* TODO If metalink_next_res is 1 and mlres is NULL, + * set res to error code + */ + break; + } + else + if(urlnum > 1) { + /* when url globbing, exit loop upon critical error */ + if(is_fatal_error(result)) + break; + } + else if(result) + /* when not url globbing, exit loop upon any error */ + break; + + } /* loop to the next URL */ + + /* Free loop-local allocated memory */ + + Curl_safefree(uploadfile); + + if(urls) { + /* Free list of remaining URLs */ + glob_cleanup(urls); + urls = NULL; + } + + if(infilenum > 1) { + /* when file globbing, exit loop upon critical error */ + if(is_fatal_error(result)) + break; + } + else if(result) + /* when not file globbing, exit loop upon any error */ + break; + + } /* loop to the next globbed upload file */ + + /* Free loop-local allocated memory */ + + Curl_safefree(outfiles); + + if(inglob) { + /* Free list of globbed upload files */ + glob_cleanup(inglob); + inglob = NULL; + } + + /* Free this URL node data without destroying the + the node itself nor modifying next pointer. */ + Curl_safefree(urlnode->url); + Curl_safefree(urlnode->outfile); + Curl_safefree(urlnode->infile); + urlnode->flags = 0; + + /* + ** Bail out upon critical errors + */ + if(is_fatal_error(result)) + goto quit_curl; + + } /* for-loop through all URLs */ + + /* + ** Nested loops end here. + */ + + quit_curl: + + /* Reset the global config variables */ + global->noprogress = orig_noprogress; + global->isatty = orig_isatty; + + /* Free function-local referenced allocated memory */ + Curl_safefree(httpgetfields); + + /* Free list of given URLs */ + clean_getout(config); + + hdrcbdata.heads = NULL; + + /* Close function-local opened file descriptors */ + if(heads.fopened && heads.stream) + fclose(heads.stream); + + if(heads.alloc_filename) + Curl_safefree(heads.filename); + + /* Release metalink related resources here */ + clean_metalink(config); + + return result; +} + +CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]) +{ + CURLcode result = CURLE_OK; + + /* Setup proper locale from environment */ +#ifdef HAVE_SETLOCALE + setlocale(LC_ALL, ""); +#endif + + /* Parse .curlrc if necessary */ + if((argc == 1) || (!curlx_strequal(argv[1], "-q"))) { + parseconfig(NULL, config); /* ignore possible failure */ + + /* If we had no arguments then make sure a url was specified in .curlrc */ + if((argc < 2) && (!config->first->url_list)) { + helpf(config->errors, NULL); + result = CURLE_FAILED_INIT; + } + } + + if(!result) { + /* Parse the command line arguments */ + ParameterError res = parse_args(config, argc, argv); + if(res) { + result = CURLE_OK; + + /* Check if we were asked for the help */ + if(res == PARAM_HELP_REQUESTED) + tool_help(); + /* Check if we were asked for the manual */ + else if(res == PARAM_MANUAL_REQUESTED) + hugehelp(); + /* Check if we were asked for the version information */ + else if(res == PARAM_VERSION_INFO_REQUESTED) + tool_version_info(); + /* Check if we were asked to list the SSL engines */ + else if(res == PARAM_ENGINES_REQUESTED) + tool_list_engines(config->easy); + else + result = CURLE_FAILED_INIT; + } + else { +#ifndef CURL_DISABLE_LIBCURL_OPTION + /* Initialise the libcurl source output */ + result = easysrc_init(); +#endif + + /* Perform the main operations */ + if(!result) { + size_t count = 0; + struct OperationConfig *operation = config->first; + + /* Get the required aguments for each operation */ + while(!result && operation) { + result = get_args(operation, count++); + + operation = operation->next; + } + + /* Set the current operation pointer */ + config->current = config->first; + + /* Perform each operation */ + while(!result && config->current) { + result = operate_do(config, config->current); + + config->current = config->current->next; + } + +#ifndef CURL_DISABLE_LIBCURL_OPTION + /* Cleanup the libcurl source output */ + easysrc_cleanup(); + + /* Dump the libcurl code if previously enabled */ + dumpeasysrc(config); +#endif + } + else + helpf(config->errors, "out of memory\n"); + } + } + + return result; +} diff --git a/src/tool_operate.h b/src/tool_operate.h new file mode 100644 index 0000000..1d5c1a9 --- /dev/null +++ b/src/tool_operate.h @@ -0,0 +1,29 @@ +#ifndef HEADER_CURL_TOOL_OPERATE_H +#define HEADER_CURL_TOOL_OPERATE_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]); + +#endif /* HEADER_CURL_TOOL_OPERATE_H */ + diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c new file mode 100644 index 0000000..abf9496 --- /dev/null +++ b/src/tool_operhlp.c @@ -0,0 +1,174 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_convert.h" +#include "tool_operhlp.h" +#include "tool_metalink.h" + +#include "memdebug.h" /* keep this as LAST include */ + +void clean_getout(struct OperationConfig *config) +{ + struct getout *next; + struct getout *node = config->url_list; + + while(node) { + next = node->next; + Curl_safefree(node->url); + Curl_safefree(node->outfile); + Curl_safefree(node->infile); + Curl_safefree(node); + node = next; + } + config->url_list = NULL; +} + +bool output_expected(const char *url, const char *uploadfile) +{ + if(!uploadfile) + return TRUE; /* download */ + if(checkprefix("http://", url) || checkprefix("https://", url)) + return TRUE; /* HTTP(S) upload */ + + return FALSE; /* non-HTTP upload, probably no output should be expected */ +} + +bool stdin_upload(const char *uploadfile) +{ + return (curlx_strequal(uploadfile, "-") || + curlx_strequal(uploadfile, ".")) ? TRUE : FALSE; +} + +/* + * Adds the file name to the URL if it doesn't already have one. + * url will be freed before return if the returned pointer is different + */ +char *add_file_name_to_url(CURL *curl, char *url, const char *filename) +{ + /* If no file name part is given in the URL, we add this file name */ + char *ptr = strstr(url, "://"); + if(ptr) + ptr += 3; + else + ptr = url; + ptr = strrchr(ptr, '/'); + if(!ptr || !strlen(++ptr)) { + /* The URL has no file name part, add the local file name. In order + to be able to do so, we have to create a new URL in another + buffer.*/ + + /* We only want the part of the local path that is on the right + side of the rightmost slash and backslash. */ + const char *filep = strrchr(filename, '/'); + char *file2 = strrchr(filep?filep:filename, '\\'); + char *encfile; + + if(file2) + filep = file2 + 1; + else if(filep) + filep++; + else + filep = filename; + + /* URL encode the file name */ + encfile = curl_easy_escape(curl, filep, 0 /* use strlen */); + if(encfile) { + char *urlbuffer; + if(ptr) + /* there is a trailing slash on the URL */ + urlbuffer = aprintf("%s%s", url, encfile); + else + /* there is no trailing slash on the URL */ + urlbuffer = aprintf("%s/%s", url, encfile); + + curl_free(encfile); + Curl_safefree(url); + + if(!urlbuffer) + return NULL; + + url = urlbuffer; /* use our new URL instead! */ + } + else + Curl_safefree(url); + } + return url; +} + +/* Extracts the name portion of the URL. + * Returns a pointer to a heap-allocated string or NULL if + * no name part, at location indicated by first argument. + */ +CURLcode get_url_file_name(char **filename, const char *url) +{ + const char *pc; + + *filename = NULL; + + /* Find and get the remote file name */ + pc = strstr(url, "://"); + if(pc) + pc += 3; + else + pc = url; + pc = strrchr(pc, '/'); + + if(pc) + /* duplicate the string beyond the slash */ + pc++; + else + /* no slash => empty string */ + pc = ""; + + *filename = strdup(pc); + if(!*filename) + return CURLE_OUT_OF_MEMORY; + + /* in case we built debug enabled, we allow an environment variable + * named CURL_TESTDIR to prefix the given file name to put it into a + * specific directory + */ +#ifdef DEBUGBUILD + { + char *tdir = curlx_getenv("CURL_TESTDIR"); + if(tdir) { + char buffer[512]; /* suitably large */ + snprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename); + Curl_safefree(*filename); + *filename = strdup(buffer); /* clone the buffer */ + curl_free(tdir); + if(!*filename) + return CURLE_OUT_OF_MEMORY; + } + } +#endif + + return CURLE_OK; +} diff --git a/src/tool_operhlp.h b/src/tool_operhlp.h new file mode 100644 index 0000000..8fcaad6 --- /dev/null +++ b/src/tool_operhlp.h @@ -0,0 +1,39 @@ +#ifndef HEADER_CURL_TOOL_OPERHLP_H +#define HEADER_CURL_TOOL_OPERHLP_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +struct OperationConfig; + +void clean_getout(struct OperationConfig *config); + +bool output_expected(const char *url, const char *uploadfile); + +bool stdin_upload(const char *uploadfile); + +char *add_file_name_to_url(CURL *curl, char *url, const char *filename); + +CURLcode get_url_file_name(char **filename, const char *url); + +#endif /* HEADER_CURL_TOOL_OPERHLP_H */ + diff --git a/src/tool_panykey.c b/src/tool_panykey.c new file mode 100644 index 0000000..d8718e3 --- /dev/null +++ b/src/tool_panykey.c @@ -0,0 +1,48 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#if defined(__SYMBIAN32__) || defined(NETWARE) + +#ifdef NETWARE +# ifdef __NOVELL_LIBC__ +# include <screen.h> +# else +# include <nwconio.h> +# endif +#endif + +#include "tool_panykey.h" + +#include "memdebug.h" /* keep this as LAST include */ + +void tool_pressanykey(void) +{ +#if defined(__SYMBIAN32__) + getchar(); +#elif defined(NETWARE) + pressanykey(); +#endif +} + +#endif /* __SYMBIAN32__ || NETWARE */ + diff --git a/src/tool_panykey.h b/src/tool_panykey.h new file mode 100644 index 0000000..50b15d2 --- /dev/null +++ b/src/tool_panykey.h @@ -0,0 +1,37 @@ +#ifndef HEADER_CURL_TOOL_PANYKEY_H +#define HEADER_CURL_TOOL_PANYKEY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#if defined(__SYMBIAN32__) || defined(NETWARE) + +void tool_pressanykey(void); + +#else + +#define tool_pressanykey() Curl_nop_stmt + +#endif + +#endif /* HEADER_CURL_TOOL_PANYKEY_H */ + diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c new file mode 100644 index 0000000..d4b96e7 --- /dev/null +++ b/src/tool_paramhlp.c @@ -0,0 +1,524 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#include "rawstr.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_getparam.h" +#include "tool_getpass.h" +#include "tool_homedir.h" +#include "tool_msgs.h" +#include "tool_paramhlp.h" +#include "tool_version.h" + +#include "memdebug.h" /* keep this as LAST include */ + +struct getout *new_getout(struct OperationConfig *config) +{ + struct getout *node = calloc(1, sizeof(struct getout)); + struct getout *last = config->url_last; + if(node) { + /* append this new node last in the list */ + if(last) + last->next = node; + else + config->url_list = node; /* first node */ + + /* move the last pointer */ + config->url_last = node; + + node->flags = config->default_node_flags; + } + return node; +} + +ParameterError file2string(char **bufp, FILE *file) +{ + char buffer[256]; + char *ptr; + char *string = NULL; + size_t stringlen = 0; + size_t buflen; + + if(file) { + while(fgets(buffer, sizeof(buffer), file)) { + if((ptr = strchr(buffer, '\r')) != NULL) + *ptr = '\0'; + if((ptr = strchr(buffer, '\n')) != NULL) + *ptr = '\0'; + buflen = strlen(buffer); + if((ptr = realloc(string, stringlen+buflen+1)) == NULL) { + Curl_safefree(string); + return PARAM_NO_MEM; + } + string = ptr; + strcpy(string+stringlen, buffer); + stringlen += buflen; + } + } + *bufp = string; + return PARAM_OK; +} + +ParameterError file2memory(char **bufp, size_t *size, FILE *file) +{ + char *newbuf; + char *buffer = NULL; + size_t alloc = 512; + size_t nused = 0; + size_t nread; + + if(file) { + do { + if(!buffer || (alloc == nused)) { + /* size_t overflow detection for huge files */ + if(alloc+1 > ((size_t)-1)/2) { + Curl_safefree(buffer); + return PARAM_NO_MEM; + } + alloc *= 2; + /* allocate an extra char, reserved space, for null termination */ + if((newbuf = realloc(buffer, alloc+1)) == NULL) { + Curl_safefree(buffer); + return PARAM_NO_MEM; + } + buffer = newbuf; + } + nread = fread(buffer+nused, 1, alloc-nused, file); + nused += nread; + } while(nread); + /* null terminate the buffer in case it's used as a string later */ + buffer[nused] = '\0'; + /* free trailing slack space, if possible */ + if(alloc != nused) { + if((newbuf = realloc(buffer, nused+1)) == NULL) { + Curl_safefree(buffer); + return PARAM_NO_MEM; + } + buffer = newbuf; + } + /* discard buffer if nothing was read */ + if(!nused) { + Curl_safefree(buffer); /* no string */ + } + } + *size = nused; + *bufp = buffer; + return PARAM_OK; +} + +void cleanarg(char *str) +{ +#ifdef HAVE_WRITABLE_ARGV + /* now that GetStr has copied the contents of nextarg, wipe the next + * argument out so that the username:password isn't displayed in the + * system process list */ + if(str) { + size_t len = strlen(str); + memset(str, ' ', len); + } +#else + (void)str; +#endif +} + +/* + * Parse the string and write the long in the given address. Return PARAM_OK + * on success, otherwise a parameter specific error enum. + * + * Since this function gets called with the 'nextarg' pointer from within the + * getparameter a lot, we must check it for NULL before accessing the str + * data. + */ + +ParameterError str2num(long *val, const char *str) +{ + if(str) { + char *endptr; + long num = strtol(str, &endptr, 10); + if((endptr != str) && (endptr == str + strlen(str))) { + *val = num; + return PARAM_OK; /* Ok */ + } + } + return PARAM_BAD_NUMERIC; /* badness */ +} + +/* + * Parse the string and write the long in the given address. Return PARAM_OK + * on success, otherwise a parameter error enum. ONLY ACCEPTS POSITIVE NUMBERS! + * + * Since this function gets called with the 'nextarg' pointer from within the + * getparameter a lot, we must check it for NULL before accessing the str + * data. + */ + +ParameterError str2unum(long *val, const char *str) +{ + ParameterError result = str2num(val, str); + if(result != PARAM_OK) + return result; + if(*val < 0) + return PARAM_NEGATIVE_NUMERIC; + + return PARAM_OK; +} + +/* + * Parse the string and write the double in the given address. Return PARAM_OK + * on success, otherwise a parameter specific error enum. + * + * Since this function gets called with the 'nextarg' pointer from within the + * getparameter a lot, we must check it for NULL before accessing the str + * data. + */ + +ParameterError str2double(double *val, const char *str) +{ + if(str) { + char *endptr; + double num = strtod(str, &endptr); + if((endptr != str) && (endptr == str + strlen(str))) { + *val = num; + return PARAM_OK; /* Ok */ + } + } + return PARAM_BAD_NUMERIC; /* badness */ +} + +/* + * Parse the string and write the double in the given address. Return PARAM_OK + * on success, otherwise a parameter error enum. ONLY ACCEPTS POSITIVE NUMBERS! + * + * Since this function gets called with the 'nextarg' pointer from within the + * getparameter a lot, we must check it for NULL before accessing the str + * data. + */ + +ParameterError str2udouble(double *val, const char *str) +{ + ParameterError result = str2double(val, str); + if(result != PARAM_OK) + return result; + if(*val < 0) + return PARAM_NEGATIVE_NUMERIC; + + return PARAM_OK; +} + +/* + * Parse the string and modify the long in the given address. Return + * non-zero on failure, zero on success. + * + * The string is a list of protocols + * + * Since this function gets called with the 'nextarg' pointer from within the + * getparameter a lot, we must check it for NULL before accessing the str + * data. + */ + +long proto2num(struct OperationConfig *config, long *val, const char *str) +{ + char *buffer; + const char *sep = ","; + char *token; + + static struct sprotos { + const char *name; + long bit; + } const protos[] = { + { "all", CURLPROTO_ALL }, + { "http", CURLPROTO_HTTP }, + { "https", CURLPROTO_HTTPS }, + { "ftp", CURLPROTO_FTP }, + { "ftps", CURLPROTO_FTPS }, + { "scp", CURLPROTO_SCP }, + { "sftp", CURLPROTO_SFTP }, + { "telnet", CURLPROTO_TELNET }, + { "ldap", CURLPROTO_LDAP }, + { "ldaps", CURLPROTO_LDAPS }, + { "dict", CURLPROTO_DICT }, + { "file", CURLPROTO_FILE }, + { "tftp", CURLPROTO_TFTP }, + { "imap", CURLPROTO_IMAP }, + { "imaps", CURLPROTO_IMAPS }, + { "pop3", CURLPROTO_POP3 }, + { "pop3s", CURLPROTO_POP3S }, + { "smtp", CURLPROTO_SMTP }, + { "smtps", CURLPROTO_SMTPS }, + { "rtsp", CURLPROTO_RTSP }, + { "gopher", CURLPROTO_GOPHER }, + { "smb", CURLPROTO_SMB }, + { "smbs", CURLPROTO_SMBS }, + { NULL, 0 } + }; + + if(!str) + return 1; + + buffer = strdup(str); /* because strtok corrupts it */ + if(!buffer) + return 1; + + for(token = strtok(buffer, sep); + token; + token = strtok(NULL, sep)) { + enum e_action { allow, deny, set } action = allow; + + struct sprotos const *pp; + + /* Process token modifiers */ + while(!ISALNUM(*token)) { /* may be NULL if token is all modifiers */ + switch (*token++) { + case '=': + action = set; + break; + case '-': + action = deny; + break; + case '+': + action = allow; + break; + default: /* Includes case of terminating NULL */ + Curl_safefree(buffer); + return 1; + } + } + + for(pp=protos; pp->name; pp++) { + if(curlx_raw_equal(token, pp->name)) { + switch (action) { + case deny: + *val &= ~(pp->bit); + break; + case allow: + *val |= pp->bit; + break; + case set: + *val = pp->bit; + break; + } + break; + } + } + + if(!(pp->name)) { /* unknown protocol */ + /* If they have specified only this protocol, we say treat it as + if no protocols are allowed */ + if(action == set) + *val = 0; + warnf(config->global, "unrecognized protocol '%s'\n", token); + } + } + Curl_safefree(buffer); + return 0; +} + +/** + * Parses the given string looking for an offset (which may be a + * larger-than-integer value). The offset CANNOT be negative! + * + * @param val the offset to populate + * @param str the buffer containing the offset + * @return PARAM_OK if successful, a parameter specific error enum if failure. + */ +ParameterError str2offset(curl_off_t *val, const char *str) +{ + char *endptr; + if(str[0] == '-') + /* offsets aren't negative, this indicates weird input */ + return PARAM_NEGATIVE_NUMERIC; + +#if(CURL_SIZEOF_CURL_OFF_T > CURL_SIZEOF_LONG) + *val = curlx_strtoofft(str, &endptr, 0); + if((*val == CURL_OFF_T_MAX || *val == CURL_OFF_T_MIN) && (ERRNO == ERANGE)) + return PARAM_BAD_NUMERIC; +#else + *val = strtol(str, &endptr, 0); + if((*val == LONG_MIN || *val == LONG_MAX) && ERRNO == ERANGE) + return PARAM_BAD_NUMERIC; +#endif + if((endptr != str) && (endptr == str + strlen(str))) + return PARAM_OK; + + return PARAM_BAD_NUMERIC; +} + +static CURLcode checkpasswd(const char *kind, /* for what purpose */ + const size_t i, /* operation index */ + const bool last, /* TRUE if last operation */ + char **userpwd) /* pointer to allocated string */ +{ + char *psep; + char *osep; + + if(!*userpwd) + return CURLE_OK; + + /* Attempt to find the password separator */ + psep = strchr(*userpwd, ':'); + + /* Attempt to find the options separator */ + osep = strchr(*userpwd, ';'); + + if(!psep && **userpwd != ';') { + /* no password present, prompt for one */ + char passwd[256] = ""; + char prompt[256]; + size_t passwdlen; + size_t userlen = strlen(*userpwd); + char *passptr; + + if(osep) + *osep = '\0'; + + /* build a nice-looking prompt */ + if(!i && last) + curlx_msnprintf(prompt, sizeof(prompt), + "Enter %s password for user '%s':", + kind, *userpwd); + else + curlx_msnprintf(prompt, sizeof(prompt), + "Enter %s password for user '%s' on URL #%" + CURL_FORMAT_CURL_OFF_TU ":", + kind, *userpwd, i + 1); + + /* get password */ + getpass_r(prompt, passwd, sizeof(passwd)); + passwdlen = strlen(passwd); + + if(osep) + *osep = ';'; + + /* extend the allocated memory area to fit the password too */ + passptr = realloc(*userpwd, + passwdlen + 1 + /* an extra for the colon */ + userlen + 1); /* an extra for the zero */ + if(!passptr) + return CURLE_OUT_OF_MEMORY; + + /* append the password separated with a colon */ + passptr[userlen] = ':'; + memcpy(&passptr[userlen+1], passwd, passwdlen+1); + *userpwd = passptr; + } + + return CURLE_OK; +} + +ParameterError add2list(struct curl_slist **list, const char *ptr) +{ + struct curl_slist *newlist = curl_slist_append(*list, ptr); + if(newlist) + *list = newlist; + else + return PARAM_NO_MEM; + + return PARAM_OK; +} + +int ftpfilemethod(struct OperationConfig *config, const char *str) +{ + if(curlx_raw_equal("singlecwd", str)) + return CURLFTPMETHOD_SINGLECWD; + if(curlx_raw_equal("nocwd", str)) + return CURLFTPMETHOD_NOCWD; + if(curlx_raw_equal("multicwd", str)) + return CURLFTPMETHOD_MULTICWD; + + warnf(config->global, "unrecognized ftp file method '%s', using default\n", + str); + + return CURLFTPMETHOD_MULTICWD; +} + +int ftpcccmethod(struct OperationConfig *config, const char *str) +{ + if(curlx_raw_equal("passive", str)) + return CURLFTPSSL_CCC_PASSIVE; + if(curlx_raw_equal("active", str)) + return CURLFTPSSL_CCC_ACTIVE; + + warnf(config->global, "unrecognized ftp CCC method '%s', using default\n", + str); + + return CURLFTPSSL_CCC_PASSIVE; +} + +long delegation(struct OperationConfig *config, char *str) +{ + if(curlx_raw_equal("none", str)) + return CURLGSSAPI_DELEGATION_NONE; + if(curlx_raw_equal("policy", str)) + return CURLGSSAPI_DELEGATION_POLICY_FLAG; + if(curlx_raw_equal("always", str)) + return CURLGSSAPI_DELEGATION_FLAG; + + warnf(config->global, "unrecognized delegation method '%s', using none\n", + str); + + return CURLGSSAPI_DELEGATION_NONE; +} + +/* + * my_useragent: returns allocated string with default user agent + */ +static char *my_useragent(void) +{ + return strdup(CURL_NAME "/" CURL_VERSION); +} + +CURLcode get_args(struct OperationConfig *config, const size_t i) +{ + CURLcode result = CURLE_OK; + bool last = (config->next ? FALSE : TRUE); + + /* Check we have a password for the given host user */ + if(config->userpwd && !config->xoauth2_bearer) { + result = checkpasswd("host", i, last, &config->userpwd); + if(result) + return result; + } + + /* Check we have a password for the given proxy user */ + if(config->proxyuserpwd) { + result = checkpasswd("proxy", i, last, &config->proxyuserpwd); + if(result) + return result; + } + + /* Check we have a user agent */ + if(!config->useragent) { + config->useragent = my_useragent(); + if(!config->useragent) { + helpf(config->global->errors, "out of memory\n"); + result = CURLE_OUT_OF_MEMORY; + } + } + + return result; +} diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h new file mode 100644 index 0000000..69d7fd4 --- /dev/null +++ b/src/tool_paramhlp.h @@ -0,0 +1,54 @@ +#ifndef HEADER_CURL_TOOL_PARAMHLP_H +#define HEADER_CURL_TOOL_PARAMHLP_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +struct getout *new_getout(struct OperationConfig *config); + +ParameterError file2string(char **bufp, FILE *file); + +ParameterError file2memory(char **bufp, size_t *size, FILE *file); + +void cleanarg(char *str); + +ParameterError str2num(long *val, const char *str); +ParameterError str2unum(long *val, const char *str); +ParameterError str2double(double *val, const char *str); +ParameterError str2udouble(double *val, const char *str); + +long proto2num(struct OperationConfig *config, long *val, const char *str); + +ParameterError str2offset(curl_off_t *val, const char *str); + +CURLcode get_args(struct OperationConfig *config, const size_t i); + +ParameterError add2list(struct curl_slist **list, const char *ptr); + +int ftpfilemethod(struct OperationConfig *config, const char *str); + +int ftpcccmethod(struct OperationConfig *config, const char *str); + +long delegation(struct OperationConfig *config, char *str); + +#endif /* HEADER_CURL_TOOL_PARAMHLP_H */ + diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c new file mode 100644 index 0000000..39b43ee --- /dev/null +++ b/src/tool_parsecfg.c @@ -0,0 +1,365 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_getparam.h" +#include "tool_helpers.h" +#include "tool_homedir.h" +#include "tool_msgs.h" +#include "tool_parsecfg.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#define CURLRC DOT_CHAR "curlrc" + +/* only acknowledge colon or equals as separators if the option was not + specified with an initial dash! */ +#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':'))) + +static const char *unslashquote(const char *line, char *param); +static char *my_get_line(FILE *fp); + +/* return 0 on everything-is-fine, and non-zero otherwise */ +int parseconfig(const char *filename, struct GlobalConfig *global) +{ + int res; + FILE *file; + char filebuffer[512]; + bool usedarg; + char *home; + int rc = 0; + struct OperationConfig *operation = global->first; + + if(!filename || !*filename) { + /* NULL or no file name attempts to load .curlrc from the homedir! */ + +#ifndef __AMIGA__ + filename = CURLRC; /* sensible default */ + home = homedir(); /* portable homedir finder */ + if(home) { + if(strlen(home) < (sizeof(filebuffer) - strlen(CURLRC))) { + snprintf(filebuffer, sizeof(filebuffer), + "%s%s%s", home, DIR_CHAR, CURLRC); + +#ifdef WIN32 + /* Check if the file exists - if not, try CURLRC in the same + * directory as our executable + */ + file = fopen(filebuffer, FOPEN_READTEXT); + if(file != NULL) { + fclose(file); + filename = filebuffer; + } + else { + /* Get the filename of our executable. GetModuleFileName is + * already declared via inclusions done in setup header file. + * We assume that we are using the ASCII version here. + */ + int n = GetModuleFileName(0, filebuffer, sizeof(filebuffer)); + if(n > 0 && n < (int)sizeof(filebuffer)) { + /* We got a valid filename - get the directory part */ + char *lastdirchar = strrchr(filebuffer, '\\'); + if(lastdirchar) { + size_t remaining; + *lastdirchar = 0; + /* If we have enough space, build the RC filename */ + remaining = sizeof(filebuffer) - strlen(filebuffer); + if(strlen(CURLRC) < remaining - 1) { + snprintf(lastdirchar, remaining, + "%s%s", DIR_CHAR, CURLRC); + /* Don't bother checking if it exists - we do + * that later + */ + filename = filebuffer; + } + } + } + } +#else /* WIN32 */ + filename = filebuffer; +#endif /* WIN32 */ + } + Curl_safefree(home); /* we've used it, now free it */ + } + +# else /* __AMIGA__ */ + /* On AmigaOS all the config files are into env: + */ + filename = "ENV:" CURLRC; + +#endif + } + + if(strcmp(filename, "-")) + file = fopen(filename, FOPEN_READTEXT); + else + file = stdin; + + if(file) { + char *line; + char *aline; + char *option; + char *param; + int lineno = 0; + bool alloced_param; + bool dashed_option; + + while(NULL != (aline = my_get_line(file))) { + lineno++; + line = aline; + alloced_param=FALSE; + + /* line with # in the first non-blank column is a comment! */ + while(*line && ISSPACE(*line)) + line++; + + switch(*line) { + case '#': + case '/': + case '\r': + case '\n': + case '*': + case '\0': + Curl_safefree(aline); + continue; + } + + /* the option keywords starts here */ + option = line; + + /* the option starts with a dash? */ + dashed_option = option[0]=='-'?TRUE:FALSE; + + while(*line && !ISSPACE(*line) && !ISSEP(*line, dashed_option)) + line++; + /* ... and has ended here */ + + if(*line) + *line++ = '\0'; /* zero terminate, we have a local copy of the data */ + +#ifdef DEBUG_CONFIG + fprintf(stderr, "GOT: %s\n", option); +#endif + + /* pass spaces and separator(s) */ + while(*line && (ISSPACE(*line) || ISSEP(*line, dashed_option))) + line++; + + /* the parameter starts here (unless quoted) */ + if(*line == '\"') { + /* quoted parameter, do the quote dance */ + line++; + param = malloc(strlen(line) + 1); /* parameter */ + if(!param) { + /* out of memory */ + Curl_safefree(aline); + rc = 1; + break; + } + alloced_param = TRUE; + (void)unslashquote(line, param); + } + else { + param = line; /* parameter starts here */ + while(*line && !ISSPACE(*line)) + line++; + + if(*line) { + *line = '\0'; /* zero terminate */ + + /* to detect mistakes better, see if there's data following */ + line++; + /* pass all spaces */ + while(*line && ISSPACE(*line)) + line++; + + switch(*line) { + case '\0': + case '\r': + case '\n': + case '#': /* comment */ + break; + default: + warnf(operation->global, "%s:%d: warning: '%s' uses unquoted " + "white space in the line that may cause side-effects!\n", + filename, lineno, option); + } + } + } + + if(!*param) { + /* do this so getparameter can check for required parameters. + Otherwise it always thinks there's a parameter. */ + if(alloced_param) + Curl_safefree(param); + param = NULL; + } + +#ifdef DEBUG_CONFIG + fprintf(stderr, "PARAM: \"%s\"\n",(param ? param : "(null)")); +#endif + res = getparameter(option, param, &usedarg, global, operation); + + if(param && *param && !usedarg) + /* we passed in a parameter that wasn't used! */ + res = PARAM_GOT_EXTRA_PARAMETER; + + if(res == PARAM_NEXT_OPERATION) { + if(operation->url_list && operation->url_list->url) { + /* Allocate the next config */ + operation->next = malloc(sizeof(struct OperationConfig)); + if(operation->next) { + /* Initialise the newly created config */ + config_init(operation->next); + + /* Copy the easy handle */ + operation->next->easy = global->easy; + + /* Set the global config pointer */ + operation->next->global = global; + + /* Update the last operation pointer */ + global->last = operation->next; + + /* Move onto the new config */ + operation->next->prev = operation; + operation = operation->next; + } + else + res = PARAM_NO_MEM; + } + } + + if(res != PARAM_OK && res != PARAM_NEXT_OPERATION) { + /* the help request isn't really an error */ + if(!strcmp(filename, "-")) { + filename = (char *)"<stdin>"; + } + if(res != PARAM_HELP_REQUESTED && + res != PARAM_MANUAL_REQUESTED && + res != PARAM_VERSION_INFO_REQUESTED && + res != PARAM_ENGINES_REQUESTED) { + const char *reason = param2text(res); + warnf(operation->global, "%s:%d: warning: '%s' %s\n", + filename, lineno, option, reason); + } + } + + if(alloced_param) + Curl_safefree(param); + + Curl_safefree(aline); + } + if(file != stdin) + fclose(file); + } + else + rc = 1; /* couldn't open the file */ + + return rc; +} + +/* + * Copies the string from line to the buffer at param, unquoting + * backslash-quoted characters and NUL-terminating the output string. + * Stops at the first non-backslash-quoted double quote character or the + * end of the input string. param must be at least as long as the input + * string. Returns the pointer after the last handled input character. + */ +static const char *unslashquote(const char *line, char *param) +{ + while(*line && (*line != '\"')) { + if(*line == '\\') { + char out; + line++; + + /* default is to output the letter after the backslash */ + switch(out = *line) { + case '\0': + continue; /* this'll break out of the loop */ + case 't': + out = '\t'; + break; + case 'n': + out = '\n'; + break; + case 'r': + out = '\r'; + break; + case 'v': + out = '\v'; + break; + } + *param++ = out; + line++; + } + else + *param++ = *line++; + } + *param = '\0'; /* always zero terminate */ + return line; +} + +/* + * Reads a line from the given file, ensuring is NUL terminated. + * The pointer must be freed by the caller. + * NULL is returned on an out of memory condition. + */ +static char *my_get_line(FILE *fp) +{ + char buf[4096]; + char *nl = NULL; + char *line = NULL; + + do { + if(NULL == fgets(buf, sizeof(buf), fp)) + break; + if(!line) { + line = strdup(buf); + if(!line) + return NULL; + } + else { + char *ptr; + size_t linelen = strlen(line); + ptr = realloc(line, linelen + strlen(buf) + 1); + if(!ptr) { + Curl_safefree(line); + return NULL; + } + line = ptr; + strcpy(&line[linelen], buf); + } + nl = strchr(line, '\n'); + } while(!nl); + + if(nl) + *nl = '\0'; + + return line; +} + diff --git a/src/tool_parsecfg.h b/src/tool_parsecfg.h new file mode 100644 index 0000000..c3b19d5 --- /dev/null +++ b/src/tool_parsecfg.h @@ -0,0 +1,29 @@ +#ifndef HEADER_CURL_TOOL_PARSECFG_H +#define HEADER_CURL_TOOL_PARSECFG_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +int parseconfig(const char *filename, struct GlobalConfig *config); + +#endif /* HEADER_CURL_TOOL_PARSECFG_H */ + diff --git a/src/tool_sdecls.h b/src/tool_sdecls.h new file mode 100644 index 0000000..e74020f --- /dev/null +++ b/src/tool_sdecls.h @@ -0,0 +1,153 @@ +#ifndef HEADER_CURL_TOOL_SDECLS_H +#define HEADER_CURL_TOOL_SDECLS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" +#ifdef USE_METALINK +# include <metalink/metalink.h> +#endif /* USE_METALINK */ + +/* + * OutStruct variables keep track of information relative to curl's + * output writing, which may take place to a standard stream or a file. + * + * 'filename' member is either a pointer to a file name string or NULL + * when dealing with a standard stream. + * + * 'alloc_filename' member is TRUE when string pointed by 'filename' has been + * dynamically allocated and 'belongs' to this OutStruct, otherwise FALSE. + * + * 'is_cd_filename' member is TRUE when string pointed by 'filename' has been + * set using a server-specified Content-Disposition filename, otherwise FALSE. + * + * 's_isreg' member is TRUE when output goes to a regular file, this also + * implies that output is 'seekable' and 'appendable' and also that member + * 'filename' points to file name's string. For any standard stream member + * 's_isreg' will be FALSE. + * + * 'fopened' member is TRUE when output goes to a regular file and it + * has been fopen'ed, requiring it to be closed later on. In any other + * case this is FALSE. + * + * 'stream' member is a pointer to a stream controlling object as returned + * from a 'fopen' call or a standard stream. + * + * 'config' member is a pointer to associated 'OperationConfig' struct. + * + * 'bytes' member represents amount written so far. + * + * 'init' member holds original file size or offset at which truncation is + * taking place. Always zero unless appending to a non-empty regular file. + * + * 'metalink_parser' member is a pointer to Metalink XML parser + * context. + */ + +struct OutStruct { + char *filename; + bool alloc_filename; + bool is_cd_filename; + bool s_isreg; + bool fopened; + FILE *stream; + struct OperationConfig *config; + curl_off_t bytes; + curl_off_t init; +#ifdef USE_METALINK + metalink_parser_context_t *metalink_parser; +#endif /* USE_METALINK */ +}; + + +/* + * InStruct variables keep track of information relative to curl's + * input reading, which may take place from stdin or from some file. + * + * 'fd' member is either 'stdin' file descriptor number STDIN_FILENO + * or a file descriptor as returned from an 'open' call for some file. + * + * 'config' member is a pointer to associated 'OperationConfig' struct. + */ + +struct InStruct { + int fd; + struct OperationConfig *config; +}; + + +/* + * A linked list of these 'getout' nodes contain URL's to fetch, + * as well as information relative to where URL contents should + * be stored or which file should be uploaded. + */ + +struct getout { + struct getout *next; /* next one */ + char *url; /* the URL we deal with */ + char *outfile; /* where to store the output */ + char *infile; /* file to upload, if GETOUT_UPLOAD is set */ + int flags; /* options - composed of GETOUT_* bits */ +}; + +#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */ +#define GETOUT_URL (1<<1) /* set when URL is deemed done */ +#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */ +#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */ +#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */ +#define GETOUT_METALINK (1<<5) /* set when Metalink download */ + +/* + * 'trace' enumeration represents curl's output look'n feel possibilities. + */ + +typedef enum { + TRACE_NONE, /* no trace/verbose output at all */ + TRACE_BIN, /* tcpdump inspired look */ + TRACE_ASCII, /* like *BIN but without the hex output */ + TRACE_PLAIN /* -v/--verbose type */ +} trace; + + +/* + * 'HttpReq' enumeration represents HTTP request types. + */ + +typedef enum { + HTTPREQ_UNSPEC, /* first in list */ + HTTPREQ_GET, + HTTPREQ_HEAD, + HTTPREQ_POST, + HTTPREQ_SIMPLEPOST, + HTTPREQ_CUSTOM, + HTTPREQ_LAST /* last in list */ +} HttpReq; + + +/* + * Complete struct declarations which have OperationConfig struct members, + * just in case this header is directly included in some source file. + */ + +#include "tool_cfgable.h" + +#endif /* HEADER_CURL_TOOL_SDECLS_H */ + diff --git a/src/tool_setopt.c b/src/tool_setopt.c new file mode 100644 index 0000000..a53fdc8 --- /dev/null +++ b/src/tool_setopt.c @@ -0,0 +1,567 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifndef CURL_DISABLE_LIBCURL_OPTION + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" + +#include "tool_cfgable.h" +#include "tool_easysrc.h" +#include "tool_setopt.h" + +#include "memdebug.h" /* keep this as LAST include */ + +/* Lookup tables for converting setopt values back to symbols */ +/* For enums, values may be in any order. */ +/* For bit masks, put combinations first, then single bits, */ +/* and finally any "NONE" value. */ + +#define NV(e) {#e, e} +#define NV1(e, v) {#e, (v)} +#define NVEND {NULL, 0} /* sentinel to mark end of list */ + +const NameValue setopt_nv_CURLPROXY[] = { + NV(CURLPROXY_HTTP), + NV(CURLPROXY_HTTP_1_0), + NV(CURLPROXY_SOCKS4), + NV(CURLPROXY_SOCKS5), + NV(CURLPROXY_SOCKS4A), + NV(CURLPROXY_SOCKS5_HOSTNAME), + NVEND, +}; + +const NameValueUnsigned setopt_nv_CURLAUTH[] = { + NV(CURLAUTH_ANY), /* combination */ + NV(CURLAUTH_ANYSAFE), /* combination */ + NV(CURLAUTH_BASIC), + NV(CURLAUTH_DIGEST), + NV(CURLAUTH_GSSNEGOTIATE), + NV(CURLAUTH_NTLM), + NV(CURLAUTH_DIGEST_IE), + NV(CURLAUTH_NTLM_WB), + NV(CURLAUTH_ONLY), + NV(CURLAUTH_NONE), + NVEND, +}; + +const NameValue setopt_nv_CURL_HTTP_VERSION[] = { + NV(CURL_HTTP_VERSION_NONE), + NV(CURL_HTTP_VERSION_1_0), + NV(CURL_HTTP_VERSION_1_1), + NVEND, +}; + +const NameValue setopt_nv_CURL_SSLVERSION[] = { + NV(CURL_SSLVERSION_DEFAULT), + NV(CURL_SSLVERSION_TLSv1), + NV(CURL_SSLVERSION_SSLv2), + NV(CURL_SSLVERSION_SSLv3), + NV(CURL_SSLVERSION_TLSv1_0), + NV(CURL_SSLVERSION_TLSv1_1), + NV(CURL_SSLVERSION_TLSv1_2), + NVEND, +}; + +const NameValue setopt_nv_CURL_TIMECOND[] = { + NV(CURL_TIMECOND_IFMODSINCE), + NV(CURL_TIMECOND_IFUNMODSINCE), + NV(CURL_TIMECOND_LASTMOD), + NV(CURL_TIMECOND_NONE), + NVEND, +}; + +const NameValue setopt_nv_CURLFTPSSL_CCC[] = { + NV(CURLFTPSSL_CCC_NONE), + NV(CURLFTPSSL_CCC_PASSIVE), + NV(CURLFTPSSL_CCC_ACTIVE), + NVEND, +}; + +const NameValue setopt_nv_CURLUSESSL[] = { + NV(CURLUSESSL_NONE), + NV(CURLUSESSL_TRY), + NV(CURLUSESSL_CONTROL), + NV(CURLUSESSL_ALL), + NVEND, +}; + +const NameValue setopt_nv_CURL_NETRC[] = { + NV(CURL_NETRC_IGNORED), + NV(CURL_NETRC_OPTIONAL), + NV(CURL_NETRC_REQUIRED), + NVEND, +}; + +/* These mappings essentially triplicated - see + * tool_libinfo.c and tool_paramhlp.c */ +const NameValue setopt_nv_CURLPROTO[] = { + NV(CURLPROTO_ALL), /* combination */ + NV(CURLPROTO_DICT), + NV(CURLPROTO_FILE), + NV(CURLPROTO_FTP), + NV(CURLPROTO_FTPS), + NV(CURLPROTO_GOPHER), + NV(CURLPROTO_HTTP), + NV(CURLPROTO_HTTPS), + NV(CURLPROTO_IMAP), + NV(CURLPROTO_IMAPS), + NV(CURLPROTO_LDAP), + NV(CURLPROTO_LDAPS), + NV(CURLPROTO_POP3), + NV(CURLPROTO_POP3S), + NV(CURLPROTO_RTSP), + NV(CURLPROTO_SCP), + NV(CURLPROTO_SFTP), + NV(CURLPROTO_SMB), + NV(CURLPROTO_SMBS), + NV(CURLPROTO_SMTP), + NV(CURLPROTO_SMTPS), + NV(CURLPROTO_TELNET), + NV(CURLPROTO_TFTP), + NVEND, +}; + +/* These options have non-zero default values. */ +static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = { + NV1(CURLOPT_SSL_VERIFYPEER, 1), + NV1(CURLOPT_SSL_VERIFYHOST, 1), + NV1(CURLOPT_SSL_ENABLE_NPN, 1), + NV1(CURLOPT_SSL_ENABLE_ALPN, 1), + NVEND +}; + +/* Format and add code; jump to nomem on malloc error */ +#define ADD(args) do { \ + ret = easysrc_add args; \ + if(ret) \ + goto nomem; \ +} WHILE_FALSE +#define ADDF(args) do { \ + ret = easysrc_addf args; \ + if(ret) \ + goto nomem; \ +} WHILE_FALSE + +#define DECL0(s) ADD((&easysrc_decl, s)) +#define DECL1(f,a) ADDF((&easysrc_decl, f,a)) + +#define DATA0(s) ADD((&easysrc_data, s)) +#define DATA1(f,a) ADDF((&easysrc_data, f,a)) +#define DATA2(f,a,b) ADDF((&easysrc_data, f,a,b)) +#define DATA3(f,a,b,c) ADDF((&easysrc_data, f,a,b,c)) + +#define CODE0(s) ADD((&easysrc_code, s)) +#define CODE1(f,a) ADDF((&easysrc_code, f,a)) +#define CODE2(f,a,b) ADDF((&easysrc_code, f,a,b)) +#define CODE3(f,a,b,c) ADDF((&easysrc_code, f,a,b,c)) + +#define CLEAN0(s) ADD((&easysrc_clean, s)) +#define CLEAN1(f,a) ADDF((&easysrc_clean, f,a)) + +#define REM0(s) ADD((&easysrc_toohard, s)) +#define REM1(f,a) ADDF((&easysrc_toohard, f,a)) +#define REM2(f,a,b) ADDF((&easysrc_toohard, f,a,b)) + +/* Escape string to C string syntax. Return NULL if out of memory. + * Is this correct for those wacky EBCDIC guys? */ +static char *c_escape(const char *str) +{ + size_t len = 0; + const char *s; + unsigned char c; + char *escaped, *e; + /* Allocate space based on worst-case */ + len = strlen(str); + escaped = malloc(4 * len + 1); + if(!escaped) + return NULL; + + e = escaped; + for(s=str; (c=*s) != '\0'; s++) { + if(c=='\n') { + strcpy(e, "\\n"); + e += 2; + } + else if(c=='\r') { + strcpy(e, "\\r"); + e += 2; + } + else if(c=='\t') { + strcpy(e, "\\t"); + e += 2; + } + else if(c=='\\') { + strcpy(e, "\\\\"); + e += 2; + } + else if(c=='"') { + strcpy(e, "\\\""); + e += 2; + } + else if(! isprint(c)) { + snprintf(e, 4, "\\%03o", c); + e += 4; + } + else + *e++ = c; + } + *e = '\0'; + return escaped; +} + +/* setopt wrapper for enum types */ +CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValue *nvlist, long lval) +{ + CURLcode ret = CURLE_OK; + bool skip = FALSE; + + ret = curl_easy_setopt(curl, tag, lval); + if(!lval) + skip = TRUE; + + if(config->libcurl && !skip && !ret) { + /* we only use this for real if --libcurl was used */ + const NameValue *nv = NULL; + for(nv=nvlist; nv->name; nv++) { + if(nv->value == lval) break; /* found it */ + } + if(! nv->name) { + /* If no definition was found, output an explicit value. + * This could happen if new values are defined and used + * but the NameValue list is not updated. */ + CODE2("curl_easy_setopt(hnd, %s, %ldL);", name, lval); + } + else { + CODE2("curl_easy_setopt(hnd, %s, (long)%s);", name, nv->name); + } + } + + nomem: + return ret; +} + +/* setopt wrapper for flags */ +CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValue *nvlist, long lval) +{ + CURLcode ret = CURLE_OK; + bool skip = FALSE; + + ret = curl_easy_setopt(curl, tag, lval); + if(!lval) + skip = TRUE; + + if(config->libcurl && !skip && !ret) { + /* we only use this for real if --libcurl was used */ + char preamble[80]; /* should accommodate any symbol name */ + long rest = lval; /* bits not handled yet */ + const NameValue *nv = NULL; + snprintf(preamble, sizeof(preamble), + "curl_easy_setopt(hnd, %s, ", name); + for(nv=nvlist; nv->name; nv++) { + if((nv->value & ~ rest) == 0) { + /* all value flags contained in rest */ + rest &= ~ nv->value; /* remove bits handled here */ + CODE3("%s(long)%s%s", + preamble, nv->name, rest ? " |" : ");"); + if(!rest) + break; /* handled them all */ + /* replace with all spaces for continuation line */ + snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), ""); + } + } + /* If any bits have no definition, output an explicit value. + * This could happen if new bits are defined and used + * but the NameValue list is not updated. */ + if(rest) + CODE2("%s%ldL);", preamble, rest); + } + + nomem: + return ret; +} + +/* setopt wrapper for bitmasks */ +CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValueUnsigned *nvlist, + long lval) +{ + CURLcode ret = CURLE_OK; + bool skip = FALSE; + + ret = curl_easy_setopt(curl, tag, lval); + if(!lval) + skip = TRUE; + + if(config->libcurl && !skip && !ret) { + /* we only use this for real if --libcurl was used */ + char preamble[80]; + unsigned long rest = (unsigned long)lval; + const NameValueUnsigned *nv = NULL; + snprintf(preamble, sizeof(preamble), + "curl_easy_setopt(hnd, %s, ", name); + for(nv=nvlist; nv->name; nv++) { + if((nv->value & ~ rest) == 0) { + /* all value flags contained in rest */ + rest &= ~ nv->value; /* remove bits handled here */ + CODE3("%s(long)%s%s", + preamble, nv->name, rest ? " |" : ");"); + if(!rest) + break; /* handled them all */ + /* replace with all spaces for continuation line */ + snprintf(preamble, sizeof(preamble), "%*s", strlen(preamble), ""); + } + } + /* If any bits have no definition, output an explicit value. + * This could happen if new bits are defined and used + * but the NameValue list is not updated. */ + if(rest) + CODE2("%s%luUL);", preamble, rest); + } + + nomem: + return ret; +} + +/* setopt wrapper for CURLOPT_HTTPPOST */ +CURLcode tool_setopt_httppost(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + struct curl_httppost *post) +{ + CURLcode ret = CURLE_OK; + char *escaped = NULL; + bool skip = FALSE; + + ret = curl_easy_setopt(curl, tag, post); + if(!post) + skip = TRUE; + + if(config->libcurl && !skip && !ret) { + struct curl_httppost *pp, *p; + int i; + /* May use several httppost lists, if multiple POST actions */ + i = ++ easysrc_form_count; + DECL1("struct curl_httppost *post%d;", i); + DATA1("post%d = NULL;", i); + CLEAN1("curl_formfree(post%d);", i); + CLEAN1("post%d = NULL;", i); + if(i == 1) + DECL0("struct curl_httppost *postend;"); + DATA0("postend = NULL;"); + for(p=post; p; p=p->next) { + DATA1("curl_formadd(&post%d, &postend,", i); + DATA1(" CURLFORM_COPYNAME, \"%s\",", p->name); + for(pp=p; pp; pp=pp->more) { + /* May be several files uploaded for one name; + * these are linked through the 'more' pointer */ + Curl_safefree(escaped); + escaped = c_escape(pp->contents); + if(!escaped) { + ret = CURLE_OUT_OF_MEMORY; + goto nomem; + } + if(pp->flags & HTTPPOST_FILENAME) { + /* file upload as for -F @filename */ + DATA1(" CURLFORM_FILE, \"%s\",", escaped); + } + else if(pp->flags & HTTPPOST_READFILE) { + /* content from file as for -F <filename */ + DATA1(" CURLFORM_FILECONTENT, \"%s\",", escaped); + } + else + DATA1(" CURLFORM_COPYCONTENTS, \"%s\",", escaped); + if(pp->showfilename) { + Curl_safefree(escaped); + escaped = c_escape(pp->showfilename); + if(!escaped) { + ret = CURLE_OUT_OF_MEMORY; + goto nomem; + } + DATA1(" CURLFORM_FILENAME, \"%s\",", escaped); + } + if(pp->contenttype) { + Curl_safefree(escaped); + escaped = c_escape(pp->contenttype); + if(!escaped) { + ret = CURLE_OUT_OF_MEMORY; + goto nomem; + } + DATA1(" CURLFORM_CONTENTTYPE, \"%s\",", escaped); + } + } + DATA0(" CURLFORM_END);"); + } + CODE2("curl_easy_setopt(hnd, %s, post%d);", name, i); + } + + nomem: + Curl_safefree(escaped); + return ret; +} + +/* setopt wrapper for curl_slist options */ +CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + struct curl_slist *list) +{ + CURLcode ret = CURLE_OK; + char *escaped = NULL; + bool skip = FALSE; + + ret = curl_easy_setopt(curl, tag, list); + if(!list) + skip = TRUE; + + if(config->libcurl && !skip && !ret) { + struct curl_slist *s; + int i; + /* May need several slist variables, so invent name */ + i = ++ easysrc_slist_count; + DECL1("struct curl_slist *slist%d;", i); + DATA1("slist%d = NULL;", i); + CLEAN1("curl_slist_free_all(slist%d);", i); + CLEAN1("slist%d = NULL;", i); + for(s=list; s; s=s->next) { + Curl_safefree(escaped); + escaped = c_escape(s->data); + if(!escaped) { + ret = CURLE_OUT_OF_MEMORY; + goto nomem; + } + DATA3("slist%d = curl_slist_append(slist%d, \"%s\");", i, i, escaped); + } + CODE2("curl_easy_setopt(hnd, %s, slist%d);", name, i); + } + + nomem: + Curl_safefree(escaped); + return ret; +} + +/* generic setopt wrapper for all other options. + * Some type information is encoded in the tag value. */ +CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config, + const char *name, CURLoption tag, ...) +{ + va_list arg; + char buf[256]; + const char *value = NULL; + bool remark = FALSE; + bool skip = FALSE; + bool escape = FALSE; + char *escaped = NULL; + CURLcode ret = CURLE_OK; + + va_start(arg, tag); + + if(tag < CURLOPTTYPE_OBJECTPOINT) { + /* Value is expected to be a long */ + long lval = va_arg(arg, long); + long defval = 0L; + const NameValue *nv = NULL; + for(nv=setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) { + if(!strcmp(name, nv->name)) { + defval = nv->value; + break; /* found it */ + } + } + + snprintf(buf, sizeof(buf), "%ldL", lval); + value = buf; + ret = curl_easy_setopt(curl, tag, lval); + if(lval == defval) + skip = TRUE; + } + else if(tag < CURLOPTTYPE_OFF_T) { + /* Value is some sort of object pointer */ + void *pval = va_arg(arg, void *); + + /* function pointers are never printable */ + if(tag >= CURLOPTTYPE_FUNCTIONPOINT) { + if(pval) { + value = "functionpointer"; + remark = TRUE; + } + else + skip = TRUE; + } + + else if(pval && str) { + value = (char *)pval; + escape = TRUE; + } + else if(pval) { + value = "objectpointer"; + remark = TRUE; + } + else + skip = TRUE; + + ret = curl_easy_setopt(curl, tag, pval); + + } + else { + /* Value is expected to be curl_off_t */ + curl_off_t oval = va_arg(arg, curl_off_t); + snprintf(buf, sizeof(buf), + "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval); + value = buf; + ret = curl_easy_setopt(curl, tag, oval); + + if(!oval) + skip = TRUE; + } + + va_end(arg); + + if(config->libcurl && !skip && !ret) { + /* we only use this for real if --libcurl was used */ + + if(remark) + REM2("%s set to a %s", name, value); + else { + if(escape) { + escaped = c_escape(value); + if(!escaped) { + ret = CURLE_OUT_OF_MEMORY; + goto nomem; + } + CODE2("curl_easy_setopt(hnd, %s, \"%s\");", name, escaped); + } + else + CODE2("curl_easy_setopt(hnd, %s, %s);", name, value); + } + } + + nomem: + Curl_safefree(escaped); + return ret; +} + +#endif /* CURL_DISABLE_LIBCURL_OPTION */ diff --git a/src/tool_setopt.h b/src/tool_setopt.h new file mode 100644 index 0000000..fcba94c --- /dev/null +++ b/src/tool_setopt.h @@ -0,0 +1,148 @@ +#ifndef HEADER_CURL_TOOL_SETOPT_H +#define HEADER_CURL_TOOL_SETOPT_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +/* + * Macros used in operate() + */ + +#define SETOPT_CHECK(v) do { \ + result = (v); \ + if(result) \ + goto show_error; \ +} WHILE_FALSE + +#ifndef CURL_DISABLE_LIBCURL_OPTION + +/* Associate symbolic names with option values */ +typedef struct { + const char *name; + long value; +} NameValue; + +typedef struct { + const char *name; + unsigned long value; +} NameValueUnsigned; + +extern const NameValue setopt_nv_CURLPROXY[]; +extern const NameValue setopt_nv_CURL_HTTP_VERSION[]; +extern const NameValue setopt_nv_CURL_SSLVERSION[]; +extern const NameValue setopt_nv_CURL_TIMECOND[]; +extern const NameValue setopt_nv_CURLFTPSSL_CCC[]; +extern const NameValue setopt_nv_CURLUSESSL[]; +extern const NameValue setopt_nv_CURL_NETRC[]; +extern const NameValue setopt_nv_CURLPROTO[]; +extern const NameValueUnsigned setopt_nv_CURLAUTH[]; + +/* Map options to NameValue sets */ +#define setopt_nv_CURLOPT_HTTP_VERSION setopt_nv_CURL_HTTP_VERSION +#define setopt_nv_CURLOPT_HTTPAUTH setopt_nv_CURLAUTH +#define setopt_nv_CURLOPT_SSLVERSION setopt_nv_CURL_SSLVERSION +#define setopt_nv_CURLOPT_TIMECONDITION setopt_nv_CURL_TIMECOND +#define setopt_nv_CURLOPT_FTP_SSL_CCC setopt_nv_CURLFTPSSL_CCC +#define setopt_nv_CURLOPT_USE_SSL setopt_nv_CURLUSESSL +#define setopt_nv_CURLOPT_NETRC setopt_nv_CURL_NETRC +#define setopt_nv_CURLOPT_PROTOCOLS setopt_nv_CURLPROTO +#define setopt_nv_CURLOPT_REDIR_PROTOCOLS setopt_nv_CURLPROTO +#define setopt_nv_CURLOPT_PROXYTYPE setopt_nv_CURLPROXY +#define setopt_nv_CURLOPT_PROXYAUTH setopt_nv_CURLAUTH + +/* Intercept setopt calls for --libcurl */ + +CURLcode tool_setopt_enum(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValue *nv, long lval); +CURLcode tool_setopt_flags(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValue *nv, long lval); +CURLcode tool_setopt_bitmask(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + const NameValueUnsigned *nv, long lval); +CURLcode tool_setopt_httppost(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + struct curl_httppost *httppost); +CURLcode tool_setopt_slist(CURL *curl, struct GlobalConfig *config, + const char *name, CURLoption tag, + struct curl_slist *list); +CURLcode tool_setopt(CURL *curl, bool str, struct GlobalConfig *config, + const char *name, CURLoption tag, ...); + +#define my_setopt(x,y,z) \ + SETOPT_CHECK(tool_setopt(x, FALSE, global, #y, y, z)) + +#define my_setopt_str(x,y,z) \ + SETOPT_CHECK(tool_setopt(x, TRUE, global, #y, y, z)) + +#define my_setopt_enum(x,y,z) \ + SETOPT_CHECK(tool_setopt_enum(x, global, #y, y, setopt_nv_ ## y, z)) + +#define my_setopt_flags(x,y,z) \ + SETOPT_CHECK(tool_setopt_flags(x, global, #y, y, setopt_nv_ ## y, z)) + +#define my_setopt_bitmask(x,y,z) \ + SETOPT_CHECK(tool_setopt_bitmask(x, global, #y, y, setopt_nv_ ## y, z)) + +#define my_setopt_httppost(x,y,z) \ + SETOPT_CHECK(tool_setopt_httppost(x, global, #y, y, z)) + +#define my_setopt_slist(x,y,z) \ + SETOPT_CHECK(tool_setopt_slist(x, global, #y, y, z)) + +#define res_setopt(x,y,z) tool_setopt(x, FALSE, global, #y, y, z) + +#define res_setopt_str(x,y,z) tool_setopt(x, TRUE, global, #y, y, z) + +#else /* CURL_DISABLE_LIBCURL_OPTION */ + +/* No --libcurl, so pass options directly to library */ + +#define my_setopt(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_str(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_enum(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_flags(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_bitmask(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_httppost(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define my_setopt_slist(x,y,z) \ + SETOPT_CHECK(curl_easy_setopt(x, y, z)) + +#define res_setopt(x,y,z) curl_easy_setopt(x,y,z) + +#define res_setopt_str(x,y,z) curl_easy_setopt(x,y,z) + +#endif /* CURL_DISABLE_LIBCURL_OPTION */ + +#endif /* HEADER_CURL_TOOL_SETOPT_H */ diff --git a/src/tool_setup.h b/src/tool_setup.h new file mode 100644 index 0000000..3d7c158 --- /dev/null +++ b/src/tool_setup.h @@ -0,0 +1,74 @@ +#ifndef HEADER_CURL_TOOL_SETUP_H +#define HEADER_CURL_TOOL_SETUP_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#define CURL_NO_OLDIES + +/* + * curl_setup.h may define preprocessor macros such as _FILE_OFFSET_BITS and + * _LARGE_FILES in order to support files larger than 2 GB. On platforms + * where this happens it is mandatory that these macros are defined before + * any system header file is included, otherwise file handling function + * prototypes will be misdeclared and curl tool may not build properly; + * therefore we must include curl_setup.h before curl.h when building curl. + */ + +#include "curl_setup.h" /* from the lib directory */ + +/* + * curl tool certainly uses libcurl's external interface. + */ + +#include <curl/curl.h> /* external interface */ + +/* + * Platform specific stuff. + */ + +#if defined(macintosh) && defined(__MRC__) +# define main(x,y) curl_main(x,y) +#endif + +#ifdef TPF +# undef select + /* change which select is used for the curl command line tool */ +# define select(a,b,c,d,e) tpf_select_bsd(a,b,c,d,e) + /* and turn off the progress meter */ +# define CONF_DEFAULT (0|CONF_NOPROGRESS) +#endif + +#ifndef OS +# define OS "unknown" +#endif + +#ifndef UNPRINTABLE_CHAR + /* define what to use for unprintable characters */ +# define UNPRINTABLE_CHAR '.' +#endif + +#ifndef HAVE_STRDUP +# include "tool_strdup.h" +#endif + +#endif /* HEADER_CURL_TOOL_SETUP_H */ + diff --git a/src/tool_sleep.c b/src/tool_sleep.c new file mode 100644 index 0000000..d023b32 --- /dev/null +++ b/src/tool_sleep.c @@ -0,0 +1,58 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + +#ifdef HAVE_SYS_POLL_H +# include <sys/poll.h> +#elif defined(HAVE_POLL_H) +# include <poll.h> +#endif + +#ifdef MSDOS +# include <dos.h> +#endif + +#include "tool_sleep.h" + +#include "memdebug.h" /* keep this as LAST include */ + +void tool_go_sleep(long ms) +{ +#if defined(MSDOS) + delay(ms); +#elif defined(WIN32) + Sleep(ms); +#elif defined(HAVE_POLL_FINE) + (void)poll((void *)0, 0, (int)ms); +#else + struct timeval timeout; + timeout.tv_sec = ms / 1000L; + ms = ms % 1000L; + timeout.tv_usec = ms * 1000L; + select(0, NULL, NULL, NULL, &timeout); +#endif +} + diff --git a/src/writeout.h b/src/tool_sleep.h index 1b22102..115a4e4 100644 --- a/src/writeout.h +++ b/src/tool_sleep.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_WRITEOUT_H -#define HEADER_CURL_WRITEOUT_H +#ifndef HEADER_CURL_TOOL_SLEEP_H +#define HEADER_CURL_TOOL_SLEEP_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,7 +21,9 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" -void ourWriteOut(CURL *curl, const char *out); +void tool_go_sleep(long ms); + +#endif /* HEADER_CURL_TOOL_SLEEP_H */ -#endif /* HEADER_CURL_WRITEOUT_H */ diff --git a/src/tool_strdup.c b/src/tool_strdup.c new file mode 100644 index 0000000..a0bbe88 --- /dev/null +++ b/src/tool_strdup.c @@ -0,0 +1,47 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_strdup.h" + +#ifndef HAVE_STRDUP +char *strdup(const char *str) +{ + size_t len; + char *newstr; + + if(!str) + return (char *)NULL; + + len = strlen(str); + + if(len >= ((size_t)-1) / sizeof(char)) + return (char *)NULL; + + newstr = malloc((len+1)*sizeof(char)); + if(!newstr) + return (char *)NULL; + + memcpy(newstr, str, (len+1)*sizeof(char)); + + return newstr; + +} +#endif diff --git a/src/tool_strdup.h b/src/tool_strdup.h new file mode 100644 index 0000000..83c8102 --- /dev/null +++ b/src/tool_strdup.h @@ -0,0 +1,30 @@ +#ifndef HEADER_TOOL_STRDUP_H +#define HEADER_TOOL_STRDUP_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifndef HAVE_STRDUP +extern char *strdup(const char *str); +#endif + +#endif /* HEADER_TOOL_STRDUP_H */ diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c new file mode 100644 index 0000000..1337252 --- /dev/null +++ b/src/tool_urlglob.c @@ -0,0 +1,671 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" +#include "tool_urlglob.h" +#include "tool_vms.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#define GLOBERROR(string, column, code) \ + glob->error = string, glob->pos = column, code + +void glob_cleanup(URLGlob* glob); + +static CURLcode glob_fixed(URLGlob *glob, char *fixed, size_t len) +{ + URLPattern *pat = &glob->pattern[glob->size]; + pat->type = UPTSet; + pat->content.Set.size = 1; + pat->content.Set.ptr_s = 0; + pat->globindex = -1; + + pat->content.Set.elements = malloc(sizeof(char*)); + + if(!pat->content.Set.elements) + return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); + + pat->content.Set.elements[0] = malloc(len+1); + if(!pat->content.Set.elements[0]) + return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); + + memcpy(pat->content.Set.elements[0], fixed, len); + pat->content.Set.elements[0][len] = 0; + + return CURLE_OK; +} + +/* multiply + * + * Multiplies and checks for overflow. + */ +static int multiply(unsigned long *amount, long with) +{ + unsigned long sum = *amount * with; + if(sum/with != *amount) + return 1; /* didn't fit, bail out */ + *amount = sum; + return 0; +} + +static CURLcode glob_set(URLGlob *glob, char **patternp, + size_t *posp, unsigned long *amount, + int globindex) +{ + /* processes a set expression with the point behind the opening '{' + ','-separated elements are collected until the next closing '}' + */ + URLPattern *pat; + bool done = FALSE; + char *buf = glob->glob_buffer; + char *pattern = *patternp; + char *opattern = pattern; + size_t opos = *posp-1; + + pat = &glob->pattern[glob->size]; + /* patterns 0,1,2,... correspond to size=1,3,5,... */ + pat->type = UPTSet; + pat->content.Set.size = 0; + pat->content.Set.ptr_s = 0; + pat->content.Set.elements = NULL; + pat->globindex = globindex; + + while(!done) { + switch (*pattern) { + case '\0': /* URL ended while set was still open */ + return GLOBERROR("unmatched brace", opos, CURLE_URL_MALFORMAT); + + case '{': + case '[': /* no nested expressions at this time */ + return GLOBERROR("nested brace", *posp, CURLE_URL_MALFORMAT); + + case '}': /* set element completed */ + if(opattern == pattern) + return GLOBERROR("empty string within braces", *posp, + CURLE_URL_MALFORMAT); + + /* add 1 to size since it'll be incremented below */ + if(multiply(amount, pat->content.Set.size+1)) + return GLOBERROR("range overflow", 0, CURLE_URL_MALFORMAT); + + /* fall-through */ + case ',': + + *buf = '\0'; + if(pat->content.Set.elements) { + char **new_arr = realloc(pat->content.Set.elements, + (pat->content.Set.size + 1) * sizeof(char*)); + if(!new_arr) + return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); + + pat->content.Set.elements = new_arr; + } + else + pat->content.Set.elements = malloc(sizeof(char*)); + + if(!pat->content.Set.elements) + return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); + + pat->content.Set.elements[pat->content.Set.size] = + strdup(glob->glob_buffer); + if(!pat->content.Set.elements[pat->content.Set.size]) + return GLOBERROR("out of memory", 0, CURLE_OUT_OF_MEMORY); + ++pat->content.Set.size; + + if(*pattern == '}') { + pattern++; /* pass the closing brace */ + done = TRUE; + continue; + } + + buf = glob->glob_buffer; + ++pattern; + ++(*posp); + break; + + case ']': /* illegal closing bracket */ + return GLOBERROR("unexpected close bracket", *posp, CURLE_URL_MALFORMAT); + + case '\\': /* escaped character, skip '\' */ + if(pattern[1]) { + ++pattern; + ++(*posp); + } + /* intentional fallthrough */ + default: + *buf++ = *pattern++; /* copy character to set element */ + ++(*posp); + } + } + + *patternp = pattern; /* return with the new position */ + return CURLE_OK; +} + +static CURLcode glob_range(URLGlob *glob, char **patternp, + size_t *posp, unsigned long *amount, + int globindex) +{ + /* processes a range expression with the point behind the opening '[' + - char range: e.g. "a-z]", "B-Q]" + - num range: e.g. "0-9]", "17-2000]" + - num range with leading zeros: e.g. "001-999]" + expression is checked for well-formedness and collected until the next ']' + */ + URLPattern *pat; + int rc; + char *pattern = *patternp; + char *c; + + pat = &glob->pattern[glob->size]; + pat->globindex = globindex; + + if(ISALPHA(*pattern)) { + /* character range detected */ + char min_c; + char max_c; + int step=1; + + pat->type = UPTCharRange; + + rc = sscanf(pattern, "%c-%c", &min_c, &max_c); + + if((rc == 2) && (pattern[3] == ':')) { + char *endp; + unsigned long lstep; + errno = 0; + lstep = strtoul(&pattern[4], &endp, 10); + if(errno || (*endp != ']')) + step = -1; + else { + pattern = endp+1; + step = (int)lstep; + if(step > (max_c - min_c)) + step = -1; + } + } + else + pattern += 4; + + *posp += (pattern - *patternp); + + if((rc != 2) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a')) || + (step <= 0) ) + /* the pattern is not well-formed */ + return GLOBERROR("bad range", *posp, CURLE_URL_MALFORMAT); + + /* if there was a ":[num]" thing, use that as step or else use 1 */ + pat->content.CharRange.step = step; + pat->content.CharRange.ptr_c = pat->content.CharRange.min_c = min_c; + pat->content.CharRange.max_c = max_c; + + if(multiply(amount, (pat->content.CharRange.max_c - + pat->content.CharRange.min_c) / + pat->content.CharRange.step + 1) ) + return GLOBERROR("range overflow", *posp, CURLE_URL_MALFORMAT); + } + else if(ISDIGIT(*pattern)) { + /* numeric range detected */ + unsigned long min_n; + unsigned long max_n = 0; + unsigned long step_n = 0; + char *endp; + + pat->type = UPTNumRange; + pat->content.NumRange.padlength = 0; + + if(*pattern == '0') { + /* leading zero specified, count them! */ + c = pattern; + while(ISDIGIT(*c)) { + c++; + ++pat->content.NumRange.padlength; /* padding length is set for all + instances of this pattern */ + } + } + + errno = 0; + min_n = strtoul(pattern, &endp, 10); + if(errno || (endp == pattern)) + endp=NULL; + else { + if(*endp != '-') + endp = NULL; + else { + pattern = endp+1; + errno = 0; + max_n = strtoul(pattern, &endp, 10); + if(errno || (*endp == ':')) { + pattern = endp+1; + errno = 0; + step_n = strtoul(pattern, &endp, 10); + if(errno) + /* over/underflow situation */ + endp = NULL; + } + else + step_n = 1; + if(endp && (*endp == ']')) { + pattern= endp+1; + } + else + endp = NULL; + } + } + + *posp += (pattern - *patternp); + + if(!endp || (min_n > max_n) || (step_n > (max_n - min_n)) || + (step_n <= 0) ) + /* the pattern is not well-formed */ + return GLOBERROR("bad range", *posp, CURLE_URL_MALFORMAT); + + /* typecasting to ints are fine here since we make sure above that we + are within 31 bits */ + pat->content.NumRange.ptr_n = pat->content.NumRange.min_n = min_n; + pat->content.NumRange.max_n = max_n; + pat->content.NumRange.step = step_n; + + if(multiply(amount, (pat->content.NumRange.max_n - + pat->content.NumRange.min_n) / + pat->content.NumRange.step + 1) ) + return GLOBERROR("range overflow", *posp, CURLE_URL_MALFORMAT); + } + else + return GLOBERROR("bad range specification", *posp, CURLE_URL_MALFORMAT); + + *patternp = pattern; + return CURLE_OK; +} + +static bool peek_ipv6(const char *str, size_t *skip) +{ + /* + * Scan for a potential IPv6 literal. + * - Valid globs contain a hyphen and <= 1 colon. + * - IPv6 literals contain no hyphens and >= 2 colons. + */ + size_t i = 0; + size_t colons = 0; + if(str[i++] != '[') { + return FALSE; + } + for(;;) { + const char c = str[i++]; + if(ISALNUM(c) || c == '.' || c == '%') { + /* ok */ + } + else if(c == ':') { + colons++; + } + else if(c == ']') { + *skip = i; + return colons >= 2 ? TRUE : FALSE; + } + else { + return FALSE; + } + } +} + +static CURLcode glob_parse(URLGlob *glob, char *pattern, + size_t pos, unsigned long *amount) +{ + /* processes a literal string component of a URL + special characters '{' and '[' branch to set/range processing functions + */ + CURLcode res = CURLE_OK; + int globindex = 0; /* count "actual" globs */ + + *amount = 1; + + while(*pattern && !res) { + char *buf = glob->glob_buffer; + size_t sublen = 0; + while(*pattern && *pattern != '{') { + if(*pattern == '[') { + /* Skip over potential IPv6 literals. */ + size_t skip; + if(peek_ipv6(pattern, &skip)) { + memcpy(buf, pattern, skip); + buf += skip; + pattern += skip; + sublen += skip; + continue; + } + break; + } + if(*pattern == '}' || *pattern == ']') + return GLOBERROR("unmatched close brace/bracket", pos, + CURLE_URL_MALFORMAT); + + /* only allow \ to escape known "special letters" */ + if(*pattern == '\\' && + (*(pattern+1) == '{' || *(pattern+1) == '[' || + *(pattern+1) == '}' || *(pattern+1) == ']') ) { + + /* escape character, skip '\' */ + ++pattern; + ++pos; + } + *buf++ = *pattern++; /* copy character to literal */ + ++pos; + sublen++; + } + if(sublen) { + /* we got a literal string, add it as a single-item list */ + *buf = '\0'; + res = glob_fixed(glob, glob->glob_buffer, sublen); + } + else { + switch (*pattern) { + case '\0': /* done */ + break; + + case '{': + /* process set pattern */ + pattern++; + pos++; + res = glob_set(glob, &pattern, &pos, amount, globindex++); + break; + + case '[': + /* process range pattern */ + pattern++; + pos++; + res = glob_range(glob, &pattern, &pos, amount, globindex++); + break; + } + } + + if(++glob->size > GLOB_PATTERN_NUM) + return GLOBERROR("too many globs", pos, CURLE_URL_MALFORMAT); + } + return res; +} + +CURLcode glob_url(URLGlob** glob, char* url, unsigned long *urlnum, + FILE *error) +{ + /* + * We can deal with any-size, just make a buffer with the same length + * as the specified URL! + */ + URLGlob *glob_expand; + unsigned long amount = 0; + char *glob_buffer; + CURLcode res; + + *glob = NULL; + + glob_buffer = malloc(strlen(url) + 1); + if(!glob_buffer) + return CURLE_OUT_OF_MEMORY; + + glob_expand = calloc(1, sizeof(URLGlob)); + if(!glob_expand) { + Curl_safefree(glob_buffer); + return CURLE_OUT_OF_MEMORY; + } + glob_expand->urllen = strlen(url); + glob_expand->glob_buffer = glob_buffer; + + res = glob_parse(glob_expand, url, 1, &amount); + if(!res) + *urlnum = amount; + else { + if(error && glob_expand->error) { + char text[128]; + const char *t; + if(glob_expand->pos) { + snprintf(text, sizeof(text), "%s in column %zu", glob_expand->error, + glob_expand->pos); + t = text; + } + else + t = glob_expand->error; + + /* send error description to the error-stream */ + fprintf(error, "curl: (%d) [globbing] %s\n", res, t); + } + /* it failed, we cleanup */ + glob_cleanup(glob_expand); + *urlnum = 1; + return res; + } + + *glob = glob_expand; + return CURLE_OK; +} + +void glob_cleanup(URLGlob* glob) +{ + size_t i; + int elem; + + for(i = 0; i < glob->size; i++) { + if((glob->pattern[i].type == UPTSet) && + (glob->pattern[i].content.Set.elements)) { + for(elem = glob->pattern[i].content.Set.size - 1; + elem >= 0; + --elem) { + Curl_safefree(glob->pattern[i].content.Set.elements[elem]); + } + Curl_safefree(glob->pattern[i].content.Set.elements); + } + } + Curl_safefree(glob->glob_buffer); + Curl_safefree(glob); +} + +CURLcode glob_next_url(char **globbed, URLGlob *glob) +{ + URLPattern *pat; + size_t i; + size_t len; + size_t buflen = glob->urllen + 1; + char *buf = glob->glob_buffer; + + *globbed = NULL; + + if(!glob->beenhere) + glob->beenhere = 1; + else { + bool carry = TRUE; + + /* implement a counter over the index ranges of all patterns, starting + with the rightmost pattern */ + for(i = 0; carry && (i < glob->size); i++) { + carry = FALSE; + pat = &glob->pattern[glob->size - 1 - i]; + switch (pat->type) { + case UPTSet: + if((pat->content.Set.elements) && + (++pat->content.Set.ptr_s == pat->content.Set.size)) { + pat->content.Set.ptr_s = 0; + carry = TRUE; + } + break; + case UPTCharRange: + pat->content.CharRange.ptr_c = + (char)(pat->content.CharRange.step + + (int)((unsigned char)pat->content.CharRange.ptr_c)); + if(pat->content.CharRange.ptr_c > pat->content.CharRange.max_c) { + pat->content.CharRange.ptr_c = pat->content.CharRange.min_c; + carry = TRUE; + } + break; + case UPTNumRange: + pat->content.NumRange.ptr_n += pat->content.NumRange.step; + if(pat->content.NumRange.ptr_n > pat->content.NumRange.max_n) { + pat->content.NumRange.ptr_n = pat->content.NumRange.min_n; + carry = TRUE; + } + break; + default: + printf("internal error: invalid pattern type (%d)\n", (int)pat->type); + return CURLE_FAILED_INIT; + } + } + if(carry) { /* first pattern ptr has run into overflow, done! */ + /* TODO: verify if this should actally return CURLE_OK. */ + return CURLE_OK; /* CURLE_OK to match previous behavior */ + } + } + + for(i = 0; i < glob->size; ++i) { + pat = &glob->pattern[i]; + switch(pat->type) { + case UPTSet: + if(pat->content.Set.elements) { + len = strlen(pat->content.Set.elements[pat->content.Set.ptr_s]); + snprintf(buf, buflen, "%s", + pat->content.Set.elements[pat->content.Set.ptr_s]); + buf += len; + buflen -= len; + } + break; + case UPTCharRange: + *buf++ = pat->content.CharRange.ptr_c; + break; + case UPTNumRange: + len = snprintf(buf, buflen, "%0*ld", + pat->content.NumRange.padlength, + pat->content.NumRange.ptr_n); + buf += len; + buflen -= len; + break; + default: + printf("internal error: invalid pattern type (%d)\n", (int)pat->type); + return CURLE_FAILED_INIT; + } + } + *buf = '\0'; + + *globbed = strdup(glob->glob_buffer); + if(!*globbed) + return CURLE_OUT_OF_MEMORY; + + return CURLE_OK; +} + +CURLcode glob_match_url(char **result, char *filename, URLGlob *glob) +{ + char *target; + size_t allocsize; + char numbuf[18]; + char *appendthis = NULL; + size_t appendlen = 0; + size_t stringlen = 0; + + *result = NULL; + + /* We cannot use the glob_buffer for storage here since the filename may + * be longer than the URL we use. We allocate a good start size, then + * we need to realloc in case of need. + */ + allocsize = strlen(filename) + 1; /* make it at least one byte to store the + trailing zero */ + target = malloc(allocsize); + if(!target) + return CURLE_OUT_OF_MEMORY; + + while(*filename) { + if(*filename == '#' && ISDIGIT(filename[1])) { + unsigned long i; + char *ptr = filename; + unsigned long num = strtoul(&filename[1], &filename, 10); + URLPattern *pat =NULL; + + if(num < glob->size) { + num--; /* make it zero based */ + /* find the correct glob entry */ + for(i=0; i<glob->size; i++) { + if(glob->pattern[i].globindex == (int)num) { + pat = &glob->pattern[i]; + break; + } + } + } + + if(pat) { + switch (pat->type) { + case UPTSet: + if(pat->content.Set.elements) { + appendthis = pat->content.Set.elements[pat->content.Set.ptr_s]; + appendlen = + strlen(pat->content.Set.elements[pat->content.Set.ptr_s]); + } + break; + case UPTCharRange: + numbuf[0] = pat->content.CharRange.ptr_c; + numbuf[1] = 0; + appendthis = numbuf; + appendlen = 1; + break; + case UPTNumRange: + snprintf(numbuf, sizeof(numbuf), "%0*d", + pat->content.NumRange.padlength, + pat->content.NumRange.ptr_n); + appendthis = numbuf; + appendlen = strlen(numbuf); + break; + default: + fprintf(stderr, "internal error: invalid pattern type (%d)\n", + (int)pat->type); + Curl_safefree(target); + return CURLE_FAILED_INIT; + } + } + else { + /* #[num] out of range, use the #[num] in the output */ + filename = ptr; + appendthis = filename++; + appendlen = 1; + } + } + else { + appendthis = filename++; + appendlen = 1; + } + if(appendlen + stringlen >= allocsize) { + char *newstr; + /* we append a single byte to allow for the trailing byte to be appended + at the end of this function outside the while() loop */ + allocsize = (appendlen + stringlen) * 2; + newstr = realloc(target, allocsize + 1); + if(!newstr) { + Curl_safefree(target); + return CURLE_OUT_OF_MEMORY; + } + target = newstr; + } + memcpy(&target[stringlen], appendthis, appendlen); + stringlen += appendlen; + } + target[stringlen]= '\0'; + *result = target; + return CURLE_OK; +} diff --git a/src/urlglob.h b/src/tool_urlglob.h index a5b789e..62c1abd 100644 --- a/src/urlglob.h +++ b/src/tool_urlglob.h @@ -1,5 +1,5 @@ -#ifndef __URLGLOB_H -#define __URLGLOB_H +#ifndef HEADER_CURL_TOOL_URLGLOB_H +#define HEADER_CURL_TOOL_URLGLOB_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,47 +21,57 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" + typedef enum { - UPTSet=1, + UPTSet = 1, UPTCharRange, UPTNumRange } URLPatternType; typedef struct { URLPatternType type; + int globindex; /* the number of this particular glob or -1 if not used + within {} or [] */ union { struct { char **elements; - short size; - short ptr_s; + int size; + int ptr_s; } Set; struct { - char min_c, max_c; + char min_c; + char max_c; char ptr_c; int step; } CharRange; struct { - int min_n, max_n; - short padlength; - int ptr_n; - int step; - } NumRange ; + unsigned long min_n; + unsigned long max_n; + int padlength; + unsigned long ptr_n; + unsigned long step; + } NumRange; } content; } URLPattern; +/* the total number of globs supported */ +#define GLOB_PATTERN_NUM 100 + typedef struct { - char* literal[10]; - URLPattern pattern[9]; + URLPattern pattern[GLOB_PATTERN_NUM]; size_t size; size_t urllen; char *glob_buffer; char beenhere; - char errormsg[80]; /* error message buffer */ + const char *error; /* error message */ + size_t pos; /* column position of error or 0 */ } URLGlob; -int glob_url(URLGlob**, char*, int *, FILE *); -char* glob_next_url(URLGlob*); -char* glob_match_url(char*, URLGlob *); +CURLcode glob_url(URLGlob**, char*, unsigned long *, FILE *); +CURLcode glob_next_url(char **, URLGlob *); +CURLcode glob_match_url(char **, char*, URLGlob *); void glob_cleanup(URLGlob* glob); -#endif +#endif /* HEADER_CURL_TOOL_URLGLOB_H */ + diff --git a/src/curlutil.c b/src/tool_util.c index bca2db7..6c26414 100644 --- a/src/curlutil.c +++ b/src/tool_util.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,30 +19,40 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" -#include "setup.h" +#include "tool_util.h" -#include "curlutil.h" +#include "memdebug.h" /* keep this as LAST include */ #if defined(WIN32) && !defined(MSDOS) -struct timeval cutil_tvnow(void) +struct timeval tool_tvnow(void) { /* ** GetTickCount() is available on _all_ Windows versions from W95 up ** to nowadays. Returns milliseconds elapsed since last system boot, ** increases monotonically and wraps once 49.7 days have elapsed. + ** + ** GetTickCount64() is available on Windows version from Windows Vista + ** and Windows Server 2008 up to nowadays. The resolution of the + ** function is limited to the resolution of the system timer, which + ** is typically in the range of 10 milliseconds to 16 milliseconds. */ struct timeval now; +#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) + ULONGLONG milliseconds = GetTickCount64(); +#else DWORD milliseconds = GetTickCount(); - now.tv_sec = milliseconds / 1000; +#endif + now.tv_sec = (long)(milliseconds / 1000); now.tv_usec = (milliseconds % 1000) * 1000; return now; } #elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) -struct timeval cutil_tvnow(void) +struct timeval tool_tvnow(void) { /* ** clock_gettime() is granted to be increased monotonically when the @@ -76,7 +86,7 @@ struct timeval cutil_tvnow(void) #elif defined(HAVE_GETTIMEOFDAY) -struct timeval cutil_tvnow(void) +struct timeval tool_tvnow(void) { /* ** gettimeofday() is not granted to be increased monotonically, due to @@ -90,7 +100,7 @@ struct timeval cutil_tvnow(void) #else -struct timeval cutil_tvnow(void) +struct timeval tool_tvnow(void) { /* ** time() returns the value of time in seconds since the Epoch. @@ -109,25 +119,28 @@ struct timeval cutil_tvnow(void) * * Returns: the time difference in number of milliseconds. */ -long cutil_tvdiff(struct timeval newer, struct timeval older) +long tool_tvdiff(struct timeval newer, struct timeval older) { return (newer.tv_sec-older.tv_sec)*1000+ (newer.tv_usec-older.tv_usec)/1000; } /* - * Same as cutil_tvdiff but with full usec resolution. + * Same as tool_tvdiff but with full usec resolution. * * Returns: the time difference in seconds with subsecond resolution. */ -double cutil_tvdiff_secs(struct timeval newer, struct timeval older) +double tool_tvdiff_secs(struct timeval newer, struct timeval older) { - return (double)(newer.tv_sec-older.tv_sec)+ - (double)(newer.tv_usec-older.tv_usec)/1000000.0; + if(newer.tv_sec != older.tv_sec) + return (double)(newer.tv_sec-older.tv_sec)+ + (double)(newer.tv_usec-older.tv_usec)/1000000.0; + else + return (double)(newer.tv_usec-older.tv_usec)/1000000.0; } /* return the number of seconds in the given input timeval struct */ -long cutil_tvlong(struct timeval t1) +long tool_tvlong(struct timeval t1) { return t1.tv_sec; } diff --git a/src/curlutil.h b/src/tool_util.h index a993a77..d8bb036 100644 --- a/src/curlutil.h +++ b/src/tool_util.h @@ -1,5 +1,5 @@ -#ifndef __CURL_SRC_UTIL_H -#define __CURL_SRC_UTIL_H +#ifndef HEADER_CURL_TOOL_UTIL_H +#define HEADER_CURL_TOOL_UTIL_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,11 +21,9 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" -#include "setup.h" - - -struct timeval cutil_tvnow(void); +struct timeval tool_tvnow(void); /* * Make sure that the first argument (t1) is the more recent time and t2 is @@ -33,17 +31,26 @@ struct timeval cutil_tvnow(void); * * Returns: the time difference in number of milliseconds. */ -long cutil_tvdiff(struct timeval t1, struct timeval t2); +long tool_tvdiff(struct timeval t1, struct timeval t2); /* - * Same as cutil_tvdiff but with full usec resolution. + * Same as tool_tvdiff but with full usec resolution. * * Returns: the time difference in seconds with subsecond resolution. */ -double cutil_tvdiff_secs(struct timeval t1, struct timeval t2); +double tool_tvdiff_secs(struct timeval t1, struct timeval t2); + +long tool_tvlong(struct timeval t1); -long cutil_tvlong(struct timeval t1); +#undef tvnow +#undef tvdiff +#undef tvdiff_secs +#undef tvlong +#define tvnow() tool_tvnow() +#define tvdiff(a,b) tool_tvdiff((a), (b)) +#define tvdiff_secs(a,b) tool_tvdiff_secs((a), (b)) +#define tvlong(a) tool_tvlong((a)) -#endif /* __CURL_SRC_UTIL_H */ +#endif /* HEADER_CURL_TOOL_UTIL_H */ diff --git a/src/version.h b/src/tool_version.h index 676102f..569526b 100644 --- a/src/version.h +++ b/src/tool_version.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_VERSION_H -#define HEADER_CURL_VERSION_H +#ifndef HEADER_CURL_TOOL_VERSION_H +#define HEADER_CURL_TOOL_VERSION_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,15 +21,14 @@ * KIND, either express or implied. * ***************************************************************************/ - #include <curl/curlver.h> #define CURL_NAME "curl" #define CURL_COPYRIGHT LIBCURL_COPYRIGHT -#define CURL_VERSION "7.21.2" +#define CURL_VERSION LIBCURL_VERSION #define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR #define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR #define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH #define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") " -#endif /* HEADER_CURL_VERSION_H */ +#endif /* HEADER_CURL_TOOL_VERSION_H */ diff --git a/src/os-specific.c b/src/tool_vms.c index ac07c4c..4a6a6f5 100644 --- a/src/os-specific.c +++ b/src/tool_vms.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,22 +19,22 @@ * KIND, either express or implied. * ***************************************************************************/ -#include "setup.h" +#include "tool_setup.h" -#include <curl/curl.h> - -#define ENABLE_CURLX_PRINTF -#include "curlx.h" - -#include "os-specific.h" +#ifdef __VMS -#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) -# include "memdebug.h" +#if defined(__DECC) && !defined(__VAX) && \ + defined(__CRTL_VER) && (__CRTL_VER >= 70301000) +#include <unixlib.h> #endif -#ifdef __VMS +#define ENABLE_CURLX_PRINTF +#include "curlx.h" #include "curlmsg_vms.h" +#include "tool_vms.h" + +#include "memdebug.h" /* keep this as LAST include */ void decc$__posix_exit(int __status); void decc$exit(int __status); @@ -121,8 +121,6 @@ void vms_special_exit(int code, int vms_show) * requiring the user to define the corresponding logical names. */ -#include <unixlib.h> - /* Structure to hold a DECC$* feature name and its desired value. */ typedef struct { char *name; diff --git a/src/os-specific.h b/src/tool_vms.h index 93cac74..1afd75e 100644 --- a/src/os-specific.h +++ b/src/tool_vms.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_OS_SPECIFIC_H -#define HEADER_CURL_OS_SPECIFIC_H +#ifndef HEADER_CURL_TOOL_VMS_H +#define HEADER_CURL_TOOL_VMS_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -21,9 +21,17 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" #ifdef __VMS +/* + * Forward-declaration of global variable vms_show defined + * in tool_main.c, used in main() as parameter for function + * vms_special_exit() to allow proper curl tool exiting. + */ +extern int vms_show; + int is_vms_shell(void); void vms_special_exit(int code, int vms_show); @@ -35,4 +43,5 @@ void vms_special_exit(int code, int vms_show); #endif /* __VMS */ -#endif /* HEADER_CURL_OS_SPECIFIC_H */ +#endif /* HEADER_CURL_TOOL_VMS_H */ + diff --git a/src/writeenv.c b/src/tool_writeenv.c index 18e1a06..b28f35a 100644 --- a/src/writeenv.c +++ b/src/tool_writeenv.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,24 +19,17 @@ * KIND, either express or implied. * ***************************************************************************/ - -#include "setup.h" +#include "tool_setup.h" #ifdef USE_ENVIRONMENT -#include <curl/curl.h> -#include "writeenv.h" - #ifdef __riscos__ -#include <kernel.h> +# include <kernel.h> #endif -#define _MPRINTF_REPLACE /* use our functions only */ #include <curl/mprintf.h> - -#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) -#include "memdebug.h" -#endif +#include "tool_writeenv.h" +#include "memdebug.h" /* keep this as LAST include */ static const struct { @@ -84,17 +77,17 @@ void ourWriteEnv(CURL *curl) long longinfo; double doubleinfo; - for (i=0; variables[i].name; i++) { + for(i=0; variables[i].name; i++) { switch (variables[i].type) { case writeenv_STRING: - if (curl_easy_getinfo(curl, variables[i].id, &string) == CURLE_OK) + if(curl_easy_getinfo(curl, variables[i].id, &string) == CURLE_OK) internalSetEnv(variables[i].name, string); else internalSetEnv(variables[i].name, NULL); break; case writeenv_LONG: - if (curl_easy_getinfo(curl, variables[i].id, &longinfo) == CURLE_OK) { + if(curl_easy_getinfo(curl, variables[i].id, &longinfo) == CURLE_OK) { curl_msprintf(numtext, "%5ld", longinfo); internalSetEnv(variables[i].name, numtext); } @@ -102,7 +95,7 @@ void ourWriteEnv(CURL *curl) internalSetEnv(variables[i].name, NULL); break; case writeenv_DOUBLE: - if (curl_easy_getinfo(curl, variables[i].id, &doubleinfo) == CURLE_OK) { + if(curl_easy_getinfo(curl, variables[i].id, &doubleinfo) == CURLE_OK) { curl_msprintf(numtext, "%6.2f", doubleinfo); internalSetEnv(variables[i].name, numtext); } diff --git a/src/tool_writeenv.h b/src/tool_writeenv.h new file mode 100644 index 0000000..c0a952f --- /dev/null +++ b/src/tool_writeenv.h @@ -0,0 +1,35 @@ +#ifndef HEADER_CURL_TOOL_WRITEENV_H +#define HEADER_CURL_TOOL_WRITEENV_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef USE_ENVIRONMENT + +void ourWriteEnv(CURL *curl); + +#else +# define ourWriteEnv(x) Curl_nop_stmt +#endif + +#endif /* HEADER_CURL_TOOL_WRITEENV_H */ + diff --git a/src/writeout.c b/src/tool_writeout.c index b8801a4..63db90c 100644 --- a/src/writeout.c +++ b/src/tool_writeout.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,25 +19,14 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "tool_setup.h" +#define ENABLE_CURLX_PRINTF +/* use our own printf() functions */ +#include "curlx.h" +#include "tool_cfgable.h" +#include "tool_writeout.h" -#include "setup.h" - -#include <stdio.h> -#include <string.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_SELECT_H -#include <sys/select.h> -#endif - -#include <curl/curl.h> - -#define _MPRINTF_REPLACE /* we want curl-functions instead of native ones */ -#include <curl/mprintf.h> - -#include "writeout.h" +#include "memdebug.h" /* keep this as LAST include */ typedef enum { VAR_NONE, /* must be the first */ @@ -63,6 +52,11 @@ typedef enum { VAR_FTP_ENTRY_PATH, VAR_REDIRECT_URL, VAR_SSL_VERIFY_RESULT, + VAR_EFFECTIVE_FILENAME, + VAR_PRIMARY_IP, + VAR_PRIMARY_PORT, + VAR_LOCAL_IP, + VAR_LOCAL_PORT, VAR_NUM_OF_VARS /* must be the last */ } replaceid; @@ -96,14 +90,19 @@ static const struct variable replacements[]={ {"ftp_entry_path", VAR_FTP_ENTRY_PATH}, {"redirect_url", VAR_REDIRECT_URL}, {"ssl_verify_result", VAR_SSL_VERIFY_RESULT}, + {"filename_effective", VAR_EFFECTIVE_FILENAME}, + {"remote_ip", VAR_PRIMARY_IP}, + {"remote_port", VAR_PRIMARY_PORT}, + {"local_ip", VAR_LOCAL_IP}, + {"local_port", VAR_LOCAL_PORT}, {NULL, VAR_NONE} }; -void ourWriteOut(CURL *curl, const char *writeinfo) +void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo) { FILE *stream = stdout; - const char *ptr=writeinfo; - char *stringp; + const char *ptr = writeinfo; + char *stringp = NULL; long longinfo; double doubleinfo; @@ -112,7 +111,7 @@ void ourWriteOut(CURL *curl, const char *writeinfo) if('%' == ptr[1]) { /* an escaped %-letter */ fputc('%', stream); - ptr+=2; + ptr += 2; } else { /* this is meant as a variable to output */ @@ -121,10 +120,10 @@ void ourWriteOut(CURL *curl, const char *writeinfo) int i; if(('{' == ptr[1]) && ((end = strchr(ptr, '}')) != NULL)) { bool match = FALSE; - ptr+=2; /* pass the % and the { */ - keepit=*end; - *end=0; /* zero terminate */ - for(i=0; replacements[i].name; i++) { + ptr += 2; /* pass the % and the { */ + keepit = *end; + *end = 0; /* zero terminate */ + for(i = 0; replacements[i].name; i++) { if(curl_strequal(ptr, replacements[i].name)) { match = TRUE; switch(replacements[i].id) { @@ -167,7 +166,8 @@ void ourWriteOut(CURL *curl, const char *writeinfo) break; case VAR_REDIRECT_TIME: if(CURLE_OK == - curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, &doubleinfo)) + curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, + &doubleinfo)) fprintf(stream, "%.3f", doubleinfo); break; case VAR_TOTAL_TIME: @@ -211,12 +211,14 @@ void ourWriteOut(CURL *curl, const char *writeinfo) break; case VAR_SIZE_DOWNLOAD: if(CURLE_OK == - curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &doubleinfo)) + curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, + &doubleinfo)) fprintf(stream, "%.0f", doubleinfo); break; case VAR_SPEED_DOWNLOAD: if(CURLE_OK == - curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &doubleinfo)) + curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, + &doubleinfo)) fprintf(stream, "%.3f", doubleinfo); break; case VAR_SPEED_UPLOAD: @@ -244,7 +246,36 @@ void ourWriteOut(CURL *curl, const char *writeinfo) break; case VAR_SSL_VERIFY_RESULT: if(CURLE_OK == - curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT, &longinfo)) + curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT, + &longinfo)) + fprintf(stream, "%ld", longinfo); + break; + case VAR_EFFECTIVE_FILENAME: + if(outs->filename) + fprintf(stream, "%s", outs->filename); + break; + case VAR_PRIMARY_IP: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, + &stringp)) + fprintf(stream, "%s", stringp); + break; + case VAR_PRIMARY_PORT: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, + &longinfo)) + fprintf(stream, "%ld", longinfo); + break; + case VAR_LOCAL_IP: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_LOCAL_IP, + &stringp)) + fprintf(stream, "%s", stringp); + break; + case VAR_LOCAL_PORT: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, + &longinfo)) fprintf(stream, "%ld", longinfo); break; default: @@ -253,17 +284,17 @@ void ourWriteOut(CURL *curl, const char *writeinfo) break; } } - if(FALSE == match) { + if(!match) { fprintf(stderr, "curl: unknown --write-out variable: '%s'\n", ptr); } - ptr=end+1; /* pass the end */ + ptr = end + 1; /* pass the end */ *end = keepit; } else { /* illegal syntax, then just output the characters that are used */ fputc('%', stream); fputc(ptr[1], stream); - ptr+=2; + ptr += 2; } } } @@ -284,7 +315,7 @@ void ourWriteOut(CURL *curl, const char *writeinfo) fputc(ptr[1], stream); break; } - ptr+=2; + ptr += 2; } else { fputc(*ptr, stream); diff --git a/src/tool_writeout.h b/src/tool_writeout.h new file mode 100644 index 0000000..4dd3a75 --- /dev/null +++ b/src/tool_writeout.h @@ -0,0 +1,28 @@ +#ifndef HEADER_CURL_TOOL_WRITEOUT_H +#define HEADER_CURL_TOOL_WRITEOUT_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo); + +#endif /* HEADER_CURL_TOOL_WRITEOUT_H */ diff --git a/src/tool_xattr.c b/src/tool_xattr.c new file mode 100644 index 0000000..da0cad6 --- /dev/null +++ b/src/tool_xattr.c @@ -0,0 +1,90 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +#ifdef HAVE_FSETXATTR +# include <sys/xattr.h> /* header from libc, not from libattr */ +# define USE_XATTR +#elif defined(__FreeBSD_version) && (__FreeBSD_version > 500000) +# include <sys/types.h> +# include <sys/extattr.h> +# define USE_XATTR +#endif + +#include "tool_xattr.h" + +#include "memdebug.h" /* keep this as LAST include */ + +#ifdef USE_XATTR + +/* mapping table of curl metadata to extended attribute names */ +static const struct xattr_mapping { + const char *attr; /* name of the xattr */ + CURLINFO info; +} mappings[] = { + /* mappings proposed by + * http://freedesktop.org/wiki/CommonExtendedAttributes + */ + { "user.xdg.origin.url", CURLINFO_EFFECTIVE_URL }, + { "user.mime_type", CURLINFO_CONTENT_TYPE }, + { NULL, CURLINFO_NONE } /* last element, abort loop here */ +}; + +/* store metadata from the curl request alongside the downloaded + * file using extended attributes + */ +int fwrite_xattr(CURL *curl, int fd) +{ + int i = 0; + int err = 0; + + /* loop through all xattr-curlinfo pairs and abort on a set error */ + while(err == 0 && mappings[i].attr != NULL) { + char *value = NULL; + CURLcode result = curl_easy_getinfo(curl, mappings[i].info, &value); + if(!result && value) { +#ifdef HAVE_FSETXATTR_6 + err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0, 0); +#elif defined(HAVE_FSETXATTR_5) + err = fsetxattr(fd, mappings[i].attr, value, strlen(value), 0); +#elif defined(__FreeBSD_version) + err = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, mappings[i].attr, value, + strlen(value)); + /* FreeBSD's extattr_set_fd returns the length of the extended attribute + */ + err = err < 0 ? err : 0; +#endif + } + i++; + } + + return err; +} +#else +int fwrite_xattr(CURL *curl, int fd) +{ + (void)curl; + (void)fd; + + return 0; +} +#endif diff --git a/src/tool_xattr.h b/src/tool_xattr.h new file mode 100644 index 0000000..3f8f585 --- /dev/null +++ b/src/tool_xattr.h @@ -0,0 +1,28 @@ +#ifndef HEADER_CURL_TOOL_XATTR_H +#define HEADER_CURL_TOOL_XATTR_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "tool_setup.h" + +int fwrite_xattr(CURL *curl, int fd); + +#endif /* HEADER_CURL_TOOL_XATTR_H */ diff --git a/src/urlglob.c b/src/urlglob.c deleted file mode 100644 index 590c37a..0000000 --- a/src/urlglob.c +++ /dev/null @@ -1,549 +0,0 @@ -/*************************************************************************** - * _ _ ____ _ - * Project ___| | | | _ \| | - * / __| | | | |_) | | - * | (__| |_| | _ <| |___ - * \___|\___/|_| \_\_____| - * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. - * - * This software is licensed as described in the file COPYING, which - * you should have received as part of this distribution. The terms - * are also available at http://curl.haxx.se/docs/copyright.html. - * - * You may opt to use, copy, modify, merge, publish, distribute and/or sell - * copies of the Software, and permit persons to whom the Software is - * furnished to do so, under the terms of the COPYING file. - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY - * KIND, either express or implied. - * - ***************************************************************************/ - -/* client-local setup.h */ -#include "setup.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <curl/curl.h> - -#define _MPRINTF_REPLACE /* we want curl-functions instead of native ones */ -#include <curl/mprintf.h> - -#include "urlglob.h" -#include "os-specific.h" - -#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) -#include "memdebug.h" -#endif - -typedef enum { - GLOB_OK, - GLOB_ERROR -} GlobCode; - -/* - * glob_word() - * - * Input a full globbed string, set the forth argument to the amount of - * strings we get out of this. Return GlobCode. - */ -static GlobCode glob_word(URLGlob *, /* object anchor */ - char *, /* globbed string */ - size_t, /* position */ - int *); /* returned number of strings */ - -static GlobCode glob_set(URLGlob *glob, char *pattern, - size_t pos, int *amount) -{ - /* processes a set expression with the point behind the opening '{' - ','-separated elements are collected until the next closing '}' - */ - bool done = FALSE; - char* buf = glob->glob_buffer; - URLPattern *pat; - - pat = (URLPattern*)&glob->pattern[glob->size / 2]; - /* patterns 0,1,2,... correspond to size=1,3,5,... */ - pat->type = UPTSet; - pat->content.Set.size = 0; - pat->content.Set.ptr_s = 0; - /* FIXME: Here's a nasty zero size malloc */ - pat->content.Set.elements = (char**)malloc(0); - ++glob->size; - - while (!done) { - switch (*pattern) { - case '\0': /* URL ended while set was still open */ - snprintf(glob->errormsg, sizeof(glob->errormsg), - "unmatched brace at pos %zu\n", pos); - return GLOB_ERROR; - - case '{': - case '[': /* no nested expressions at this time */ - snprintf(glob->errormsg, sizeof(glob->errormsg), - "nested braces not supported at pos %zu\n", pos); - return GLOB_ERROR; - - case ',': - case '}': /* set element completed */ - *buf = '\0'; - pat->content.Set.elements = - realloc(pat->content.Set.elements, - (pat->content.Set.size + 1) * sizeof(char*)); - if (!pat->content.Set.elements) { - snprintf(glob->errormsg, sizeof(glob->errormsg), "out of memory"); - return GLOB_ERROR; - } - pat->content.Set.elements[pat->content.Set.size] = - strdup(glob->glob_buffer); - ++pat->content.Set.size; - - if (*pattern == '}') { - /* entire set pattern completed */ - int wordamount; - - /* always check for a literal (may be "") between patterns */ - if(GLOB_ERROR == glob_word(glob, ++pattern, ++pos, &wordamount)) - return GLOB_ERROR; - *amount = pat->content.Set.size * wordamount; - - done = TRUE; - continue; - } - - buf = glob->glob_buffer; - ++pattern; - ++pos; - break; - - case ']': /* illegal closing bracket */ - snprintf(glob->errormsg, sizeof(glob->errormsg), - "illegal pattern at pos %zu\n", pos); - return GLOB_ERROR; - - case '\\': /* escaped character, skip '\' */ - if(pattern[1]) { - ++pattern; - ++pos; - } - /* intentional fallthrough */ - default: - *buf++ = *pattern++; /* copy character to set element */ - ++pos; - } - } - return GLOB_OK; -} - -static GlobCode glob_range(URLGlob *glob, char *pattern, - size_t pos, int *amount) -{ - /* processes a range expression with the point behind the opening '[' - - char range: e.g. "a-z]", "B-Q]" - - num range: e.g. "0-9]", "17-2000]" - - num range with leading zeros: e.g. "001-999]" - expression is checked for well-formedness and collected until the next ']' - */ - URLPattern *pat; - char *c; - int wordamount=1; - char sep; - char sep2; - int step; - int rc; - - pat = (URLPattern*)&glob->pattern[glob->size / 2]; - /* patterns 0,1,2,... correspond to size=1,3,5,... */ - ++glob->size; - - if (ISALPHA(*pattern)) { /* character range detected */ - char min_c; - char max_c; - - pat->type = UPTCharRange; - rc = sscanf(pattern, "%c-%c%c%d%c", &min_c, &max_c, &sep, &step, &sep2); - if ((rc < 3) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a'))) { - /* the pattern is not well-formed */ - snprintf(glob->errormsg, sizeof(glob->errormsg), - "error: bad range specification after pos %zu\n", pos); - return GLOB_ERROR; - } - - /* check the (first) separating character */ - if((sep != ']') && (sep != ':')) { - snprintf(glob->errormsg, sizeof(glob->errormsg), - "error: unsupported character (%c) after range at pos %zu\n", - sep, pos); - return GLOB_ERROR; - } - - /* if there was a ":[num]" thing, use that as step or else use 1 */ - pat->content.CharRange.step = - ((sep == ':') && (rc == 5) && (sep2 == ']'))?step:1; - - pat->content.CharRange.ptr_c = pat->content.CharRange.min_c = min_c; - pat->content.CharRange.max_c = max_c; - } - else if (ISDIGIT(*pattern)) { /* numeric range detected */ - int min_n; - int max_n; - - pat->type = UPTNumRange; - pat->content.NumRange.padlength = 0; - - rc = sscanf(pattern, "%d-%d%c%d%c", &min_n, &max_n, &sep, &step, &sep2); - - if ((rc < 2) || (min_n > max_n)) { - /* the pattern is not well-formed */ - snprintf(glob->errormsg, sizeof(glob->errormsg), - "error: bad range specification after pos %zu\n", pos); - return GLOB_ERROR; - } - pat->content.NumRange.ptr_n = pat->content.NumRange.min_n = min_n; - pat->content.NumRange.max_n = max_n; - - /* if there was a ":[num]" thing, use that as step or else use 1 */ - pat->content.NumRange.step = - ((sep == ':') && (rc == 5) && (sep2 == ']'))?step:1; - - if (*pattern == '0') { /* leading zero specified */ - c = pattern; - while (ISDIGIT(*c)) { - c++; - ++pat->content.NumRange.padlength; /* padding length is set for all - instances of this pattern */ - } - } - - } - else { - snprintf(glob->errormsg, sizeof(glob->errormsg), - "illegal character in range specification at pos %zu\n", pos); - return GLOB_ERROR; - } - - c = (char*)strchr(pattern, ']'); /* continue after next ']' */ - if(c) - c++; - else { - snprintf(glob->errormsg, sizeof(glob->errormsg), "missing ']'"); - return GLOB_ERROR; /* missing ']' */ - } - - /* always check for a literal (may be "") between patterns */ - - if(GLOB_ERROR == glob_word(glob, c, pos + (c - pattern), &wordamount)) - wordamount = 1; - - if(pat->type == UPTCharRange) - *amount = (pat->content.CharRange.max_c - - pat->content.CharRange.min_c + 1) * - wordamount; - else - *amount = (pat->content.NumRange.max_n - - pat->content.NumRange.min_n + 1) * wordamount; - - return GLOB_OK; -} - -static GlobCode glob_word(URLGlob *glob, char *pattern, - size_t pos, int *amount) -{ - /* processes a literal string component of a URL - special characters '{' and '[' branch to set/range processing functions - */ - char* buf = glob->glob_buffer; - size_t litindex; - GlobCode res = GLOB_OK; - - *amount = 1; /* default is one single string */ - - while (*pattern != '\0' && *pattern != '{' && *pattern != '[') { - if (*pattern == '}' || *pattern == ']') { - snprintf(glob->errormsg, sizeof(glob->errormsg), - "unmatched close brace/bracket at pos %zu\n", pos); - return GLOB_ERROR; - } - - /* only allow \ to escape known "special letters" */ - if (*pattern == '\\' && - (*(pattern+1) == '{' || *(pattern+1) == '[' || - *(pattern+1) == '}' || *(pattern+1) == ']') ) { - - /* escape character, skip '\' */ - ++pattern; - ++pos; - } - *buf++ = *pattern++; /* copy character to literal */ - ++pos; - } - *buf = '\0'; - litindex = glob->size / 2; - /* literals 0,1,2,... correspond to size=0,2,4,... */ - glob->literal[litindex] = strdup(glob->glob_buffer); - if(!glob->literal[litindex]) - return GLOB_ERROR; - ++glob->size; - - switch (*pattern) { - case '\0': - break; /* singular URL processed */ - - case '{': - /* process set pattern */ - res = glob_set(glob, ++pattern, ++pos, amount); - break; - - case '[': - /* process range pattern */ - res= glob_range(glob, ++pattern, ++pos, amount); - break; - } - - if(GLOB_OK != res) - /* free that strdup'ed string again */ - free(glob->literal[litindex]); - - return res; /* something got wrong */ -} - -int glob_url(URLGlob** glob, char* url, int *urlnum, FILE *error) -{ - /* - * We can deal with any-size, just make a buffer with the same length - * as the specified URL! - */ - URLGlob *glob_expand; - int amount; - char *glob_buffer = malloc(strlen(url)+1); - - *glob = NULL; - if(NULL == glob_buffer) - return CURLE_OUT_OF_MEMORY; - - glob_expand = calloc(1, sizeof(URLGlob)); - if(NULL == glob_expand) { - free(glob_buffer); - return CURLE_OUT_OF_MEMORY; - } - glob_expand->size = 0; - glob_expand->urllen = strlen(url); - glob_expand->glob_buffer = glob_buffer; - glob_expand->beenhere=0; - if(GLOB_OK == glob_word(glob_expand, url, 1, &amount)) - *urlnum = amount; - else { - if(error && glob_expand->errormsg[0]) { - /* send error description to the error-stream */ - fprintf(error, "curl: (%d) [globbing] %s", - CURLE_URL_MALFORMAT, glob_expand->errormsg); - } - /* it failed, we cleanup */ - free(glob_buffer); - free(glob_expand); - glob_expand = NULL; - *urlnum = 1; - return CURLE_URL_MALFORMAT; - } - - *glob = glob_expand; - return CURLE_OK; -} - -void glob_cleanup(URLGlob* glob) -{ - size_t i; - int elem; - - for (i = glob->size - 1; i < glob->size; --i) { - if (!(i & 1)) { /* even indexes contain literals */ - free(glob->literal[i/2]); - } - else { /* odd indexes contain sets or ranges */ - if (glob->pattern[i/2].type == UPTSet) { - for (elem = glob->pattern[i/2].content.Set.size - 1; - elem >= 0; - --elem) { - free(glob->pattern[i/2].content.Set.elements[elem]); - } - free(glob->pattern[i/2].content.Set.elements); - } - } - } - free(glob->glob_buffer); - free(glob); -} - -char *glob_next_url(URLGlob *glob) -{ - char *buf = glob->glob_buffer; - URLPattern *pat; - char *lit; - size_t i; - size_t j; - size_t buflen = glob->urllen+1; - size_t len; - - if (!glob->beenhere) - glob->beenhere = 1; - else { - bool carry = TRUE; - - /* implement a counter over the index ranges of all patterns, - starting with the rightmost pattern */ - for (i = glob->size / 2 - 1; carry && i < glob->size; --i) { - carry = FALSE; - pat = &glob->pattern[i]; - switch (pat->type) { - case UPTSet: - if (++pat->content.Set.ptr_s == pat->content.Set.size) { - pat->content.Set.ptr_s = 0; - carry = TRUE; - } - break; - case UPTCharRange: - pat->content.CharRange.ptr_c = (char)(pat->content.CharRange.step + - (int)((unsigned char)pat->content.CharRange.ptr_c)); - if (pat->content.CharRange.ptr_c > pat->content.CharRange.max_c) { - pat->content.CharRange.ptr_c = pat->content.CharRange.min_c; - carry = TRUE; - } - break; - case UPTNumRange: - pat->content.NumRange.ptr_n += pat->content.NumRange.step; - if (pat->content.NumRange.ptr_n > pat->content.NumRange.max_n) { - pat->content.NumRange.ptr_n = pat->content.NumRange.min_n; - carry = TRUE; - } - break; - default: - printf("internal error: invalid pattern type (%d)\n", (int)pat->type); - exit (CURLE_FAILED_INIT); - } - } - if (carry) /* first pattern ptr has run into overflow, done! */ - return NULL; - } - - for (j = 0; j < glob->size; ++j) { - if (!(j&1)) { /* every other term (j even) is a literal */ - lit = glob->literal[j/2]; - len = snprintf(buf, buflen, "%s", lit); - buf += len; - buflen -= len; - } - else { /* the rest (i odd) are patterns */ - pat = &glob->pattern[j/2]; - switch(pat->type) { - case UPTSet: - len = strlen(pat->content.Set.elements[pat->content.Set.ptr_s]); - snprintf(buf, buflen, "%s", - pat->content.Set.elements[pat->content.Set.ptr_s]); - buf += len; - buflen -= len; - break; - case UPTCharRange: - *buf++ = pat->content.CharRange.ptr_c; - break; - case UPTNumRange: - len = snprintf(buf, buflen, "%0*d", - pat->content.NumRange.padlength, - pat->content.NumRange.ptr_n); - buf += len; - buflen -= len; - break; - default: - printf("internal error: invalid pattern type (%d)\n", (int)pat->type); - exit (CURLE_FAILED_INIT); - } - } - } - *buf = '\0'; - return strdup(glob->glob_buffer); -} - -char *glob_match_url(char *filename, URLGlob *glob) -{ - char *target; - size_t allocsize; - size_t stringlen=0; - char numbuf[18]; - char *appendthis = NULL; - size_t appendlen = 0; - - /* We cannot use the glob_buffer for storage here since the filename may - * be longer than the URL we use. We allocate a good start size, then - * we need to realloc in case of need. - */ - allocsize=strlen(filename)+1; /* make it at least one byte to store the - trailing zero */ - target = malloc(allocsize); - if(NULL == target) - return NULL; /* major failure */ - - while (*filename) { - if (*filename == '#' && ISDIGIT(filename[1])) { - unsigned long i; - char *ptr = filename; - unsigned long num = strtoul(&filename[1], &filename, 10); - i = num-1; - - if (num && (i <= glob->size / 2)) { - URLPattern pat = glob->pattern[i]; - switch (pat.type) { - case UPTSet: - appendthis = pat.content.Set.elements[pat.content.Set.ptr_s]; - appendlen = strlen(pat.content.Set.elements[pat.content.Set.ptr_s]); - break; - case UPTCharRange: - numbuf[0]=pat.content.CharRange.ptr_c; - numbuf[1]=0; - appendthis=numbuf; - appendlen=1; - break; - case UPTNumRange: - snprintf(numbuf, sizeof(numbuf), "%0*d", - pat.content.NumRange.padlength, - pat.content.NumRange.ptr_n); - appendthis = numbuf; - appendlen = strlen(numbuf); - break; - default: - printf("internal error: invalid pattern type (%d)\n", - (int)pat.type); - free(target); - return NULL; - } - } - else { - /* #[num] out of range, use the #[num] in the output */ - filename = ptr; - appendthis=filename++; - appendlen=1; - } - } - else { - appendthis=filename++; - appendlen=1; - } - if(appendlen + stringlen >= allocsize) { - char *newstr; - /* we append a single byte to allow for the trailing byte to be appended - at the end of this function outside the while() loop */ - allocsize = (appendlen + stringlen)*2; - newstr=realloc(target, allocsize + 1); - if(NULL ==newstr) { - free(target); - return NULL; - } - target=newstr; - } - memcpy(&target[stringlen], appendthis, appendlen); - stringlen += appendlen; - } - target[stringlen]= '\0'; - return target; -} diff --git a/src/vc6curlsrc.dsp b/src/vc6curlsrc.dsp deleted file mode 100644 index 642cd5d..0000000 --- a/src/vc6curlsrc.dsp +++ /dev/null @@ -1,258 +0,0 @@ -# Microsoft Developer Studio Project File - Name="curlsrc" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=curlsrc - Win32 using libcurl LIB Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "curlsrc.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "curlsrc.mak" CFG="curlsrc - Win32 using libcurl LIB Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "curlsrc - Win32 using libcurl DLL Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE "curlsrc - Win32 using libcurl DLL Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "curlsrc - Win32 using libcurl LIB Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE "curlsrc - Win32 using libcurl LIB Release" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "curlsrc - Win32 using libcurl DLL Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "DLL-Debug"
-# PROP BASE Intermediate_Dir "DLL-Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "DLL-Debug"
-# PROP Intermediate_Dir "DLL-Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_CONSOLE" /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_CONSOLE" /FD /GZ /c
-# ADD BASE RSC /l 0x409 /i "..\include" /d "_DEBUG"
-# ADD RSC /l 0x409 /i "..\include" /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 libcurld_imp.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"DLL-Debug/curl.exe" /pdbtype:sept /libpath:"..\lib\DLL-Debug"
-# ADD LINK32 libcurld_imp.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"DLL-Debug/curl.exe" /pdbtype:sept /libpath:"..\lib\DLL-Debug"
-
-!ELSEIF "$(CFG)" == "curlsrc - Win32 using libcurl DLL Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "DLL-Release"
-# PROP BASE Intermediate_Dir "DLL-Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "DLL-Release"
-# PROP Intermediate_Dir "DLL-Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_CONSOLE" /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_CONSOLE" /FD /c
-# ADD BASE RSC /l 0x409 /i "..\include" /d "NDEBUG"
-# ADD RSC /l 0x409 /i "..\include" /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 libcurl_imp.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"DLL-Release/curl.exe" /libpath:"..\lib\DLL-Release"
-# ADD LINK32 libcurl_imp.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"DLL-Release/curl.exe" /libpath:"..\lib\DLL-Release"
-
-!ELSEIF "$(CFG)" == "curlsrc - Win32 using libcurl LIB Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "LIB-Debug"
-# PROP BASE Intermediate_Dir "LIB-Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "LIB-Debug"
-# PROP Intermediate_Dir "LIB-Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /GZ /c
-# ADD BASE RSC /l 0x409 /i "..\include" /d "_DEBUG"
-# ADD RSC /l 0x409 /i "..\include" /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 libcurld.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"LIB-Debug/curl.exe" /pdbtype:sept /libpath:"..\lib\LIB-Debug"
-# ADD LINK32 libcurld.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"LIB-Debug/curl.exe" /pdbtype:sept /libpath:"..\lib\LIB-Debug"
-
-!ELSEIF "$(CFG)" == "curlsrc - Win32 using libcurl LIB Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "LIB-Release"
-# PROP BASE Intermediate_Dir "LIB-Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "LIB-Release"
-# PROP Intermediate_Dir "LIB-Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\lib" /I "..\include" /I "." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_CONSOLE" /D "CURL_STATICLIB" /FD /c
-# ADD BASE RSC /l 0x409 /i "..\include" /d "NDEBUG"
-# ADD RSC /l 0x409 /i "..\include" /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 libcurl.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"LIB-Release/curl.exe" /libpath:"..\lib\LIB-Release"
-# ADD LINK32 libcurl.lib kernel32.lib ws2_32.lib wldap32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"LIB-Release/curl.exe" /libpath:"..\lib\LIB-Release"
-
-!ENDIF
-
-# Begin Target
-
-# Name "curlsrc - Win32 using libcurl DLL Debug"
-# Name "curlsrc - Win32 using libcurl DLL Release"
-# Name "curlsrc - Win32 using libcurl LIB Debug"
-# Name "curlsrc - Win32 using libcurl LIB Release"
-# Begin Group "Source Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\curlutil.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\getpass.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\homedir.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\hugehelp.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\main.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\os-specific.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\nonblock.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\rawstr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\strtoofft.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\urlglob.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\writeenv.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\writeout.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=".\config-win32.h"
-# End Source File
-# Begin Source File
-
-SOURCE=.\curlutil.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\getpass.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\homedir.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\hugehelp.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\os-specific.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\setup.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\nonblock.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\rawstr.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\lib\strtoofft.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\urlglob.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\version.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\writeenv.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\writeout.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\curl.rc
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/src/vc6curlsrc.dsw b/src/vc6curlsrc.dsw deleted file mode 100644 index 6b2db6f..0000000 --- a/src/vc6curlsrc.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "curlsrc"=".\vc6curlsrc.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
|